Ansible:迭代字典列表 - 循环与 with_items [英] Ansible: iterate over a list of dictionaries - loop vs. with_items

查看:73
本文介绍了Ansible:迭代字典列表 - 循环与 with_items的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

在尝试遍历字典列表时,我在使用循环和 with_items 时得到不同的结果.

I'm getting different results when using loop vs with_items when trying to iterate over a list of dictionaries.

我试过使用 loop|dict2items(结构不是字典,& 它告诉我很多.呵呵)并使用 flatten 过滤器循环.

I've tried using loop|dict2items (the structure isn't a dictionary, & it tells me as much. heh) and loop with the flatten filter.

以下是字典列表:

    "msg": [
        {
            "id": "id1", 
            "ip": "ip1", 
            "name": "name1"
        }, 
        {
            "id": "id2", 
            "ip": "ip2", 
            "name": "name2"
        }, 
        {
            "id": "id3", 
            "ip": "ip3", 
            "name": "name3"
        }, 
        {
            "id": "id4", 
            "ip": "ip4", 
            "name": "name4"
        }
    ]
}

这是剧本中的任务:

 - name: Add privateIp windows_instances to inventory
        add_host:
          name: "{{ item.ip }}"
          aws_name: "{{ item.name }}"
          groups: windows_instances
          aws_instanceid: "{{ item.id }}"
          ansible_user: "{{ windows_user }}"
          ansible_password: "{{ windows_password }}"
          ansible_port: 5985
          ansible_connection: winrm
          ansible_winrm_server_cert_validation: ignore
        loop:
          - "{{ list1 | flatten(levels=1) }}"

尝试运行上述代码时,出现列表对象没有属性"错误.我尝试了不同的展平级别都无济于事.

When attempting to run the above code, I get the "list object has no attribute" error. I've tried different flatten levels to no avail.

然而……

如果我简单地将上面的循环替换为:

If I simply replace the loop above with:

with_items:
  - "{{ list1 }}"

一切正常.我在 with_items > 循环翻译中遗漏了一些东西...

Everything works perfectly. I'm missing something in the with_items > loop translation here...

推荐答案

不要在列表前放置 -.

这里,你有一个字典列表,所以你不需要扁平化.

And here, you have a list of dicts, so you don't need to flatten neither.

这个剧本:

- hosts: localhost
  gather_facts: no

  vars:
    demo_list:
      - ip: 1.2.3.4
        id: 1
        name: demo1
      - ip: 2.2.3.4
        id: 2
        name: demo2
      - ip: 3.2.3.4
        id: 3
        name: demo3

  tasks:

    - name: the list
      debug:
        msg: "{{ demo_list }}"

    - name: unflattened list
      debug:
        msg: "{{ item.id }} {{ item.ip }} {{ item.name }}"
      loop:
        "{{ demo_list }}"

    - name: flattened list == unflattened list in this case
      debug:
        msg: "{{ item.id }} {{ item.ip }} {{ item.name }}"
      loop:
        "{{ demo_list | flatten(levels=1) }}"

给出这个结果:

PLAY [localhost] ***************************************************************************************

TASK [the list] ****************************************************************************************
ok: [localhost] => {
    "msg": [
        {
            "id": 1, 
            "ip": "1.2.3.4", 
            "name": "demo1"
        }, 
        {
            "id": 2, 
            "ip": "2.2.3.4", 
            "name": "demo2"
        }, 
        {
            "id": 3, 
            "ip": "3.2.3.4", 
            "name": "demo3"
        }
    ]
}

TASK [unflattened list] ********************************************************************************
ok: [localhost] => (item=None) => {
    "msg": "1 1.2.3.4 demo1"
}
ok: [localhost] => (item=None) => {
    "msg": "2 2.2.3.4 demo2"
}
ok: [localhost] => (item=None) => {
    "msg": "3 3.2.3.4 demo3"
}

TASK [flattened list == unflattened list in this case] *************************************************
ok: [localhost] => (item=None) => {
    "msg": "1 1.2.3.4 demo1"
}
ok: [localhost] => (item=None) => {
    "msg": "2 2.2.3.4 demo2"
}
ok: [localhost] => (item=None) => {
    "msg": "3 3.2.3.4 demo3"
}

PLAY RECAP *********************************************************************************************
localhost                  : ok=3    changed=0    unreachable=0    failed=0

这篇关于Ansible:迭代字典列表 - 循环与 with_items的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