我想动态创建一个如下所示的词典列表:
[ {'host': 'hostname1', 'id': 1}, {'host': 'hostname2', 'id': 2}, ]
并将其分配给我的剧本中的变量。
我正在使用的角色需要此变量。
我的尝试如下:
- hosts:
- some-hosts
vars:
zk_hosts: []
tasks:
- name: create my var
set_fact:
zk_hosts: "{{ zk_hosts + [ {'host': item.1, 'id': item.0} ] }}"
with_indexed_items: "{{ groups.some-hosts }}"
然而,当我运行剧本时,我有这个警告:
[WARNING]: While constructing a mapping from stack.yml, line 16, column 3, found a duplicate dict key (vars). Using last defined value only.
并且在这场比赛中出现错误:
fatal: [192.168.0.21]: FAILED! => {"failed": true, "msg": "ERROR! 'zk_hosts' is undefined"}
如果在尝试设置事实之前我没有定义zk_hosts
,我会收到一个错误,即变量未定义。
我该如何解决?
修改
轻松修复,我刚刚在同一个任务中定义了zk_hosts
...
tasks:
- name: create my var
vars:
zk_hosts: []
set_fact:
zk_hosts: "{{ zk_hosts + [ {'host': item.1, 'id': item.0} ] }}"
with_indexed_items: "{{ groups.some-hosts }}"
无论如何,如果实现相同的方法不那么繁琐,请指教!
答案 0 :(得分:4)
您可以使用默认过滤器:
set_fact:
zk_hosts: "{{ zk_hosts|default([]) + [ {'host': item.1, 'id': item.0} ] }}"
with_indexed_items: "{{ groups.some-hosts }}"