Vyhledávání na webu

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.