Yaml ansible with_项目列表正在变平

Yaml ansible with_项目列表正在变平,yaml,ansible,Yaml,Ansible,我正在尝试使用ansible在列表上循环以安装一些软件包。但是{item}}返回子列表中的每个元素,而不是子列表本身。我有一个yaml文件,它来自ansible外部的清单列表,看起来如下: --- modules: - ['module','version','extra'] - ['module2','version','extra'] - ['module3','version','extra'] task: - include_vars: /path/to/external/fi

我正在尝试使用ansible在列表上循环以安装一些软件包。但是{item}}返回子列表中的每个元素,而不是子列表本身。我有一个yaml文件,它来自ansible外部的清单列表,看起来如下:

---
modules:
 - ['module','version','extra']
 - ['module2','version','extra']
 - ['module3','version','extra']
task:
 - include_vars: /path/to/external/file.yml
 - name: install modules
   yum: name={{item.0}} state=installed
   with_items: "{{ modules }}"
- modules:
  - {name: module1, version: version1, info: extra1}
  - {name: module2, version: version2, info: extra2}
  - {name: module3, version: version3, info: extra3}
- name: Printing Stuffs...
  shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}"
  with_items: "{{modules}}"
我的任务如下所示:

---
modules:
 - ['module','version','extra']
 - ['module2','version','extra']
 - ['module3','version','extra']
task:
 - include_vars: /path/to/external/file.yml
 - name: install modules
   yum: name={{item.0}} state=installed
   with_items: "{{ modules }}"
- modules:
  - {name: module1, version: version1, info: extra1}
  - {name: module2, version: version2, info: extra2}
  - {name: module3, version: version3, info: extra3}
- name: Printing Stuffs...
  shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}"
  with_items: "{{modules}}"
当我跑步时,我得到:

fatal: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! int object has no element 0"}
当我尝试时:

- debug: msg="{{item}}"
  with_items: "{{module}}"

它打印每个元素(模块、版本、额外元素等等),而不仅仅是子列表(这是我所期望的)

不幸的是,这是预期的行为。请看这个

@helloV已经提供了答案,您不能使用
和_items
来实现这一点,我将向您展示如何使用
和_nested
的当前数据结构来获得所需的输出

以下是一个示例剧本:

---
- hosts:
    - localhost
  vars:
    - modules:
      - ['module1','version1','extra1']
      - ['module2','version2','extra2']
      - ['module3','version3','extra3']

  tasks:
    - name: Printing Stuffs...
      shell: echo This is "{{ item.0 }}", "{{ item.1 }}" and "{{ item.2 }}"
      with_nested:
       - modules
现在,您将获得以下内容作为标准行:

This is module1, version1 and extra1
This is module2, version2 and extra2
This is module3, version3 and extra3

解决此问题的另一种方法是使用复杂项而不是列表。按如下方式构造变量:

---
modules:
 - ['module','version','extra']
 - ['module2','version','extra']
 - ['module3','version','extra']
task:
 - include_vars: /path/to/external/file.yml
 - name: install modules
   yum: name={{item.0}} state=installed
   with_items: "{{ modules }}"
- modules:
  - {name: module1, version: version1, info: extra1}
  - {name: module2, version: version2, info: extra2}
  - {name: module3, version: version3, info: extra3}
- name: Printing Stuffs...
  shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}"
  with_items: "{{modules}}"
然后您仍然可以将
与\u项一起使用,如下所示:

---
modules:
 - ['module','version','extra']
 - ['module2','version','extra']
 - ['module3','version','extra']
task:
 - include_vars: /path/to/external/file.yml
 - name: install modules
   yum: name={{item.0}} state=installed
   with_items: "{{ modules }}"
- modules:
  - {name: module1, version: version1, info: extra1}
  - {name: module2, version: version2, info: extra2}
  - {name: module3, version: version3, info: extra3}
- name: Printing Stuffs...
  shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}"
  with_items: "{{modules}}"
替换为_项:“{{modules}}”
替换为:

  • 在Ansible 2.5及更高版本中(参考):

  • 在Ansible 2.0及更高版本中:

    with_list: "{{ modules }}"
    
  • 在Ansible 2.0之前的任何版本中:

    with_items:
      - "{{ modules }}"
    
    这样,您将有三个级别的嵌套列表,而默认行为只会展平其中两个


我发誓我在迭代各种选项时尝试过这一点。我又试了一次,它完全如我所希望的那样工作。所以我跳了起来,它仍然不工作。我的数据结构目前只有一行:cpann_模块:-['Algorithm::Diff','0']错误是:failed:[alpha.bluehost.com]=>(item=[u'A',u'l',u'g',u'o',u'r',u't',u'h',u'm',u'D',u'i',u'f',u'f'])=>{更改为假,“failed”:真,“item:[“A”,“l”,“g”,“o”,“r”,“i”,“t”,“h”,“m”,“D”,“i:”,“f”,“f”],“msg”:“没有包匹配…[错误截断]您可以看到它试图迭代第一行中的每个字符,这很愚蠢。@Neybar根据问题示例,它对我有效,正如您在我的答案中所看到的。.您可以将您当前的示例添加到问题中,以便我可以检查。.这有助于我的Ansible 2.2.1案例。在列表中遇到类似问题,其中
{{item.0}
被错误地扩展为“.”或“”,并使用每个列表项的字典修复了此问题。