我正在尝试使用ansible循环列表列表来安装一些软件包。但是{{item}}返回子列表中的每个元素而不是子列表本身。我有一个yaml文件来自外部ansible的清单列表,它看起来像这样:
int main(void) {
char input[80]={0};
char **dummy={0};
long *gradient = {0};
int iGradient=0;
int arraysize;
int i;
char* fmt = "%[^\n]%*c";
printf("how many numbers will be entered?");
scanf(fmt, input);
arraysize = strtol(input, dummy, 10);
gradient = calloc(arraysize, sizeof(long));
if(gradient)
{
for(i=0;i<arraysize;i++)
{
gradient[i] = get_int();
}
iGradient = get_gradient(gradient, arraysize);
//free gradient when done getting result
free(gradient);
}
return 0;
}
int get_gradient(int *a, int num)
{
int grad = 0, i;
//do something here to compute gradient
return grad;
}
long get_int(void)
{
char input[80]={0};
char **dummy={0};
char* fmt = "%[^\n]%*c";
printf("Enter integer number and hit return:\n");
scanf(fmt, input);
return strtol(input, dummy, 10);
}
我的任务如下:
---
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 }}"
当我尝试:
fatal: [localhost]: FAILED! => {"failed": true, "msg": "ERROR! int object has no element 0"}
它打印每个元素(模块,版本,额外等),而不仅仅是子列表(这是我期望的)
答案 0 :(得分:11)
解决此问题的另一种方法是使用复杂项而不是列表列表。像这样构建你的变量:
- modules:
- {name: module1, version: version1, info: extra1}
- {name: module2, version: version2, info: extra2}
- {name: module3, version: version3, info: extra3}
然后您仍然可以使用with_items
,如下所示:
- name: Printing Stuffs...
shell: echo This is "{{ item.name }}", "{{ item.version }}" and "{{ item.info }}"
with_items: "{{modules}}"
答案 1 :(得分:6)
不幸的是,这是预期的行为。请参阅此discussion on with_tems and nested lists
答案 2 :(得分:4)
@helloV已经提供了使用with_items
无法做到的答案,我将向您展示如何使用with_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
现在,您将获得以下stdout_lines
:
This is module1, version1 and extra1
This is module2, version2 and extra2
This is module3, version3 and extra3
答案 3 :(得分:4)
将with_items: "{{ modules }}"
替换为:
在Ansible 2.5及更高版本中(请参阅with_list
porting guide):
loop: "{{ modules }}"
在Ansible 2.0及更高版本中:
with_list: "{{ modules }}"
在任何Ansible 2.0之前的版本中:
with_items:
- "{{ modules }}"
这样,您将拥有三个级别的嵌套列表,默认行为仅使其中两个嵌套。