我正在尝试使用 ansible 来管理如何将模板添加到我的 Zabbix 服务器上配置的主机。我正在寻找一种方法来添加模板而不覆盖已经存在的模板。
例如我有5台服务器,需要用以下模板配置它们:
- server0 需要模板 A、B、C、D
- server1 需要模板 A、B、C、E
- server2 需要模板 A、B、C、D、F
- server3 需要模板 A、B、C、G
- server4 需要模板 D
我将库存文件按模板组织起来,因为我的系统中模板的数量比服务器少得多。在示例中,它看起来像:
[template_a_b_c]
server0
server1
server2
server3
[template_d]
server0
server2
server4
等等。
通过这样的配置,我的 ansible“zabbix”角色针对每个模板都有任务。但是对于像 server2 这样的服务器,当任务template_d.yml
运行时,它将覆盖链接的模板tempalte_a_b_c.yml
。这是我试图避免的行为。
我意识到我可以重新配置我的 ansible 角色,使其按主机组织,并为每个主机分配一个任务,但我有数百个主机,并且数量还在不断增加,因此无法扩展。是 ansible 还没有出现,还是 ansible 中有一个zabbix_host
我可以利用的标志?
谢谢。
答案1
您可以根据主机的组成员身份构建模板列表并zabbix_host
仅执行一次。
存货:
[mygr1]
srv1
srv2
srv3
[mygr2]
srv2
剧本:
---
- hosts: mygr1:mygr2
gather_facts: no
vars:
template_map:
mygr1: [template_a, template_b]
mygr2: [template_c]
tasks:
- name: Generate template list
set_fact:
template_list: >
{{ group_names
| intersect(template_map.keys())
| map('extract',template_map)
| list
| sum(start=[]) }}
- debug:
msg: "{{ template_list }}"
结果:
ok: [srv1] => {
"msg": [
"template_a",
"template_b"
]
}
ok: [srv2] => {
"msg": [
"template_a",
"template_b",
"template_c"
]
}
ok: [srv3] => {
"msg": [
"template_a",
"template_b"
]
}
template_list
按以下顺序形成:获取当前主机所属组的名称,将其与来自的已知名称相交template_map
,提取剩余每个名称的模板列表,将结果转换为列表(来自映射生成器)并将结果列表列表展平为单个列表。