Hogyan készítsünk lehetséges színdarabokat és játékkönyveket – 5. rész
Az Ansible sorozat ezen 5. részében elmagyarázzuk, hogyan hozhat létre Ansible Plays és Playbooks-okat az Ansible modulok segítségével.
Az Ansible különálló szkriptekkel, úgynevezett modulokkal érkezik, amelyeket játékkönyvekben használnak speciális feladatok távoli csomópontokon való végrehajtására.
A modulok hasznosak olyan feladatok automatizálásához, mint a csomagkezelés, a fájlok archiválása és másolása, hogy csak néhányat említsünk. Lehetővé teszik a konfigurációs fájlok módosítását és az olyan eszközök kezelését, mint az útválasztók, kapcsolók, terheléselosztók, tűzfalak és számos egyéb eszköz.
Ennek az altémának az a célja, hogy áttekintést adjon azokról a különféle feladatokról, amelyek az Lehetséges modulok segítségével végezhetők el:
Csomagkezelés Linux alatt
A csomagkezelés a rendszergazdák egyik legfontosabb és leggyakrabban végzett feladata. Az Ansible olyan modulokkal érkezik, amelyek segítenek csomagkezelési feladatok végrehajtásában RedHat és Debian alapú rendszereken egyaránt.
Viszonylag könnyű kitalálni. Létezik az apt modul az APT csomagkezeléshez Debian alapúhoz, a régi yum modul a YUM csomagkezeléshez és a dnf modul az újabb RHEL disztribúciókhoz társítva. .
Az alábbiakban néhány példa látható arra, hogyan használhatók a modulok egy játékkönyvben:
1. példa: Az Apache webszerver telepítése RHEL 8-ra
---
- name: install Apache webserver
hosts: webservers
tasks:
- name: install httpd
dnf:
name: httpd
State: latest
2. példa: Az Apache webszerver telepítése Debian 10 rendszeren
---
- name: install Apache webserver
hosts: databases
tasks:
- name: install Apache webserver
apt:
name: apache2
State: latest
Szerviz modul
A szervizmodul lehetővé teszi a rendszergazdák számára a szolgáltatások elindítását, leállítását, frissítését, frissítését és újratöltését a rendszeren.
1. példa: Az Apache webszerver indítása
---
- name: Start service httpd, if not started
service:
name: httpd
state: started
2. példa: Az Apache webszerver leállítása
---
- name: Stop service httpd
service:
name: httpd
state: stopped
3. példa: Az enp2s0 hálózati interfész újraindítása
---
- name: Restart network service for interface eth0
service:
name: network
state: restarted
args: enp2s0
Modul másolása
Ahogy a neve is sugallja, a másolómodul a fájlokat a távoli gép egyik helyéről egy másik helyre másolja ugyanazon a gépen.
1. példa: Fájlok másolása helyiről távoli Linuxra
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
A játékkönyv a /etc/files/ könyvtárból a /srv/ könyvtárba másolja a tecmint.conf konfigurációs fájlt tecmint néven. > 0644 jogosultsággal rendelkező felhasználó.
Az engedélyek szimbolikus ábrázolással is ábrázolhatók, az utolsó sorban látható módon.
2. példa: Fájlok másolása helyiről távoli Linuxra
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: u=rw, g=r, o=r
Az előző példában szereplő engedélyek az utolsó sorban látható módon ábrázolhatók. A felhasználóhoz olvasási és írási jogosultság, a csoporthoz írási engedélyek, a többi pedig a világhoz olvasási engedélyek vannak hozzárendelve.
Fájl modul
A fájlmodul számos fájlművelet végrehajtására szolgál, beleértve a fájlok és könyvtárak létrehozását, a fájlengedélyek hozzárendelését és a szimbolikus hivatkozások beállítását.
1. példa: Végezze el a Linux fájlengedélyeket
---
- name: Change file ownership, group, and permissions
file:
path: /etc/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
A fenti lejátszás létrehoz egy tecmint.conf nevű fájlt az /etc könyvtárban, amely a 0644 engedélyeket állítja be.
2. példa: Linux-fájl törlése
---
- name: Remove file (delete file)
file:
path: /etc/tecmint.conf
state: absent
Ezzel eltávolítja vagy törli a tecmint.conf fájlt.
3. példa: Hozzon létre egy könyvtárat
---
- name: create a directory if it doesn’t exist
file:
path: /etc/mydirectory
State: directory
mode: '0777'
Ezzel létrehoz egy könyvtárat a /etc könyvtárban, amely a 0777 engedélyeket állítja be.
4. példa: Könyvtár rekurzív törlése
---
- name: Recursively deleting a directory
file:
path: /etc/tecmint.conf
state: absent
A fenti lejátszás rekurzív módon törli a könyvtárat.
Lineinfile modul
A lineinfile modul akkor hasznos, ha egy fájl egyetlen sorát szeretné módosítani. Egy meglévő vonalat helyettesíthet.
1. példa: Fájlok kezelése Linuxban
---
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=disabled
A fenti lejátszás a SELINUX értéket disabled-ra állítja.
SELINUX=disabled
2. példa: Fájlok módosítása Linuxban
---
- name: Add a line to a file if the file does not exist, without passing regexp
lineinfile:
path: /etc/hosts
line: 10.200.50.51 linux-console.net
create: yes
Ezzel hozzáadja a 10.200.50.51 linux-console.net bejegyzést az /etc/hosts fájlhoz.
Archív modul
Az Archívum modul egyetlen vagy több fájl tömörített archívumának létrehozására szolgál. Azt feltételezi, hogy a tömörítési forrás létezik a célhelyen. Az archiválás után a forrásfájl később törölhető vagy eltávolítható a remove=True
utasítással.
1. példa: Archív fájl létrehozása
- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz
archive:
path: /path/to/tecmint_dir
dest: /path/to/tecmint.tgz
This compresses the /path/to/tecmint_dir directory to /path/to/tecmint.tgz
2. példa: Hozzon létre egy archív fájlt és távolítsa el
- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it
archive:
path: /path/to/tecmint
dest: /path/to/tecmint.tgz
remove: yes
A fenti lejátszásban az archiválás befejezése után a forrásfájl /path/to/tecmint törlődik.
3. példa: Archív fájl létrehozása
- name: Create a bz2 archive of /path/to/tecmint
archive:
path: /path/to/tecmint
format: bz2
Ezzel létrehoz egy tömörített fájlt bz2 formátumban a /path/to/tecmint fájlból.
Git modul
A modul kezeli a szoftvertárak git-pénztárait.
1. példa: Ellenőrizze a Git Repositoires-t
- git:
repo: 'https://foosball.example.org/path/to/repo.git'
dest: /srv/checkout
version: release-0.22
Parancs modul
Az egyik leggyakrabban használt modul, a command modul a parancs nevét veszi fel, majd később argumentumok listáját követi. A parancsot ugyanúgy adjuk át, ahogyan egy Linux shellbe írjuk be.
1. példa: Futtasson egy parancsot
- name: Executing a command using the command module
command: cat helloworld.txt
2. példa: Ellenőrizze a távoli Linux üzemidejét
---
- name: Check the remote host uptime
hosts: servers
tasks:
- name: Execute the Uptime command over Command module
register: uptimeoutput
command: "uptime"
- debug:
var: uptimeoutput.stdout_lines
A parancsmodul lekéri a távoli kiszolgálók üzemidejét.
Változók a futási parancsok eredményeinek lekéréséhez
Általában az Ansible játékkönyveket arra használják, hogy feladatokat hajtsanak végre a felügyelt gazdagépeken anélkül, hogy a kimenetet a parancssorban jelenítenék meg. Vannak azonban olyan esetek, amikor szükség lehet a kimenet vagy az eredmények rögzítésére. Ebben a részben végigvezetjük, hogyan rögzítheti a játékkönyv kimenetét egy változóban, és hogyan jelenítheti meg később.
Egy lehetséges regiszter egy feladat kimenetének rögzítésére és változó mentésére szolgál. A változó ezután a feladat stdoutját fogja tartalmazni.
Tegyük fel például, hogy a megfelelő gyökérkönyvtárak felügyelt csomópontjainak lemezhasználatát szeretné ellenőrizni a df -Th /
paranccsal. A parancs meghatározásához a 'command'
modult, a 'register'
modult pedig az std kimenet változóba mentéséhez használja.
A parancs megjelenítéséhez használja a 'debug'
modult az stdout visszatérési értéke mellett.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout
Most pedig futtassuk a játékkönyvet. Ebben az esetben a forgatókönyvünket a check_disk_space.yml elnevezéssel láttuk el.
ansible-playbook check_disk_space.yml
Amint láthatta, a kimenet összevissza van, és megnehezíti a követést.
A kimenet igazítása és az olvashatóság megkönnyítése érdekében cserélje ki az stdout visszatérési értéket az stdout_lines értékre.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout_lines
Használja a Feltételeket a játék végrehajtásának vezérléséhez
Csakúgy, mint a programozási nyelvekben, a feltételes utasítások akkor használatosak, ha egynél több eredmény lehetséges. Vessünk egy pillantást az Ansible játékkönyvekben gyakran használt feltételes kijelentésekre.
Amikor nyilatkozat
Néha előfordulhat, hogy bizonyos csomópontokon szeretne feladatokat végrehajtani, másokon nem. A 'when'
feltételes utasítás meglehetősen könnyen használható és implementálható egy játékkönyvben. A 'when'
záradék használatakor egyszerűen deklarálja a záradék melletti feltételt, amint az látható:
when: condition
Ha a feltétel teljesül, akkor a feladat a távoli rendszeren kerül végrehajtásra.
Nézzünk meg néhány példát:
1. példa: A When Operator használata
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian”
A fenti játék az Nginx webszervert telepíti a Debian disztribúciók családját futtató gazdagépekre.
Használhatja az OR
és az AND
operátort is az if feltételes utasítás mellett.
2. példa: Az ÉS operátor használata a When funkcióval
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” and
ansible_distribution_version == “18.04”
Az AND
operátor használatakor mindkét utasításnak teljesülnie kell a feladat végrehajtásához.
A fenti játék telepíti az Nginx-et a 18.04-es verziójú Debian operációs rendszert futtató csomópontokra. Nyilvánvalóan ez az Ubuntu 18.04 lesz.
3. példa: A VAGY operátor használata a When funkcióval
Az OR
operátorral a feladat végrehajtásra kerül, ha valamelyik feltétel teljesül.
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” or
Ansible_os_family == “SUSE”
A fenti játék telepíti az Nginx webszervereket a Debian vagy a SUSE operációs rendszer családra, vagy mindkettőre.
MEGJEGYZÉS: Mindig ügyeljen arra, hogy a ==
kettős egyenlőségjelet használja egy feltétel tesztelésekor.
Feltételek hurokban
A feltételes feltételek ciklusban is használhatók. Tegyük fel például, hogy van egy listája több olyan csomagról, amelyeket telepíteni kell a távoli csomópontokra.
Az alábbi útmutatóban van egy csomagok nevű tömbünk, amely a telepítendő csomagok listáját tartalmazza. Ezeket a feladatokat egymás után hajtják végre, ha a szükséges záradék Igaz értékre van állítva.
---
- name: Install Software packages
hosts: all
vars:
packages:
• name: nginx
required: True
• name: mysql
required: True
• name: apache
required: False
tasks:
• name: Install “{{ item.name }}”on Debian
apt:
name: “{{ item.name }}”
state: present
When: item.required == True
loop: “{{ packages }}”
Hibakezelés konfigurálása
Néha a feladatok meghiúsulnak a játékkönyvek futtatásakor. Tételezzük fel, hogy 5 feladatot futtat 3 szerveren, amint az az alábbi útmutatóban látható. Ha hiba történik a 3. feladatnál (MySQL indítása) a 2. kiszolgálón, az Ansible leállítja a 2. kiszolgálón lévő fennmaradó feladatok végrehajtását, és megpróbálja befejezni a többi kiszolgálón a fennmaradó feladatokat.
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
- name: Install MySQL database
<< some code >>
- name: Start MySQL
<< some code >>
- name: Install Nginx
<< some code >>
- name: Start Nginx
<< some code >>
Ha konzisztenciát szeretne a játékkönyv végrehajtásában, például állítsa le a játékkönyv végrehajtását, ha valamelyik szerver meghibásodik, adja hozzá a lehetőséget.
---
- name: Install Software packages
hosts: server1, server2, server3
any_errors_fatal: true
tasks:
Ily módon, ha egy feladat meghiúsul egy szerveren, az Ansible leállítja a teljes játékkönyv végrehajtását az összes szerveren, és kilép.
Ha azt szeretné, hogy a forgatókönyv figyelmen kívül hagyja a hibákat, és folytassa a többi feladatsor végrehajtását, akkor használja az ignore_errors: True beállítást.
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
ignore_errors: True
Hozzon létre útmutatókat a rendszerek meghatározott állapotba való konfigurálásához
Ebben a részben megvizsgálunk néhány további lehetőséget, amelyek a játékkönyv futtatásakor elérhetők.
Kezdjük az Ellenőrzés vagy a Száraz futás opcióval. A száraz futás vagy az ellenőrzés mód opciót a játékkönyv futtatásakor használják annak ellenőrzésére, hogy nem találnak-e hibákat, és vannak-e változtatások a felügyelt gazdagépeken. Ez azonban nem módosít a távoli csomópontokon.
Például egy httpd.yml
nevű játékkönyv száraz futtatásához, amely telepíti és elindítja az Apache webszerver futását:
ansible-playbook httpd.yml --check
A másik lehetőség, amit meg kell néznünk, a --start-at-task
opció. Ez akkor használatos, ha megadja annak a feladatnak a nevét, amelynél a forgatókönyvnek el kell kezdődnie.
Vegyünk egy példát: Az alábbi útmutató 2 feladatot ír le: Az első játék az Apache webszervert, a második pedig a htop segédprogramot telepíti.
---
- name: Install httpd
hosts: all
tasks:
yum:
name: httpd
state: Installed
- name: Install htop
yum:
name: htop
state: started
Ha ki szeretné hagyni az Apache webszerver telepítését, és helyette telepíteni szeretné a htop segédprogramot, futtassa:
ansible-playbook playbook.yml --start-at-task “Install htop”
Végül megcímkézheti feladatait vagy színdarabjait, ha hozzáadja a címkék opciót a játékkönyvhöz, ahogy az ábra mutatja. Ez akkor hasznos, ha elég nagy játékkönyve van, és konkrét feladatokat szeretne futtatni a teljes játékkönyvből.
---
- name: Install httpd
tags: Install and start
hosts: all
tasks:
yum:
name: httpd
state: Installed
tags: Install
• service:
name: httpd
state: started
ansible-playbook playbook.yml -tags "Install"
A címkék elhagyásához használja a --skip-tags
opciókat az ábrán látható módon.
ansible-playbook playbook.yml --skip-tags "Install"
Következtetés
Ebben a témában végigvezettük az Ansible leggyakrabban használt moduljain, hogyan lehet stdout-ot lekérni egy playbook végrehajtásából elemzés céljából, hogyan lehet feltételes feltételeket használni a játékfüzetben, és hogyan lehet kezelni a futás közben előforduló hibákat. feladatokat. Végül áttekintettük a forgatókönyvek konfigurációját, és azt, hogy hogyan használhat további opciókat annak eldöntésére, hogy mely feladatokat kell futtatni, ha nem kívánja futtatni a teljes játékkönyvet.