另一个Ansible迭代

时间:2018-08-17 11:05:29

标签: 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'

我想避免对列表索引进行硬编码,如何动态地做到这一点?

2 个答案:

答案 0 :(得分:2)

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

> cat play.yml

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

> ansible-playbook play.yml | grep msg

{{1}}

答案 1 :(得分:0)

我认为您使用Jinja表达式构造变量:

set_fact:
  var2:  {% for item in ansible_facts %}\
         {{ item.name }}\
         {% if not loop.last %},\
         {% endif %}\
         {% endfor %}