219 lines
4.9 KiB
Markdown
219 lines
4.9 KiB
Markdown
# 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ů
|
||
|