首页 > 解决方案 > 又一次 Ansible 迭代

问题描述

我总是在 Ansible 的迭代中挣扎,这次也不例外。

无论如何,我有一个自定义事实作为字典列表返回my_list,我需要对其进行迭代以构建一个以key = 'name'

[localhost] => {
    "ansible_facts": {
        "my_list": [
            {
                "name": "asd-ASX030-vc-0",  
                "key_2": [
                    "A", 
                    "B"
                ]
            }, 
            {
                "name": "asd-ASX030-vc-1", 
                "key_2": [
                    "C", 
                    "D"
                ]
            }
        ]
    }
...
}

我可以运行单个列表索引。

  tasks:
    - set_fact: set_fact: {"{{item[1]['name'].split('-')[2:] | join('_')}}":"{{item[1]['key_2']}}"}
      loop: "{{ my_list }}"

我追求的是。

vc_0 = ["A", "B"]
vc_1 = ["C", "D"]

简单的:

set_fact: {"{{item['name'].split('-')[2:] | `enter code here`join('_')}}":"{{item['key_2']}}"}
loop: "{{ my_list }}"

不起作用: "The task includes an option with an undefined variable. The error was: 'list object' has no attribute 'key_2'

我想避免硬编码列表索引,我怎样才能动态地做到这一点?

标签: ansible

解决方案


这是您要查找的代码(无格式)吗?

shell> cat play.yml

- hosts: localhost
  vars:
    my_list:
      - name: "asd-ASX030-vc-0"
        key_2: ["A", "B"]
      - name: "asd-ASX030-vc-1"
        key_2: ["C", "D"]
  tasks:
    - debug:
        msg: "{{ item.name }} = {{ item.key_2 }}"
      loop: "{{ my_list }}"
shell> ansible-playbook play.yml | grep msg

msg: asd-ASX030-vc-0 = [u'A', u'B']
msg: asd-ASX030-vc-1 = [u'C', u'D']

推荐阅读