如何通过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
相关产品推荐
相关产品推荐

