我正在嘗試使用 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 還沒有出現嗎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
,提取每個剩餘名稱的範本列表,將結果轉換為列表(來自地圖產生器)並將列表的結果列表扁平化為單一列表。