Skip to content
Menu
msandor honlapja
  • Bemutatkozás
msandor honlapja

Ansible: írjunk playbookot

Posted on 2023.06.29.2023.09.17.

A korábbi cikkemben megmutattam néhány ad-hoc példán keresztül, hogy mire is jó az ansible. Most elkészítjük az első playbookunkat.

Mi az a playbook?

Az ansible playbook gyakorlatilag egy recept, kitaláljuk, hogy mit szeretnénk csinálni a szervereinken, majd a szükséges ansible modulok segítségével megvalósítjuk. Mindezt pedig rendezett formában beleírjuk a playbookunkba. Így, ha első alkalommal lefuttatjuk, elvégzi a kívánt feladatokat, ismételt futtatásnál már nem fog csinálni semmit (feltéve, hogy egy tudatlan rendszergazda nem piszkál bele az általunk módosított fájlokba, ekkor az ansible ismét beállítja). Érdemes jelezni egy ansible által kezelt konfig fájlban, hogy ezt központilag menedzseljük, senki sem piszkáljon bele (emlékeztek, ennek a szövege van benne az ansible.cfg fájlban)!

Mi legyen a megoldandó feladat?

A nyugodt alvás érdekében minden szervert monitorozunk egy zabbix nevű szoftverrel. Ehhez erősen ajánlott a zabbix-agentet feltelepíteni. Legyen ez az első playbookunk feladata.

Egy gyors ismertető a playbook fájlokhoz, yaml formátumot használ az ansible, minden fájl három kötőjellel kezdődik, és minden behúzás két szóközzel van beljebb, mint a felette lévő sor.

Kezdésképp a vm1 szerverünkre telepítsük fel a zabbix-agentet. A kedvenc szövegszerkesztőnkkel mentsük el a playbook mappába az install-zabbix-agent.yml fájlt az alábbi tartalommal:

---
- hosts: all
  become: true
  tasks:
  - name: Zabbix Agent telepítése
    yum:
      name: zabbix-agent
      state: latest
      update_cache: yes

Látjátok, nem is bonyolult a formátuma. Gyors magyarázat:

  1. sor: a kötelező 3 kötőjel
  2. sor: mely hosztokon futhat, all=mindenhol
  3. sor: rootként fusson (ezért nem kell a -b kapcsoló)
  4. sor: jöhetnek a taskok
  5. sor: adjunk nevet a gyereknek, ezt fogja kiírni, amikor futtatjuk
  6. sor: a modul neve, a vm1 szerveren futó CentOS 7 yum-ot használ a csomagok kezelésére
  7. sor: a feltelepítendő csomag neve
  8. sor: a legfrissebb csomagra van szükségünk
  9. sor: előbb frissítse a csomaglistát (törli a cache-t)

Futtassuk az első playbookunkat!

A megszokott mappában állunk, ahol a Vagrantfile is van, adjuk ki ezt a parancsot:

$ ansible-playbook playbook/install-zabbix-agent.yml -l vm1

PLAY [all] *****************************************************************************
TASK [Gathering Facts] *****************************************************************************
ok: [vm1]

TASK [Zabbix Agent telepítése] *****************************************************************************
changed: [vm1]

PLAY RECAP *****************************************************************************
vm1                        : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Mit látunk a képernyőn?

A megszokott ansible parancsunk kiegészült ansible-playbooká, utána jön a playbook fájl és a végén a kívánt szerver neve az -l kapcsoló után. Ahogy a korábbi cikkben is említettem, ez csak vagrant szerveren fog működni, „igazi” szervernél be kell kérni a jelszavunkat a -K kapcsolóval.

A [Gathering Facts] azt jelenti, hogy mielőtt bármit is csinálna, begyűjti az ansible a számára szükséges információkat a távoli szerverről. Ha ez ok, akkor sikerült neki.

A TASK [Zabbix Agent telepítése] pedig a mi első taskunk a playbookban (ezért fontos a helyes megnevezés), ha changed, akkor sikerült végrehajtania.

