将对象添加到变量中的字典中

时间:2015-02-13 00:00:59

标签: ansible ansible-playbook

我想在像

这样的变量中将对象添加到列表中
system_user:
  - user1
system_users: "{{ system_users | union(system_user) }}"

失败并出现递归错误:

AnsibleError: recursive loop detected in template string

有什么方法可以解决这个问题吗?我想在group_vars/all/中为每个用户创建一个定义文件,然后在剧本中循环播放它们。我不想为每个新用户重新定义列表。

PS:有一种解决方法:使用用户名创建变量,例如system_user_otto20,但它根本不优雅。

1 个答案:

答案 0 :(得分:1)

有一个类似的已解决问题:https://github.com/ansible/ansible/issues/17906

我建议你不要在模板字符串中使用未定义的变量来定义它们。

作为另一种解决方法,您可以使用hash_behaviour = merge与以下定义:
group_vars / all.yml

system_users:
  user1:
  user2:

book1.yml

- hosts: localhost
  gather_facts: false
  vars:
    system_users:
      user3:
      user4:

  tasks:
    - debug: msg="{{ system_users | unique }}"

运行剧本:

$ ansible-playbook book1.yml 
 [WARNING]: Host file not found: /etc/ansible/hosts

 [WARNING]: provided hosts list is empty, only localhost is available


PLAY [localhost] ***************************************************************

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": [
        "user4", 
        "user2", 
        "user3", 
        "user1"
    ]
}

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0   

unique用于将字典转换为未排序列表。