ansible with_items列表列表正在变平

时间:2016-02-26 21:49:02

标签: yaml ansible

我正在尝试使用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"}

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

4 个答案:

答案 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 }}"
    

    这样,您将拥有三个级别的嵌套列表,默认行为仅使其中两个嵌套。