És a végére összefoglalja az információkat: gépenként egy sorban (csak a fontosabbakat említem):

  • ok=2: két sikeres végrehajtás volt (a gathering facts is beleszámít)
  • changed=1: egy task végzett módosítást a szerveren

Mi történik, ha újra lefuttatjuk?

$ ansible-playbook playbook/install-zabbix-agent.yml -l vm1

PLAY [servers] *****************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [vm1]

TASK [Zabbix Agent telepítése] *****************************************************************************
ok: [vm1]

PLAY RECAP *****************************************************************************
vm1                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Nem történt változás, hiszen már fel lett telepítve a zabbix-agent, ezt mutatja a changed=0 is.

Most vonjunk be egy másik szervert is, szándékosan nem Red Hat alapút:

$ ansible-playbook playbook/install-zabbix-agent.yml -l vm1,vm3

PLAY [all] *****************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [vm3]
ok: [vm1]

TASK [Zabbix Agent telepítése] *****************************************************************************
fatal: [vm3]: FAILED! => {"ansible_facts": {"pkg_mgr": "apt"}, "changed": false, "msg": ["Could not detect which major revision of yum is in use, which is required to determine module backe
nd.", "You should manually specify use_backend to tell the module whether to use the yum (yum3) or dnf (yum4) backend})"]}
ok: [vm1]

PLAY RECAP **********************************************************************************************************************************************************************************
vm1                        : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0    
vm3                        : ok=1    changed=0    unreachable=0    failed=1    skipped=0    rescued=0    ignored=0

Magyarázat:

  • a parancs végén a két szervert egy vesszővel választjuk el egymástól
  • meghiúsult a telepítés az ubuntus szerveren, mivel ő nem tud mit kezdeni a yummal, ezt jelzi a vm3 sorában a failed=1

Rendben, tegyük a playbookunkat ubuntu kompatibilissé, bővítsük a playbook/install-zabbix-agent.yml fájlunkat így:

---
- hosts: all
  become: true
  tasks:

  - name: Zabbix Agent telepítése [Red Hat family]
    yum:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "RedHat"

  - name: Zabbix Agent telepítése [Debian family]
    apt:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "Debian"

Mi változott?

  • a könnyebb azonosítás érdekében a megnevezést külön-külön módosítottam [Red Hat illetve Debian family]
  • bekerült a when a taskhoz, ami egy feltétel, a mi példánkban csak akkor fog lefutni, ha az ansible_os_family a kívánt eredményt adja vissza (ezt gyűjti ki az ansible facts, és a korábbi cikkben erről beszéltem, hogy még fontos lesz 🙂 )
  • ha újra lefuttatjuk a ansible-playbook playbook/install-zabbix-agent.yml -l vm1,vm3 parancsot, immár minden rendben lesz

Ez tök jó, de ez még most sem konfiguráció menedzsment…

Igaz, de nem lehet rögtön azzal kezdeni, kellenek az alapok. Ismét nyissuk meg a playbook/install-zabbix-agent.yml fájlunkat, és adjunk hozzá egy új taskot (most az első 20 sor nem fog változni):

---
- hosts: all
  become: true
  tasks:

  - name: Zabbix Agent telepítése [Red Hat family]
    yum:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "RedHat"

  - name: Zabbix Agent telepítése [Debian family]
    apt:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent konfigurálása [CentOS]
    lineinfile:
      path: '/etc/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server=192.168.5.250'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize=50'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort=10050'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP=0.0.0.0'}
    when:
    - ansible_distribution == "CentOS"

  - name: Zabbix Agent konfigurálása [Debian family]
    lineinfile:
      path: '/etc/zabbix/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server=192.168.5.250'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize=50'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort=10050'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP=0.0.0.0'}
    when:
    - ansible_os_family == "Debian"

Mivel bővült?

Normális esetben elég lenne egy Zabbix Agent konfigurálása nevű task is, de a CentOS 7 és az Ubuntu 22.02 máshová teszi a zabbix-agent konfig fájlját 🙁

