# Ansible Tutorial | NIC.CZ ## Vypracoval: Matěj Kevin Nechodom --- ## Basics ### ClusterSSH - napsané v PERL - nejde verzovat - 4 terminály = 4 servery; příkazy se píší do jednoho terminálu a paralelně se odesílají na ostatní servery ### Vlastní balíčky - IsMedia posinst ### CFEngine - zastaralé - napsané v C - low-level ### Puppet, Chef, Salt - pull/push model - server obsahuje konfiguraci, kterou si klienti stahují - podle intervalu (defaultně 30 min) se konfigurace refreshuje - Puppet a Chef jsou napsané v Ruby, což znamená, že každý klient potřebuje Ruby interpret ### Ansible - YAML => Python (2.7/3.5+) => SSH => Python (2.4) ## Instalace ```bash apt install python3-venv python3-pip python3 -m venv .muj_venv source .muj_venv/bin/activate pip3 install ansible ``` ```bash ansible-inventory --list ``` - vypíše seznam všech strojů a jejich konfiguraci ```bash ansible 1-ubuntu -m 'command' ``` - posílá příkaz na různé stroje ```bash ansible "vm:!1_ubuntu" -m 'command' ``` - posílá příkaz na různé stroje ## Playbooky ```bash ansible-playbook play-1.yml ``` - spustí playbook `play-1.yml` ```bash ansible hosts -m setup > /dev/null ``` - vypíše všechny informace o všech strojích (lze použít i pro jeden stroj) ```bash ansible-playbook play-3.yml --check ``` - pouze ověřuje konfiguraci bez aplikace změn ```bash ansible-playbook play-3.yml --check --limit server ``` - kontrola konfigurace na vybraných serverech ```bash ansible-playbook play-3.yml --check --diff ``` - zobrazí rozdíly v konfiguraci ```yml check_mode: no ``` - vypne `check_mode` > **Poznámka:** Použití shellu není ideální, protože neumožňuje ověřit úspěšné dokončení operace. Raději používej moduly Ansible. ## Handlery - Handler se spustí pouze v případě změny ```yml - name: Install webserver hosts: 1-ubuntu handlers: - name: Reload apache systemd: name: "apache2" state: "reloaded" ``` - Volání handleru se provádí pomocí `notify: nazev` ## Tagy - Možnost přeskakovat a filtrovat kroky v playbooku ```yml - name: Set hostname on homepage 2 template: src: ./index.html.j2 dest: /var/www/html/index8.html notify: Reload apache tags: - configure - index8 ``` ## Role - Strukturovaný proces, lepší přehlednost souborů - `ansible-galaxy role init nazev` vytvoří novou roli ```txt roles/ └── webserver_apache ├── handlers │ └── main.yml ├── tasks │ └── main.yml └── templates └── index.html.j2 ``` - Playbook volající roli `webserver_apache`: ```yml - name: Install webserver - Apache2 hosts: 1-ubuntu roles: - webserver_apache #- monitoring_apache ``` - **Ansible Galaxy** nabízí komunitní role s dokumentací: [Ansible Galaxy](https://galaxy.ansible.com/ui/standalone/roles/) ## Kolekce - V roce 2020 došlo k rozdělení Ansiblu na komunitní a nekomunitní verze - Komunitní kolekce jsou dostupné např. zde: [Panos Collection](https://galaxy.ansible.com/ui/repo/published/paloaltonetworks/panos/) ## Pluginy - Rozšiřují funkcionalitu Ansiblu - Typy pluginů: - **Callback plugin** – zavolán po dokončení playbooku (např. výstup do e-mailu) - **Connection plugin** – způsob připojení (`ssh`, `local`, `chroot`, `docker`) - **Inventory plugin** – dynamické inventáře (`aws`, `nmap`, `virtualbox`) - **Shell plugin** – umožňuje spouštění shell příkazů ## Přibalené nástroje - **Vault** – bezpečné uchování hesel - **Galaxy** – sdílení rolí - **Lint** – statická analýza kódu - **Inventory** – parser inventáře ## Příkazy - Spuštění pouze sekce s konkrétním tagem: ```bash ansible-playbook playbook.yml --tags nazev_tagu ``` - Přeskočení sekce s tagem: ```bash ansible-playbook playbook.yml --skip-tags nazev_tagu ``` - Vytvoření nové role: ```bash ansible-galaxy role init nazev ``` - Zobrazení dokumentace: ```bash ansible doc ``` - Generování konfigurace: ```bash ansible config ``` - Komunitní verze pluginů: ```bash ansible-community ``` - SSH příkaz na všechny stroje: ```bash ansible-console-all ``` - Šifrování hesel pomocí AES256: ```bash ansible-vault edit host_vars/1-ubuntu.yml ``` ## Externí nástroje - **Molecule** – testování ansible playbooků ## Poznámky - Modul `raw` používá pouze SSH – není nutné mít Python na cílovém serveru - Některé služby (např. nginx) mají vlastní validátory: ```yml validate: nginx -t ``` - **Vagrant** umožňuje testování playbooků ve virtualizovaném prostředí - [Multiline v YAML](https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-in-yaml-over-multiple-lines) - [Výpis všech serverů a jejich dat](https://github.com/fboender/ansible-cmdb) - [ShellCheck](https://www.shellcheck.net/) – kontrola shell skriptů