在ansible playbook中创建主机组的词典列表

时间:2016-04-17 20:41:07

标签: dictionary ansible

我想动态创建一个如下所示的词典列表:

[ {'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 }}"

无论如何,如果实现相同的方法不那么繁琐,请指教!

1 个答案:

答案 0 :(得分:4)

您可以使用默认过滤器:

set_fact:
  zk_hosts: "{{ zk_hosts|default([]) + [ {'host': item.1, 'id': item.0} ] }}"
with_indexed_items: "{{ groups.some-hosts }}"