我想定义一个字典变量,各个主机组可以将自己的密钥添加到其中在group_vars中(不使用set_fact
)。例如。像这样的东西:
group_vars\ftp_servers.yml:
important_ports:
ftp: 21
group_vars\web_servers.yml:
important_ports:
http: 80
这样,当在具有这两个角色的服务器上运行时,字典就会组合在一起,即important_ports
=
{
ftp: 21,
http: 80
}
这正是hash_behaviour = merge
确实如此,但它是已弃用并将在 Ansible 2.13 中删除 https://github.com/ansible/ansible/pull/63300。如果没有它,我如何实现同样的目标?
我见过的唯一推荐的解决方案是使用combine
filter:
set_fact:
important_ports: "{{ important_ports | combine({ http: 80 }) }}"
这适用于set_fact
任务,但在 group_vars 中失败并显示“在模板字符串中检测到递归循环:{{ important_ports |结合({http:80})}}"
我什至尝试将变量初始化为空字典(important_ports: {}
) in 组变量/全部,它应该在其他 group_vars 之前进行评估,但它仍然给出相同的错误。
针对这个特定问题的(不太干净......)可能的解决方案。这是基于您在特定组端口的 var 名称中使用组名称的约定。
请注意,如果您使用不同的值重新定义相同的端口名称,则最新加载的组将获胜。
鉴于以下一体式库存inventories/mergegroups/hosts.yml
---
all:
vars:
ansible_connection: local
important_ports: >-
{%- set result={} -%}
{%- for group in groups -%}
{{ result.update(lookup('vars', group + '_important_ports', default={})) }}
{%- endfor -%}
{{ result }}
ftp_servers:
vars:
ftp_servers_important_ports:
ftp: 21
hosts:
a:
b:
web_servers:
vars:
web_servers_important_ports:
http: 80
hosts:
a:
other_group:
vars:
other_group_important_ports:
mysql: 3306
hosts:
a:
b:
no_port_group:
# as you can see no port definition here.
hosts:
a:
b:
c:
我们得到 3 个不同主机的以下结果:
$ ansible -i inventories/mergegroups/ a -m debug -a msg="{{ important_ports }}"
a | SUCCESS => {
"msg": {
"ftp": 21,
"http": 80,
"mysql": 3306
}
}
$ ansible -i inventories/mergegroups/ b -m debug -a msg="{{ important_ports }}"
b | SUCCESS => {
"msg": {
"ftp": 21,
"mysql": 3306
}
}
$ ansible -i inventories/mergegroups/ c -m debug -a msg="{{ important_ports }}"
c | SUCCESS => {
"msg": {}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)