Ich versuche, mit Ansible zu verwalten, wie Vorlagen zu den konfigurierten Hosts auf meinem Zabbix-Server hinzugefügt werden. Ich suche nach einer Möglichkeit, die Vorlagen hinzuzufügen, ohne die bereits vorhandenen Vorlagen zu überschreiben.
Ich habe beispielsweise 5 Server. Ich muss sie mit den folgenden Vorlagen konfigurieren:
- Server0 benötigt Vorlage A, B, C, D
- Server1 benötigt Vorlage A, B, C, E
- Server2 benötigt Vorlage A, B, C, D, F
- Server3 benötigt Vorlage A, B, C, G
- server4 benötigt Template D
Ich habe die Inventardatei nach Vorlagen organisiert, da in meinem System weit weniger Vorlagen als Server vorhanden sind. Im Beispiel würde das so aussehen:
[template_a_b_c]
server0
server1
server2
server3
[template_d]
server0
server2
server4
usw.
Mit einer solchen Konfiguration hat meine Ansible-Rolle „zabbix“ Aufgaben für jede Vorlage. Aber bei Servern wie Server2 template_d.yml
überschreibt die Aufgabe beim Ausführen die tempalte_a_b_c.yml
verknüpften Vorlagen. Dies ist das Verhalten, das ich vermeiden möchte.
Mir ist klar, dass ich meine Ansible-Rolle so umkonfigurieren könnte, dass sie nach Host organisiert ist und für jeden eine Aufgabe hat, aber ich habe Hunderte von Hosts und es werden immer mehr, also ist das nicht skalierbar. Ist Ansible einfach noch nicht so weit oder gibt es ein Flag in Ansible, zabbix_host
das ich nutzen könnte?
Danke.
Antwort1
Sie können eine Vorlagenliste basierend auf der Gruppenmitgliedschaft der Hosts erstellen und diese zabbix_host
nur einmal ausführen.
Inventar:
[mygr1]
srv1
srv2
srv3
[mygr2]
srv2
Spielbuch:
---
- 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 }}"
Ergebnis:
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
wird in dieser Reihenfolge gebildet: Nehmen Sie die Namen der Gruppen, deren Mitglied der aktuelle Host ist, schneiden Sie sie mit bekannten Namen aus template_map
, extrahieren Sie eine Liste der Vorlagen für jeden verbleibenden Namen, konvertieren Sie das Ergebnis in eine Liste (vom Kartengenerator) und reduzieren Sie die resultierende Liste der Listen auf eine einzige Liste.