Jak vytvořit Ansible Plays and Playbooks – Část 5
V této 5. části série Ansible vysvětlíme, jak vytvořit Ansible Plays a Playbooks pomocí modulů Ansible.
Ansible se dodává se samostatnými skripty nazývanými moduly, které se používají v příručkách pro provádění specializovaných úloh na vzdálených uzlech.
Moduly jsou užitečné pro automatizaci úloh, jako je správa balíčků, archivace a kopírování souborů, abychom zmínili jen některé. Umožňují vám vylepšovat konfigurační soubory a spravovat zařízení, jako jsou směrovače, přepínače, vyrovnávače zátěže, brány firewall a řadu dalších zařízení.
Cílem tohoto podtématu je poskytnout vám přehled různých úkolů, které lze provést pomocí modulů Ansible:
Správa balíčků v Linuxu
Správa balíčků je jednou z nejzásadnějších a nejčastějších úloh, kterou provádějí správci systémů. Ansible se dodává s moduly, které vám pomohou provádět úlohy správy balíčků v systémech založených na RedHat a Debian.
Dají se poměrně snadno uhodnout. Existuje modul apt pro správu balíčků APT pro Debian, starý modul yum pro správu balíčků YUM a modul dnf spojený s novějšími distribucemi RHEL .
Níže je uvedeno několik příkladů, jak lze moduly použít v příručce:
Příklad 1: Instalace webového serveru Apache na RHEL 8
---
- name: install Apache webserver
hosts: webservers
tasks:
- name: install httpd
dnf:
name: httpd
State: latest
Příklad 2: Instalace webového serveru Apache na Debian 10
---
- name: install Apache webserver
hosts: databases
tasks:
- name: install Apache webserver
apt:
name: apache2
State: latest
Servisní modul
Servisní modul umožňuje správcům systému spouštět, zastavovat, aktualizovat, upgradovat a znovu načítat služby v systému.
Příklad 1: Spuštění webového serveru Apache
---
- name: Start service httpd, if not started
service:
name: httpd
state: started
Příklad 2: Zastavení webového serveru Apache
---
- name: Stop service httpd
service:
name: httpd
state: stopped
Příklad 3: Restartování síťového rozhraní enp2s0
---
- name: Restart network service for interface eth0
service:
name: network
state: restarted
args: enp2s0
Kopírovat modul
Jak název napovídá, kopírovací modul zkopíruje soubory z jednoho umístění na vzdáleném počítači do jiného umístění na stejném počítači.
Příklad 1: Kopírování souborů z místního na vzdálený Linux
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
Příručka zkopíruje konfigurační soubor tecmint.conf z adresáře /etc/files/ do adresáře /srv/ jako tecmint uživatel s oprávněními 0644.
Oprávnění lze také reprezentovat pomocí symbolické reprezentace, jak je znázorněno na posledním řádku.
Příklad 2: Kopírování souborů z místního na vzdálený Linux
---
- 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
Oprávnění v předchozím příkladu mohou být znázorněna tak, jak je uvedeno na posledním řádku, Uživatel má přidělena oprávnění ke čtení a zápisu, skupině jsou přidělena oprávnění k zápisu a zbytek světu jsou přidělena oprávnění ke čtení.
Souborový modul
Souborový modul se používá k provádění mnoha operací se soubory, včetně vytváření souborů a adresářů, přidělování oprávnění k souborům a nastavování symbolických odkazů.
Příklad 1: Proveďte oprávnění souboru Linux
---
- name: Change file ownership, group, and permissions
file:
path: /etc/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
Výše uvedené přehrání vytvoří soubor s názvem tecmint.conf v adresáři /etc s nastavením oprávnění na 0644.
Příklad 2: Smažte soubor Linux
---
- name: Remove file (delete file)
file:
path: /etc/tecmint.conf
state: absent
Tím se odstraní nebo smaže soubor tecmint.conf.
Příklad 3: Vytvoření adresáře
---
- name: create a directory if it doesn’t exist
file:
path: /etc/mydirectory
State: directory
mode: '0777'
Tím se vytvoří adresář v adresáři /etc s nastavením oprávnění na 0777.
Příklad 4: Rekurzivně odstraňte adresář
---
- name: Recursively deleting a directory
file:
path: /etc/tecmint.conf
state: absent
Výše uvedené přehrání rekurzivně odstraní adresář.
Modul Lineinfile
Modul lineinfile je užitečný, když chcete změnit jeden řádek v souboru. Může nahradit stávající linku.
Příklad 1: Manipulace se soubory v Linuxu
---
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=disabled
Výše uvedená hra nastaví hodnotu SELINUX na deaktivováno.
SELINUX=disabled
Příklad 2: Změňte soubory v Linuxu
---
- 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
Tím se do souboru /etc/hosts přidá položka 10.200.50.51 linux-console.net.
Archivační modul
Modul Archiv slouží k vytvoření komprimovaného archivu jednoho nebo více souborů. Předpokládá, že zdroj komprese existuje a je přítomen v cílovém umístění. Po archivaci lze zdrojový soubor později smazat nebo odstranit pomocí příkazu remove=True
.
Příklad 1: Vytvoření archivního souboru
- 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
Příklad 2: Vytvořte archivní soubor a odeberte
- 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
Ve výše uvedené hře je zdrojový soubor /path/to/tecmint po dokončení archivace smazán.
Příklad 3: Vytvoření archivního souboru
- name: Create a bz2 archive of /path/to/tecmint
archive:
path: /path/to/tecmint
format: bz2
Tím se ze souboru /path/to/tecmint vytvoří komprimovaný soubor ve formátu bz2.
Modul Git
Modul spravuje git checkouty softwarových úložišť.
Příklad 1: Zkontrolujte repozitáře Git
- git:
repo: 'https://foosball.example.org/path/to/repo.git'
dest: /srv/checkout
version: release-0.22
Velitelský modul
Jeden z nejčastěji používaných modulů, modul command přebírá název příkazu a později následuje seznam argumentů. Příkaz se předává stejným způsobem, jako byste zadali v prostředí Linuxu.
Příklad 1: Spusťte příkaz
- name: Executing a command using the command module
command: cat helloworld.txt
Příklad 2: Kontrola doby provozu vzdáleného Linuxu
---
- 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
Příkazový modul načte dobu provozu vzdálených serverů.
Proměnné pro načtení výsledků spuštěných příkazů
Obvykle se Ansible playbooky používají k provádění úloh na spravovaných hostitelích bez zobrazení výstupu na příkazovém řádku. Existují však případy, kdy můžete být požádáni o zachycení výstupu nebo výsledků. V této části vás provedeme tím, jak můžete zachytit výstup playbooku do proměnné a později jej zobrazit.
Ansible registr se používá pro zachycení výstupu úlohy a uložení proměnné. Proměnná bude poté obsahovat stdout úlohy.
Předpokládejme například, že chcete zkontrolovat využití disku spravovanými uzly v příslušných kořenových adresářích pomocí příkazu df -Th /
. Budete používat modul ‘command‘
k definování příkazu a ‘register‘
k uložení výstupu std do proměnné.
K zobrazení příkazu použijete modul 'debug'
vedle návratové hodnoty stdout.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout
Nyní spustíme playbook. V tomto případě jsme naši příručku pojmenovali check_disk_space.yml.
ansible-playbook check_disk_space.yml
Jak jste viděli, výstup je celý neuspořádaný a je obtížné ho sledovat.
Chcete-li výstup zarovnat a usnadnit čtení, nahraďte návratovou hodnotu stdout hodnotou stdout_lines.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout_lines
K ovládání spuštění přehrávání použijte podmíněné
Stejně jako v programovacích jazycích se podmíněné příkazy používají, když je možný více než jeden výsledek. Pojďme se podívat na některé z běžně používaných podmíněných příkazů v příručkách Ansible.
Když prohlášení
Někdy můžete chtít provádět úkoly na konkrétních uzlech a ne na jiných. Podmíněný příkaz 'when'
se v playbooku docela snadno používá a implementuje. Při použití klauzule 'when'
jednoduše deklarujte podmínku sousedící s klauzulí, jak je znázorněno:
when: condition
Když je podmínka splněna, je úloha provedena na vzdáleném systému.
Podívejme se na několik příkladů:
Příklad 1: Použití operátoru When
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian”
Výše uvedená hra nainstaluje webový server Nginx na hostitele s distribucí rodiny Debian.
Vedle podmíněného příkazu můžete také použít operátory OR
a AND
.
Příklad 2: Použití operátoru AND s funkcí When
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” and
ansible_distribution_version == “18.04”
Při použití operátoru AND
musí být splněny oba příkazy, aby byla úloha provedena.
Výše uvedená hra nainstaluje Nginx na uzly se systémem rodiny OS Debian, což je verze 18.04. Je zřejmé, že to bude Ubuntu 18.04.
Příklad 3: Použití operátoru OR s funkcí When
S operátorem OR
se úloha provede, pokud je splněna některá z podmínek.
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” or
Ansible_os_family == “SUSE”
Výše uvedená hra nainstaluje webové servery Nginx na operační systém Debian nebo SUSE nebo na oba.
POZNÁMKA: Při testování podmínky se vždy ujistěte, že používáte znak dvojité rovnosti ==
.
Podmínky ve smyčkách
Podmínky lze použít i ve smyčce. Řekněme například, že máte seznam několika balíčků, které je třeba nainstalovat na vzdálené uzly.
V níže uvedené příručce máme pole nazvané balíčky obsahující seznam balíčků, které je třeba nainstalovat. Pokud je klauzule povinné nastavena na hodnotu True, budou tyto úkoly provedeny jeden po druhém.
---
- 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 }}”
Konfigurace zpracování chyb
Někdy úkoly selžou při spuštění playbooků. Předpokládejme, že spouštíte 5 úloh na 3 serverech, jak je uvedeno v příručce níže. Pokud dojde k chybě u úlohy 3 (spouštění MySQL) na serveru 2, Ansible zastaví provádění zbývajících úloh na serveru 2 a pokusí se dokončit zbývající úlohy na zbývajících serverech.
---
- 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 >>
Pokud chcete konzistenci při provádění playbooku, například zastavit provádění playbooku, pokud jeden ze serverů selže, přidejte možnost.
---
- name: Install Software packages
hosts: server1, server2, server3
any_errors_fatal: true
tasks:
Tímto způsobem, pokud jedna úloha selže na jednom serveru, Ansible zastaví provádění celého playbooku na všech serverech a ukončí se.
Pokud chcete, aby příručka ignorovala chyby a pokračovala ve vykonávání zbývající sady úkolů, použijte možnost ignorovat_chyby: Pravda.
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
ignore_errors: True
Vytvářejte příručky pro konfiguraci systémů do určeného stavu
V této části se podíváme na některé další možnosti, které jsou k dispozici při spuštění playbooku.
Začněme režimem Kontrola nebo Spuštění nasucho. Možnost suchého běhu nebo režimu kontroly se používá při spuštění playbooku ke kontrole, zda se vyskytnou nějaké chyby a zda na spravovaných hostitelích budou provedeny nějaké změny. Neprovádí však žádné změny na vzdálených uzlech.
Chcete-li například nasucho spustit příručku s názvem httpd.yml
, která nainstaluje a spustí webový server Apache:
ansible-playbook httpd.yml --check
Další možností, na kterou se musíme podívat, je možnost --start-at-task
. Toto se používá při zadávání názvu úlohy, kterou má playbook začínat nebo od které má začínat.
Vezměme si příklad: Příručka níže uvádí 2 úkoly: První hra nainstaluje webový server Apache a druhá nainstaluje utilitu htop.
---
- name: Install httpd
hosts: all
tasks:
yum:
name: httpd
state: Installed
- name: Install htop
yum:
name: htop
state: started
Pokud chcete přeskočit instalaci webového serveru Apache a místo toho nainstalovat utilitu htop, spusťte:
ansible-playbook playbook.yml --start-at-task “Install htop”
Nakonec můžete své úkoly nebo hry označit přidáním možnosti tagů do své příručky, jak je znázorněno na obrázku. To se hodí, když máte poměrně velký playbook a chcete spouštět konkrétní úkoly z celého playbooku.
---
- 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"
Chcete-li značky vynechat, použijte možnosti --skip-tags
, jak je uvedeno na obrázku.
ansible-playbook playbook.yml --skip-tags "Install"
Závěr
V tomto tématu jsme vás provedli běžně používanými moduly v Ansible, jak získat stdout z provádění playbooku pro analýzu, pomocí podmínek v playbooku a jak spravovat chyby, které se mohou při spuštění vyskytnout úkoly. Nakonec jsme zrekapitulovali konfiguraci playbooků a to, jak můžete použít další možnosti k rozhodnutí, které úlohy spustit, pokud nehodláte spustit celý playbook.