V predošlej časti seriálu o nástroji Ansible sme vysvetlili, čo sú to premenné a ako sa môžu použiť. Ansible rozoznáva globálne premenné (facts) a lokálne premenné (variables). Facts alebo aj variables tvoria zároveň základnú súčasť šablónovacieho systému Jinja2, ktorý Ansible vďaka Pythonu tiež používa.
V tejto časti predstavíme šifrovanie citlivých údajov pomocou nástroja Ansible Vault. Ďalej ukážeme, ako viacero úloh spojiť do bloku a ako tak môžeme prispôsobiť chybové hlásenia pre jednotlivé úlohy. Nakoniec pomocou rolí prehľadne rozdelíme playbooky, premenné, súbory a šablóny do priečinkov, aby bolo možné jednoducho ich kedykoľvek opakovane použiť.
Zabezpečujeme citlivé údaje
Systém Ansible ponúka hneď po inštalácii nástroj Vault, vďaka ktorému môžeme zašifrovať citlivé údaje. Najskôr ale musíme vytvoriť silné náhodné heslo (openssl rand -base64 128
) a uložiť ho mimo priečinka s playbookmi do skrytého súboru ~/.ansible_vault_key
:
openssl rand -base64 128 > ~/.ansible_vault_key
Presvedčíme sa, či sa heslo naozaj vytvorilo a úspešne uložilo do súboru:
cat ~/.ansible_vault_key
Je veľmi dôležité, aby prístup k obsahu súboru ~/.ansible_vault_key
mal iba jeho autor, inak generované heslo nebude bezpečné použiť. Z tohto dôvodu súboru nastavíme prístupové údaje tak, aby jedine vlastník súboru mohol súbor čítať a zapisovať doň:
chmod 600 ~/.ansible_vault_key
Do súboru s premennými (tu ~/ansible-test/variables.yaml
) zapíšeme heslo, ktoré neskôr použijeme ako jeden s prihlasovacích údajov. Aby heslo neuniklo, zašifrujeme celý súbor pomocou nástroja Ansible Vault, pričom ako heslo určíme obsah súboru s heslom (--vault-password-file ~/.ansible_vault_key
):
ansible-vault encrypt --vault-password-file ~/.ansible_vault_key ~/ansible-test/variables.yaml
Pri spustení playbooku stačí opäť zadať cestu k súboru s heslom (--vault-password-file ~/.ansible_vault_key
), aby Ansible mohol zašifrovaný súbor s premennými (~/ansible-test/variables.yaml
) ešte pred spustením playbooku dešifrovať a načítať z neho hodnoty premenných:
ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/change_index.yaml
Spájame úlohy do blokov
Ansible umožňuje zoskupiť úlohy do blokov. Môžeme tak na jednom mieste určiť nastavenia spoločné pre všetky zoskupené úlohy, a tiež efektívne ošetriť chybové hlásenia jednotlivých úloh. Z predošlej časti si playbook copy_facts_install_web_server.yaml
upravíme takto:
nano ~/ansible-test/copy_facts_install_web_server.yaml
- hosts: all become: True vars_files: - variables.yaml tasks: - block: - name: Vytvorenie priečinka pre externý súbor s faktami file: path: "{{ remote_dir }}" state: directory recurse: yes - name: Kopírovanie externého súboru s faktami do vytvoreného priečinka copy: src: "{{ facts_file }}" dest: "{{ remote_dir }}" when: ansible_facts['distribution'] == 'Ubuntu' ignore_errors: yes - hosts: all become: True vars_files: - variables.yaml tasks: - name: Inštalácia webového servera package: name: "{{ ansible_local.custom.facts.web_server }}" state: present
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Prvé dve úlohy sme zoskupili do bloku (block
), pričom na konci bloku sme určili, že sa úlohy vykonajú iba vtedy, keď na managed nodes bude zistená linuxová distribúcia Ubuntu (when: ansible_facts['distribution'] == 'Ubuntu'
). No a úlohy v bloku sa vykonajú všetky bez ohľadu na to, či nastane alebo nenastane chyba (ignore_errors: yes
), inak by Ansible pri prvej chybe zastavil vykonávanie ďalších úloh.
Playbook spustíme a overíme očakávaný výpis so skutočnosťou:
ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/copy_facts_install_web_server.yaml
Súčasťou bloku sú aj rescue
(úlohy spustené po chybnej úlohe v bloku) a always
(úlohy spúšťané po každej úlohe v bloku). Playbook copy_facts_install_web_server.yaml
upravíme takto:
nano ~/ansible-test/copy_facts_install_web_server.yaml
- hosts: all become: True vars_files: - variables.yaml tasks: - block: - name: Vytvorenie priečinka pre externý súbor s faktami file: path: "{{ remote_dir }}" state: directory recurse: yes - name: Kopírovanie externého súboru s faktami do vytvoreného priečinka copy: src: "{{ facts_file }}" dest: "{{ remote_dir }}" when: ansible_facts['distribution'] == 'Ubuntu' ignore_errors: yes rescue: - name: Vyskytla sa chyba! debug: msg: "Toto je správa, ktorá sa zobrazí pri chybe úlohy v bloku." always: - name: Po každej úlohe bloku debug: msg: "Toto je správa, ktorá sa zobrazí po vykonaní každej úlohy v bloku." - hosts: all become: True vars_files: - variables.yaml tasks: - name: Inštalácia webového servera package: name: "{{ ansible_local.custom.facts.web_server }}" state: present
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Playbook spustíme a overíme očakávaný výpis so skutočnosťou:
ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/copy_facts_install_web_server.yaml
Triedime súbory do priečinkov
Aktuálne sa všetky súbory, ktoré sme doteraz v jednotlivých častiach tohto seriálu použili, nachádzajú v jednom priečinku ~/ansible-test/
. Vďaka rolám (roles) si v týchto súboroch môžeme vytvoriť prehľadnejší systém. Jednotlivé playbooky, premenné, súbory a šablóny premiestnime do priečinkov. Vytvoríme priečinok s názvom roles
a premiestnime sa doň (prvý riadok). V priečinku roles
pomocou nástroja Ansible Galaxy vytvoríme štruktúru súborov a priečinkov pre rolu s názvom web
(druhý riadok):
mkdir ~/ansible-test/roles && cd roles
ansible-galaxy role init web
Názov roly web
tvorí zároveň názov priečinka, v ktorom bola vytvorená štruktúra súborov a priečinkov. Po nainštalovaní nástroja tree
(prvý riadok) štruktúru súborov a priečinkov môžeme overiť (druhý riadok):
sudo apt install tree
tree ~/ansible-test/roles/web
Súbor README.md
obsahuje informácie o role a je písaný vo formáte markdown, ako je to obvyklé napríklad aj v rámci služby GitHub. Tento súbor ponúka štruktúru informácií, vďaka ktorej nezabudnete zaznačiť dôležité informácie o použitých súboroch.
Z priečinkov budeme používať files
, tasks
, templates
a vars
, do ktorých postupne skopírujeme jednotlivé súbory:
cp ~/ansible-test/custom.fact ~/ansible-test/roles/web/files/custom.fact
cp ~/ansible-test/copy_facts_install_web_server.yaml ~/ansible-test/roles/web/tasks/main.yml
cp ~/ansible-test/index.html.j2 ~/ansible-test/roles/web/templates/index.html.j2
cp ~/ansible-test/variables.yaml ~/ansible-test/roles/web/vars/main.yml
Playbook skopírovaný ako ~/ansible-test/roles/web/tasks/main.yml
upravíme tak, aby obsahoval iba úlohy, keďže sa nachádza v priečinku tasks:
nano ~/ansible-test/roles/web/tasks/main.yml
- name: Vytvorenie priečinka pre externý súbor s faktami file: path: "{{ remote_dir }}" state: directory recurse: yes - name: Kopírovanie externého súboru s faktami do vytvoreného priečinka copy: src: "{{ facts_file }}" dest: "{{ remote_dir }}" - name: Inštalácia webového servera package: name: "{{ ansible_local.custom.facts.web_server }}" state: present - name: Prepísanie súboru index.html template: src: index.html.j2 dest: /var/www/html/index.html mode: 0775
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
Servery, ku ktorým sa pripájame, teraz ešte rozdelíme v súbore inventory
(prvý riadok) do dvoch skupín (ostatné riadky):
nano ~/ansible-test/inventory
[web_1] 10.1.1.5 [web_2] 10.1.1.9
Vložíme skopírovaný obsah, uložíme pomocou klávesovej skratky Ctrl + X
a následne stlačením klávesu y
a potvrdením klávesom Enter
.
V priečinkoch roly web
je všetko pripravené. Ostáva ešte vytvoriť playbook role-web.yaml
(prvý riadok), ktorý si údaje automaticky načíta (ostatné riadky) s jednotlivých priečinkov role web
:
nano ~/ansible-test/role-web.yaml
- hosts: web_1 become: true roles: - web
Vo vyššie vytvorenom playbooku chceme zasiahnuť iba servery zo skupiny, ktorá je definovaná v súbore inventory
pod názvom web_1
(čiže len IP adresa 10.1.1.5
). Úlohy sa budú vykonávať s právami správcu (become: true
) a všetky potrebné údaje Ansible načíta zo štruktúry súborov a priečinkov roly web
(roles: web
). Teraz už len stačí spustiť playbook:
ansible-playbook --vault-password-file ~/.ansible_vault_key ~/ansible-test/role-web.yaml
Zhrnutie
V poslednej časti sme predstavili šifrovanie citlivých údajov pomocou nástroja Ansible Vault. Ďalej sme ukázali, ako viacero úloh spojiť do bloku a ako tak prispôsobiť chybové hlásenia pre jednotlivé úlohy. Nakoniec sme pomocou rolí roztriedili úlohy, premenné, súbory a šablóny do priečinkov, aby ich bolo možné jednoducho kedykoľvek opakovane použiť.