我想在像
这样的变量中将对象添加到列表中system_user:
- user1
system_users: "{{ system_users | union(system_user) }}"
失败并出现递归错误:
AnsibleError: recursive loop detected in template string
有什么方法可以解决这个问题吗?我想在group_vars/all/
中为每个用户创建一个定义文件,然后在剧本中循环播放它们。我不想为每个新用户重新定义列表。
PS:有一种解决方法:使用用户名创建变量,例如system_user_otto20
,但它根本不优雅。
答案 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用于将字典转换为未排序列表。