在 ansible playbook 中创建来自主机组的字典列表

Vin*_*Pii 4 dictionary ansible

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

[ {'host': 'hostname1', 'id': 1}, {'host': 'hostname2', 'id': 2}, ]
Run Code Online (Sandbox Code Playgroud)

并将其分配给我的剧本中的一个变量。

我正在使用的角色需要此变量。

我的尝试如下:

- 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 }}"
Run Code Online (Sandbox Code Playgroud)

但是,当我运行剧本时,我收到了这个警告:

 [WARNING]: While constructing a mapping from stack.yml, line 16, column 3, found a duplicate dict key (vars).  Using last defined value only.
Run Code Online (Sandbox Code Playgroud)

并且在这场比赛中出现错误:

fatal: [192.168.0.21]: FAILED! => {"failed": true, "msg": "ERROR! 'zk_hosts' is undefined"}
Run Code Online (Sandbox Code Playgroud)

如果我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 }}"
Run Code Online (Sandbox Code Playgroud)

无论如何,如果有一个不那么麻烦的方法来实现相同的,请指教!

小智 6

您可以使用默认过滤器:

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