Én két féle módszert ismerek a konfig fájlok módosítására. Az első a most bemutatott lineinfile modul. Ennek az előnye, hogy csak azok a sorok fognak módosulni, amit mi akarunk, a többi részhez nem nyúl az ansible. Hátránya, hogy pontosan kell definiálni a regexpeket… A másik a template alapú, erről majd legközelebb.

Pici magyarázat az új taskhoz:

  • a lineinfile a modul neve
  • a path a konfig fájl neve, teljes elérési úttal
  • a regexp ebben az esetben egy változó lesz, mivel több paramétert is fogunk módosítani
  • a backup: yes azt jelenti, hogy minden módosítás előtt elmenti a fájlt
  • a with_items egy ciklus fajta, ez kell akkor, ha több paramétert szeretnénk módosítani, mint most

Ok, lássuk a medvét, akarom mondani az ansible-playbook futását

$ ansible-playbook playbook/install-zabbix-agent.yml -l vm1,vm3

PLAY [all] *****************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [vm3]
ok: [vm1]

TASK [Zabbix Agent telepítése [Red Hat family]] *****************************************************************************
skipping: [vm3]
ok: [vm1]

TASK [Zabbix Agent telepítése [Debian family]] *****************************************************************************
skipping: [vm1]
ok: [vm3]

TASK [Zabbix Agent konfigurálása [CentOS]] *****************************************************************************
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm3'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'}) 
skipping: [vm3]
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm1'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'})

TASK [Zabbix Agent konfigurálása [Debian family]] *****************************************************************************
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm1'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'}) 
skipping: [vm1]
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm3'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'})

PLAY RECAP *****************************************************************************
vm1                        : ok=3    changed=1    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
vm3                        : ok=3    changed=1    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0

Szuper, az elvárt eredményt hozta, a playbookban meghatározott 5 változót megfelelően beállította.

El is felejtettem mondani, hogy mit is kívántunk a gyári konfigban megváltoztatni:

  • beállítjuk a zabbix szerver IP címét, a példában: 192.168.5.250
  • beállítjuk a szerver zabbix által ismert hoszt nevét, a példáinkban egy változó van erre használva (inventory_hostname_short), ami az inventory.yml-ból veszi az adatokat (vm1,vm2,vm3,vm4)
  • beállítjuk a logfile max méretét 50-re
  • beállítjuk az agenthez szükséges portot 10050-re (ez a gyári érték, de lehet olyan eset, hogy változtatnunk kell rajta)
  • és végül beállítjuk, hogy melyik interface-en fusson az agent (0.0.0.0, tehát mindegyiken)

Mi a hiba a playbookban?

Beállítja a paramétereket, de nem indította újra az agentet, így ez csak fél siker. A másik apró bibi, hogy ugyanazokat a változókat ismétli, ami nem kívánatos, erre is mutatok másik módszert.

Íme a módosított playbookunk, ami mindkét feladatot megoldja:

---
- hosts: all
  become: true
  vars:
    ZBXSERVER: '192.168.5.250'
    ZBXLOGFILESIZE: '50'
    ZBXAGENTPORT: '10050'
    ZBXLISTENIP: '0.0.0.0'
  tasks:

  - name: Zabbix Agent telepítése [Red Hat family]
    yum:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "RedHat"

  - name: Zabbix Agent telepítése [Debian family]
    apt:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent konfigurálása [CentOS]
    lineinfile:
      path: '/etc/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_distribution == "CentOS"

  - name: Zabbix Agent konfigurálása [Debian family]
    lineinfile:
      path: '/etc/zabbix/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_os_family == "Debian"

  handlers:
   - name: restart zabbix-agent
     service: name=zabbix-agent state=restarted

A két konfiguráló taskhoz bekerült a notify: - restart zabbix-agent, ami annyit tesz, hogy ha bármi változott a fájlban, csak akkor indítja újra az agentet.

És ehhez tartozik a handlers, ami szükség esetén elvégzi az újraindítást.

