Ansible 可归因错误:';列表';对象没有属性';从'开始;

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

我正在运行ansible并试图使此任务正常工作,但由于以下错误而失败:

任务执行期间发生异常。看到全部 回溯,使用-vvv。错误为:AttributeError:“list”对象已 没有属性“startswith”致命:[test-1]:失败!=> {“failed”:true,“msg”:“模块执行期间发生意外故障。”, “stdout”:“}msg:模块执行期间发生意外故障

代码是:

  - 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