You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Ansible为Zabbix已配置主机添加模板且不覆盖原有模板

用Ansible给Zabbix主机增量添加模板(不覆盖现有)

嘿,刚好我前阵子也碰到过一模一样的需求——给不同Zabbix主机加专属模板,但绝对不能覆盖已经配置好的现有模板。折腾了一阵,终于搞定了,分享给你具体的实现方法:

核心思路

本质就是不要直接替换模板列表,而是先拉取当前主机已有的模板配置,把它和你要新增的基础模板、专属模板合并去重,最后把完整的模板列表同步回Zabbix。这样既保留了旧模板,又加上了新的。


步骤1:配置Inventory和变量

先把每个主机的专属模板定义在清单里,通用的基础模板放在组变量里(毕竟大部分主机都要A/B/C),特殊的server4单独处理:

Inventory示例(比如hosts文件)

[zabbix_hosts]
server0 zabbix_extra_templates=["Template D"]
server1 zabbix_extra_templates=["Template E"]
server2 zabbix_extra_templates=["Template D", "Template F"]
server3 zabbix_extra_templates=["Template G"]
server4 zabbix_extra_templates=["Template D"] base_templates=[]

组变量文件(group_vars/zabbix_hosts.yml)

把通用配置放在这里,不用每个主机重复写:

# 大部分主机共用的基础模板
base_templates: ["Template A", "Template B", "Template C"]
# Zabbix服务器的连接信息,改成你自己的
zabbix_server_url: "http://your-zabbix-server/zabbix"
zabbix_login_user: "Admin"
zabbix_login_password: "your-zabbix-password"

步骤2:编写Ansible Playbook

这个Playbook会自动完成「拉取现有模板→合并去重→同步回Zabbix」的流程:

- name: 给Zabbix主机增量添加模板(不覆盖现有)
  hosts: zabbix_hosts
  gather_facts: no

  tasks:
    - name: 获取当前主机已配置的Zabbix模板
      zabbix_host_info:
        server_url: "{{ zabbix_server_url }}"
        login_user: "{{ zabbix_login_user }}"
        login_password: "{{ zabbix_login_password }}"
        host_name: "{{ inventory_hostname }}"
      register: current_host_data

    - name: 提取现有模板的名称列表
      set_fact:
        current_templates: >-
          {{ current_host_data.hosts[0].templates | default([]) | map(attribute='name') | list }}

    - name: 合并基础模板、现有模板和新增模板(自动去重)
      set_fact:
        final_templates: >-
          {{ (base_templates | default([])) + current_templates + zabbix_extra_templates | unique }}

    - name: 更新Zabbix主机的模板配置
      zabbix_host:
        server_url: "{{ zabbix_server_url }}"
        login_user: "{{ zabbix_login_user }}"
        login_password: "{{ zabbix_login_password }}"
        host_name: "{{ inventory_hostname }}"
        templates: "{{ final_templates }}"
        state: present

关键细节要注意

  • 模板名称必须完全匹配:Zabbix对模板名称大小写、空格都敏感,一定要和你Zabbix里的模板名完全一致,不然会识别不到。
  • 新主机也兼容:如果是第一次添加的新主机,current_templates会是空列表,合并后就是基础模板+专属模板,刚好符合你的需求。
  • server4的特殊处理:通过在Inventory里给server4单独设置base_templates=[],覆盖了组变量的基础模板,最终只会添加Template D,完美适配你的需求。
  • 自动去重:用| unique过滤掉重复的模板,避免同一个模板被多次添加(虽然Zabbix也会自动忽略,但这样更严谨)。

可选小优化

如果你的模板名称经常需要调整,或者怕打错,可以把模板名定义成变量:

# 在group_vars里添加
template_a: "Template A"
template_b: "Template B"
template_c: "Template C"
template_d: "Template D"
# ... 其他模板

然后在Inventory和Playbook里引用这些变量,比如zabbix_extra_templates=["{{ template_d }}"],后续改模板名只需要改一处就行,更省心。

内容的提问来源于stack exchange,提问作者battibatch

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:41:44