Illetve bekerült a változókat definiáló vars: sor, alatta vannak a közös változók. A taskoknál két kapcsos zárójel {{ }} közé kell tenni a változó neveket.

Ha most lefuttatjuk a playbookot, nem fog történni semmi, hiszen már korábban beállítottuk a konfigot.

A demonstráció kedvéért én visszamásoltam az eredeti fájlokat, hogy lássátok, mi történik:

$ ansible-playbook playbook/install-zabbix-agent.yml -l vm1,vm3

PLAY [all] *****************************************************************************

TASK [Gathering Facts] *****************************************************************************
ok: [vm3]
ok: [vm1]

TASK [Zabbix Agent telepítése [Red Hat family]] *****************************************************************************
skipping: [vm3]
ok: [vm1]

TASK [Zabbix Agent telepítése [Debian family]] *****************************************************************************
skipping: [vm1]
ok: [vm3]

TASK [Zabbix Agent konfigurálása [CentOS]] *****************************************************************************
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm3'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'}) 
skipping: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'}) 
skipping: [vm3]
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm1'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'})
changed: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'})

TASK [Zabbix Agent konfigurálása [Debian family]] *****************************************************************************
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm1'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'}) 
skipping: [vm1] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'}) 
skipping: [vm1]
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*Server\\s*=', 'line': 'Server=192.168.5.250'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*Hostname\\s*=', 'line': 'Hostname=vm3'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*LogFileSize\\s*=', 'line': 'LogFileSize=50'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenPort\\s*=', 'line': 'ListenPort=10050'})
changed: [vm3] => (item={'regexp': '^\\s*#?\\s*ListenIP\\s*=', 'line': 'ListenIP=0.0.0.0'})

RUNNING HANDLER [restart zabbix-agent] *****************************************************************************
changed: [vm1]
changed: [vm3]

PLAY RECAP *****************************************************************************
vm1                        : ok=4    changed=2    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0   
vm3                        : ok=4    changed=2    unreachable=0    failed=0    skipped=2    rescued=0    ignored=0

Kimaradt egy nem elhanyagolható rész a playbookból, mi van, ha eleve nem fut az agent? Vagy nincs beállítva az autostart? Adjuk hozzá a fájlunkhoz, ami így néz ki teljes terjedelmében:

---
- hosts: all
  become: true
  vars:
    ZBXSERVER: '192.168.5.250'
    ZBXLOGFILESIZE: '50'
    ZBXAGENTPORT: '10050'
    ZBXLISTENIP: '0.0.0.0'
  tasks:

  - name: Zabbix Agent telepítése [Red Hat family]
    yum:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "RedHat"

  - name: Zabbix Agent telepítése [Debian family]
    apt:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent konfigurálása [CentOS]
    lineinfile:
      path: '/etc/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_distribution == "CentOS"

  - name: Zabbix Agent konfigurálása [Debian family]
    lineinfile:
      path: '/etc/zabbix/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent engedélyezése és elindítása
    service:
      name: zabbix-agent
      enabled: yes
      state: started

  handlers:
   - name: restart zabbix-agent
     service: name=zabbix-agent state=restarted

Az új service modul felel a zabbix-agent elindításáért (ha még nem futna), és beállítja az autostartot.

Már majdnem tökéletes, de mi van, ha egy másik playbooknak is szüksége lenne ebben a fájlban definiált változókra?

Akkor oda is fel kell venni, ami erősen kerülendő, mivel, ha valaha változtatni akarunk rajta, akkor nem fogunk emlékezni, hogy mely fájlokban szerepeltek.

Íme a végleges verzió, eskü, ebből ma nem lesz több:

---
- hosts: all
  become: true
  tasks:

  - name: Zabbix Agent telepítése [Red Hat family]
    yum:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "RedHat"

  - name: Zabbix Agent telepítése [Debian family]
    apt:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent konfigurálása [CentOS]
    lineinfile:
      path: '/etc/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_distribution == "CentOS"

  - name: Zabbix Agent konfigurálása [Debian family]
    lineinfile:
      path: '/etc/zabbix/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent engedélyezése és elindítása
    service:
      name: zabbix-agent
      enabled: yes
      state: started

  handlers:
   - name: restart zabbix-agent
     service: name=zabbix-agent state=restarted

