Yaml ansible with_项目列表正在变平
我正在尝试使用ansible在列表上循环以安装一些软件包。但是{item}}返回子列表中的每个元素,而不是子列表本身。我有一个yaml文件,它来自ansible外部的清单列表,看起来如下: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
---
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}
被错误地扩展为“.”或“”,并使用每个列表项的字典修复了此问题。