# ANSIBLE TUTORIAL | NIC.CZ ###### Vypracoval: Matěj Kevin Nechodom --- ### BASICS ##### ClusterSSH - v PERL - nejde verzovat - 4 terminály = 4 servery; příkazy se píší do jednoho terminálu a to se paralelně odesílá na ostatní servery ##### Vlastní balíčky - IsMedia posinst ##### CFEngine - old AF - napsaný v C - lowlevel ##### Puppet, Chef, Salt - pull/push model - mám server, ten obsahuje config jak co má vypadat a klienti si ho natáhnou - podle nějakého intervalu (default 30 min) se to refreshuje - Puppet a Chef je napsanej v Ruby a každý klient tím pádem potřebuje interpret Ruby ##### 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 list všech strojů a jak je chápe ```bash ansible 1-ubuntu -m 'command' ``` - lze poslat příkaz na různé stroje ```bash ansible "vm:!1_ubuntu' - m 'command' ``` - lze poslat příkaz na různé stroje ### PLAYBOOOKY ```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 ``` - jen checkuje, jestli je to ok; validace konfigurace ```bash ansible-playbook play-3.yml --check --limit server ``` - lze specifikovat, na jaké servery to spustit, !! pozor !! check nefunguje u všech modulů, ale ansible je týpek a v shellu to nepustí, takže chill ```bash ansible-playbook play-3.yml --check --diff ``` - hledá rozdíly (--diff) ```yml check_mode: no ``` - lze vypnout check mode | ON/OFF - shell nechceš používat, protože pak nejsi schopný checkovat, jestli to např. doběhlo, je mnohem lepší použít ten modul toho ansiblu ### HANDLERY - udělej něco, pokud došlo ke změně - dává se to pod hosts ```bash - name: Install webserver hosts: 1-ubuntu handlers: - name: Reload apache systemd: name: "apache2" state: "reloaded" ``` - volá se to pomocí ```notify: nazev``` ### TAGY - jsme schopni přeskakovat na dané kroky, nebo je i skipovat ```yml - name: Set hostname on homepage 2 template: src: ./index.html.j2 # naše šablona, která poté přepisuje soubor v dest podle té šablony dest: /var/www/html/index8.html #backup: yes # udělá backup s timestempem; nepřepisuje je, ale vždy vytvoří nový backup notify: Reload apache tags: # na toto koukej - configure - index8 ``` - ukázka, jak to má vypadat v yml souboru ### ROLE - strukturovaný proces, lepší orientace v souborech, uspořádání - ```ansible-galaxy role init nazev``` vytvoří strukturu pro novou roli ```txt roles/ └── webserver_apache ├── handlers │ └── main.yml ├── tasks │ └── main.yml └── templates └── index.html.j2 ``` - struktura složky - main.yml se musí zachovat - ještě se přidává složka ```/files```, kam dáváme soubory typu .txt, .sh, ... - lze mít více tasků, které lze volat (nejlepší je z mainu zavolat nějaký jiný task, poté se vrátit do mainu a poté znovu zavolat další task, aby to nebyla špageta) - Playbook, který volá roli ```webserver_apache``` ```bash - name: Install webserver - Apache2 hosts: 1-ubuntu roles: - webserver_apache #- monitoring_apache ```` - Lze použít Ansible Galaxy, kde je jakoby "store" s těmi rolemi, které vytvořila komunita. Má to vlastní dokumentaci, verze, ... [ODKAZ](https://galaxy.ansible.com/ui/standalone/roles/) ### KOLEKCE - velký třest roku 2020, kdy se Ansible rozdělil na komunitní a nekomunitní - ty komunitní věci jsou v "Panos" [ZDE](https://galaxy.ansible.com/ui/repo/published/paloaltonetworks/panos/) - vlastně nevím, k čemu toje, byla to nuda xdd ### PLUGINY - jsou to vlastně moduly - rozšiřují funkcionalitu Ansiblu - máme více typů: -- callback plugin - je zavolán po skončení playbooku (např. mail výstup) -- connection plugin - používá se pro spojení s ovládaným (např. ssh,local,chroot,docker) -- inventory plugin - dynamický inventář (např. aws, nmap, virtualbox) -- shell plugin - umožňuje spouštět shell příkazy (kdo by to čekal, haha) ### PŘIBALENÉ NÁSTROJE - Máme následující typy: -- Vault - bezpečné uchování tajemství ve verzovacím režimu -- Galaxy - sdílení rolí -- Lint - statická analýza kódu -- Inventory - parser inventáře ### PŘÍKAZY - ```ansible-playbook playbook.yml --tags nazev_tagu``` takto spustíme jen sekci s tagem ```nazev_tagu``` - ```ansible-playbook playbook.yml --skip-tags nazev_tagu``` skipne sekci s tagem ```nazev_tagu``` - ```ansible-galaxy role init nazev``` vytvoří strukturu pro novou roli - ```ansible doc``` - vypíše dokumentaci - ```ansible config``` generování configu - ```ansible-community``` verze komunitního pluginu - ```ansible-console-all``` ssh příkaz na všechny stroje - ```ansible-vault edit host_vars/1-ubuntu.yml``` zašifruje pomocí AES256, kdyby se to náhodou dostalo do gitu, tak jsou hesla zašifrované ### EXTERNÍ NÁSTROJE - Molecule ## POZNÁMKY - modul ```raw``` používá pouze SSH - není potřeba mít na vzdáleném serveru nainstalovaný python - nějací daemoni jsou schopni checkovat vlastní config (např. nginx), v Ansiblu lze použít ```validate: nginx -t```, který ti provede tu kontrolu a potom až teprve ti udělá ten zbytek - Vagrant společně s Ansiblem dokáže udělat virtualku, kde lze testovat playbooky - [Multiline in yml](https://stackoverflow.com/questions/3790454/how-do-i-break-a-string-in-yaml-over-multiple-lines) - [Cool výpis všech serverů se všemi různými daty](https://github.com/fboender/ansible-cmdb) - [ShellCheck](https://www.shellcheck.net/) - řekne ti, co si o tvém špageta kódu myslí :)