Kikerültek a változók, de hová lettek?

Hozzunk létre egy mappát az inventory alá: group_vars néven, és helyezzünk el benne egy új fájlt: all.yml az alábbi tartalommal:

ZBXSERVER: '192.168.5.250'
ZBXLOGFILESIZE: '50'
ZBXAGENTPORT: '10050'
ZBXLISTENIP: '0.0.0.0'

És tényleg készen vagyunk!

Az inventory/group_vars/all.yml fájlba tehetjük az összes közös változót, mindegy, hogy melyik playbookot futtatjuk, onnan fogja kiolvasni. Persze az ansible nem ilyen egyszerű, a változóknak van egy tucat szintje, de mára elég volt ennyi infó is, lehet gyakorolni az eddig olvasottakat 🙂

Frissítés… Egy apróság kimaradt, ezért a playbook nem fut rá a vm2-es szerverre.

Íme a javított playbook:

---
- hosts: all
  become: true
  tasks:

  - name: Zabbix Agent telepítése [Red Hat family]
    yum:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "RedHat"

  - name: Zabbix Agent telepítése [Debian family]
    apt:
      name: zabbix-agent
      state: latest
      update_cache: yes
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent konfigurálása [Red Hat family]
    lineinfile:
      path: '/etc/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_os_family == "RedHat"

  - name: Zabbix Agent konfigurálása [Debian family]
    lineinfile:
      path: '/etc/zabbix/zabbix_agentd.conf'
      regexp: "{{ item.regexp }}"
      line: "{{ item.line }}"
      state: present
      backup: yes
    with_items:
      - {regexp: '^\s*#?\s*Server\s*=', line: 'Server={{ ZBXSERVER }}'}
      - {regexp: '^\s*#?\s*Hostname\s*=', line: 'Hostname={{ inventory_hostname_short }}'}
      - {regexp: '^\s*#?\s*LogFileSize\s*=', line: 'LogFileSize={{ ZBXLOGFILESIZE }}'}
      - {regexp: '^\s*#?\s*ListenPort\s*=', line: 'ListenPort={{ ZBXAGENTPORT }}'}
      - {regexp: '^\s*#?\s*ListenIP\s*=', line: 'ListenIP={{ ZBXLISTENIP }}'}
    notify:
    - restart zabbix-agent
    when:
    - ansible_os_family == "Debian"

  - name: Zabbix Agent engedélyezése és elindítása
    service:
      name: zabbix-agent
      enabled: yes
      state: started

  handlers:
   - name: restart zabbix-agent
     service: name=zabbix-agent state=restarted

Vélemény, hozzászólás? Válasz megszakítása

Az e-mail címet nem tesszük közzé. A kötelező mezőket * karakterrel jelöltük

Kategóriák

  • ansible
  • docker
  • e-mail
  • git
  • hardware
  • hibakeresés
  • kubernetes
  • ldap
  • Linux
  • MariaDB
  • OpenWrt
  • Proxmox
  • security
  • SNMP
  • Synology
  • teszt
  • Unifi
  • UPS
  • vagrant
  • Virtualbox
  • zabbix
©2025 msandor honlapja | WordPress Theme by Superb WordPress Themes

Adatkezelési tájékoztató || Hibát talált az oldalon? Írja meg nekem. || Impresszum || Powered by WordPress

Oldalunk cookie-kat ("sütiket") használ. Ezen fájlok információkat szolgáltatnak számunkra a felhasználó oldallátogatási szokásairól a legjobb felhasználói élmény nyújtása érdekében, de nem tárolnak személyes információkat, adatokat. Szolgáltatásaink igénybe vételével Ön beleegyezik a cookie-k használatába. Kérjük, hogy kattintson az Elfogadom gombra, amennyiben böngészni szeretné weboldalunkat.ElfogadomAdatvédelmi irányelvek