Ansible 可归因错误:';列表';对象没有属性';从'开始;
我正在运行ansible并试图使此任务正常工作,但由于以下错误而失败: 任务执行期间发生异常。看到全部 回溯,使用-vvv。错误为:AttributeError:“list”对象已 没有属性“startswith”致命:[test-1]:失败!=> {“failed”:true,“msg”:“模块执行期间发生意外故障。”, “stdout”:“}msg:模块执行期间发生意外故障 代码是:Ansible 可归因错误:';列表';对象没有属性';从'开始;,ansible,ansible-2.x,Ansible,Ansible 2.x,我正在运行ansible并试图使此任务正常工作,但由于以下错误而失败: 任务执行期间发生异常。看到全部 回溯,使用-vvv。错误为:AttributeError:“list”对象已 没有属性“startswith”致命:[test-1]:失败!=> {“failed”:true,“msg”:“模块执行期间发生意外故障。”, “stdout”:“}msg:模块执行期间发生意外故障 代码是: - name: Register env Type shell: facter configur
- name: Register env Type
shell: facter configured_setup
register: setup
- name: foo tasks
shell: {{some_script}} -t -a {{hosts}} -i {{inventory_hostname}}
register: test
when: setup.stdout == "something"
- name: fetch group_vars
fetch:
src:
- { "{{ item }}", when: setup.stdout == "something" }
dest: "{{group_vars}}"
flat: yes
with_items:
- "{{ test.stdout_lines[0] }}"
- "{{ test.stdout_lines[1] }}"
“获取组变量”是一项总是失败的任务,你知道这是如何工作的吗?
我试图做的是添加更多的源文件以从不同的设置程序获取。
所以我想在“src:”下面有更多的行,说-{filename,when setup.stdout==“something other”}
完全错误是:
任务执行期间发生异常。完整回溯是:
回溯(最近一次呼叫最后一次):
文件“/usr/lib/python2.7/site packages/ansible/executor/task_executor.py”,第96行,正在运行
项目结果=自我运行循环(项目)
文件“/usr/lib/python2.7/site packages/ansible/executor/task_executor.py”,第252行,在运行循环中
res=self.\u execute(变量=任务\u变量)
文件“/usr/lib/python2.7/site packages/ansible/executor/task_executor.py”,第446行,in_execute
结果=self.\u handler.run(任务\u变量=变量)
文件“/usr/lib/python2.7/site packages/ansible/plugins/action/fetch.py”,第62行,正在运行
源=自身。\远程\扩展\用户(源)
文件“/usr/lib/python2.7/site packages/ansible/plugins/action/init.py”,第460行,在远程用户中
如果不是path.startswith(“~”):#修复:Windows路径可以以“~开头,而不是仅以“~”开头~
AttributeError:“list”对象没有属性“StartWith”
致命:[test-1]:失败!=>{“FAILED”:true,“msg”:
“模块执行期间出现意外故障。”,“标准输出”:“}msg:
模块执行期间发生意外故障
获取的ansible,获取的是一个文件,而不是一个文件列表。虽然可以编写一个应用程序来处理从YAML文档加载的标量和序列,但这不是自动的,几乎肯定会反映在文档中
既然您已经有了一个更高级别的序列,只需扩展它
- name: Register env Type
shell: facter configured_setup
register: setup
- name: transparency tasks
shell: {{some_script}} -t -a {{hosts}} -i {{inventory_hostname}}
register: test
when: setup.stdout == "something"
- name: fetch group_vars
fetch:
src: { "{{ item }}", when: setup.stdout == "something" }
dest: "{{group_vars}}"
flat: yes
with_items:
- "{{ test.stdout_lines[0] }}"
- "{{ test.stdout_lines[1] }}"
- name: fetch group_vars2
fetch:
src: { filename, when setup.stdout =="something else" }
dest: "{{group_vars}}"
flat: yes
with_items:
- "{{ test.stdout_lines[0] }}"
- "{{ test.stdout_lines[1] }}"
通过使用YAML的锚定和合并
,您可能可以在一定程度上减少重复性:
- name: Register env Type
shell: facter configured_setup
register: setup
- name: transparency tasks
shell: {{some_script}} -t -a {{hosts}} -i {{inventory_hostname}}
register: test
when: setup.stdout == "something"
- &fetchtask
name: fetch group_vars
fetch: &fetchsrc
src: { "{{ item }}", when: setup.stdout == "something" }
dest: "{{group_vars}}"
flat: yes
with_items:
- "{{ test.stdout_lines[0] }}"
- "{{ test.stdout_lines[1] }}"
- <<: *fetchtask
name: fetch group_vars2
fetch:
<<: *fetchsrc
src: { filename, when setup.stdout =="something else" }
-名称:注册环境类型
shell:facter配置的\u设置
寄存器:设置
-名称:透明度任务
shell:{some_script}-t-a{{{hosts}-i{{inventory_hostname}
注册:测试
当:setup.stdout==“某物”
-获取任务(&F)
名称:获取组\u变量
fetch:&fetchsrc
src:{{item},when:setup.stdout==“something”}
dest:“{{group_vars}}”
公寓:是的
有以下项目:
-“{test.stdout_行[0]}”
-“{test.stdout_行[1]}”
-所以我最后做了这个(这是有效的):
我还注意到ansible中可能有一个与寄存器相关的bug。
使用“when”语句时,即使不满足条件,register语句也会生效:
- name: test tasks something enabled
shell: /tmp/{{populate_script}} -u -a {{hosts}} -r
register: variable
when: setup.stdout == "test" and something == True
- name: test tasks something disabled
shell: /tmp/{{populate_script}} -u -a {{hosts}}
register: variable
when: setup.stdout == "test" and something == False
只有其中一个条件会得到满足,如果第一个条件得到满足,那么第二个条件将覆盖“变量”当您开始像您那样进行实验时,请确保缩进一致。YAML使用两个位置作为映射,四个位置作为序列(从元素开始测量),但您在src
下添加的序列使用了三个位置。YAML可以将其分开,但如果不一致,您将很难自己管理。当时,您不应该在内使用Jinja2表达式分隔符。为什么您认为应该忽略寄存器
?条件决定是否执行操作运行。register
在任务级别声明。即使跳过的任务也会注册其输出,有效地覆盖以前的值。这就是它的工作方式。
- name: test tasks something enabled
shell: /tmp/{{populate_script}} -u -a {{hosts}} -r
register: variable
when: setup.stdout == "test" and something == True
- name: test tasks something disabled
shell: /tmp/{{populate_script}} -u -a {{hosts}}
register: variable
when: setup.stdout == "test" and something == False