问:“每个主机都必须有 4 个“类别”:环境、功能、集群和应用程序。我怎样才能在不不断重复条目的情况下实现这一点?”
答:可以在 [*:vars] 部分中声明默认选项并使用主机的特定选项覆盖它。见How variables are merged。例如库存
$ cat hosts
[PRO_OSB]
test_01 my_cluster='cluster_A'
test_02
[PRO_WL]
test_03 my_cluster='cluster_A'
test_04
[PRO:children]
PRO_OSB
PRO_WL
[PRO:vars]
my_environment='default_env'
my_function='default_fnc
my_cluster='default_cluster'
my_app='default_app'
与剧本
- hosts: PRO
gather_facts: false
tasks:
- debug:
msg: "{{ inventory_hostname }}
{{ my_environment }}
{{ my_function }}
{{ my_cluster }}
{{ my_app }}"
给出(test_01 和 test_03 的 my_cluster 变量被主机值覆盖)
"msg": "test_01 default_env 'default_fnc cluster_A default_app"
"msg": "test_02 default_env 'default_fnc default_cluster default_app"
"msg": "test_04 default_env 'default_fnc default_cluster default_app"
"msg": "test_03 default_env 'default_fnc cluster_A default_app"
问:“运行 playbooks 指定更多内容,即关注环境、其功能、主机集群和应用程序。”
可以使用模块add_host 创建动态组并根据需要选择主机。例如在第一个播放中创建新组cluster_A并在下一个播放中使用它
- hosts: all
tasks:
- add_host:
name: "{{ item }}"
group: cluster_A
loop: "{{ hostvars|
dict2items|
json_query('[?value.my_cluster == `cluster_A`].key') }}"
delegate_to: localhost
run_once: true
- hosts: cluster_A
tasks:
- debug:
var: inventory_hostname
给予
ok: [test_01] => {
"inventory_hostname": "test_01"
}
ok: [test_03] => {
"inventory_hostname": "test_03"
}