如何管理将 zabbix 模板添加到已配置的主机而不覆盖现有内容?

如何管理将 zabbix 模板添加到已配置的主机而不覆盖现有内容?

我正在尝试使用 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,提取剩余每个名称的模板列表,将结果转换为列表(来自映射生成器)并将结果列表列表展平为单个列表。

相关内容