Kako napraviti Ansible Plays i Playbooks - Dio 5
U ovom 5. dijelu Ansible serije, objasnit ćemo kako kreirati Ansible Plays i Playbooks koristeći Ansible module.
Ansible se isporučuje sa samostalnim skriptama zvanim moduli koji se koriste u priručnicima za izvršavanje specijalizovanih zadataka na udaljenim čvorovima.
Moduli su korisni za automatizaciju zadataka kao što su upravljanje paketima, arhiviranje i kopiranje datoteka da spomenemo samo neke. Oni vam omogućavaju da napravite podešavanja konfiguracionih datoteka i upravljate uređajima kao što su ruteri, prekidači, balanseri opterećenja, zaštitni zidovi i niz drugih uređaja.
Cilj ove podteme je da vam pruži pregled različitih zadataka koji se mogu postići Ansible modulima:
Upravljanje paketima u Linuxu
Upravljanje paketima jedan je od najvažnijih i najčešćih zadataka koje obavljaju sistemski administratori. Ansible se isporučuje s modulima koji vam pomažu u izvršavanju zadataka upravljanja paketima iu RedHat i Debian sustavima.
Relativno ih je lako pogoditi. Postoji apt modul za upravljanje APT paketima za Debian baziran, stari yum modul za upravljanje YUM paketima i dnf modul povezan s novijim RHEL distribucijama .
Ispod je nekoliko primjera kako se moduli mogu koristiti u priručniku:
Primjer 1: Instaliranje Apache web servera na RHEL 8
---
- name: install Apache webserver
hosts: webservers
tasks:
- name: install httpd
dnf:
name: httpd
State: latest
Primjer 2: Instaliranje Apache web servera na Debian 10
---
- name: install Apache webserver
hosts: databases
tasks:
- name: install Apache webserver
apt:
name: apache2
State: latest
Servisni modul
Servisni modul omogućava administratorima sistema da pokrenu, zaustave, ažuriraju, nadograde i ponovo učitaju usluge na sistemu.
Primjer 1: Pokretanje Apache Web servera
---
- name: Start service httpd, if not started
service:
name: httpd
state: started
Primjer 2: Zaustavljanje Apache web servera
---
- name: Stop service httpd
service:
name: httpd
state: stopped
Primjer 3: Ponovno pokretanje mrežnog sučelja enp2s0
---
- name: Restart network service for interface eth0
service:
name: network
state: restarted
args: enp2s0
Copy Module
Kao što ime govori, modul za kopiranje kopira datoteke s jedne lokacije na udaljenom računalu na drugu lokaciju na istom stroju.
Primjer 1: Kopiranje datoteka s lokalnog na udaljeni Linux
---
- name: Copy file with owner and permissions
copy:
src: /etc/files/tecmint.conf
dest: /srv/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
Playbook kopira konfiguracijsku datoteku tecmint.conf iz /etc/files/ direktorija u /srv/ direktorij kao tecmint > korisnik sa 0644 dozvolama.
Dozvole se također mogu predstaviti korištenjem simboličkog predstavljanja kao što je prikazano u posljednjem redu.
Primjer 2: Kopiranje datoteka s lokalnog na udaljeni 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
Dozvole u prethodnom primjeru mogu se predstaviti kao što je prikazano u posljednjem redu, korisniku se dodjeljuju dozvole čitanja i pisanja, grupi se dodjeljuju dozvole za pisanje, a ostatku svijetu su dodijeljene dozvole za čitanje.
File Module
Datotečni modul se koristi za obavljanje mnogih operacija sa datotekama uključujući kreiranje datoteka i direktorija, dodjeljivanje dozvola fajlu i postavljanje simboličnih veza.
Primjer 1: Izvršite dozvole za Linux datoteke
---
- name: Change file ownership, group, and permissions
file:
path: /etc/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
Gornja reprodukcija kreira datoteku pod nazivom tecmint.conf u direktoriju /etc postavljajući dozvole na 0644.
Primjer 2: Izbrišite Linux datoteku
---
- name: Remove file (delete file)
file:
path: /etc/tecmint.conf
state: absent
Ovo uklanja ili briše datoteku tecmint.conf.
Primjer 3: Kreirajte direktorij
---
- name: create a directory if it doesn’t exist
file:
path: /etc/mydirectory
State: directory
mode: '0777'
Ovo će kreirati direktorij u /etc direktorijumu postavljajući dozvole na 0777.
Primjer 4: Rekurzivno brisanje direktorija
---
- name: Recursively deleting a directory
file:
path: /etc/tecmint.conf
state: absent
Gornja reprodukcija rekurzivno briše direktorij.
Lineinfile Module
Modul lineinfile je od pomoći kada želite promijeniti jedan red u datoteci. Može zamijeniti postojeću liniju.
Primjer 1: Manipulirajte datotekama u Linuxu
---
- name: Ensure SELinux is set to enforcing mode
lineinfile:
path: /etc/selinux/config
regexp: '^SELINUX='
line: SELINUX=disabled
Reprodukcija iznad postavlja vrijednost SELINUX na onemogućeno.
SELINUX=disabled
Primjer 2: Izmjena datoteka u 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
Ovo dodaje unos 10.200.50.51 linux-console.net u datoteku /etc/hosts.
Arhivski modul
Modul Arhiva se koristi za kreiranje komprimirane arhive jedne ili više datoteka. Pretpostavlja da je izvor kompresije prisutan na ciljnoj destinaciji. Nakon arhiviranja, izvorni fajl se kasnije može izbrisati ili ukloniti pomoću naredbe remove=True
.
Primjer 1: Kreirajte arhivsku datoteku
- 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
Primjer 2: Kreirajte arhivsku datoteku i uklonite
- 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
U gornjoj reprodukciji, izvorni fajl /path/to/tecmint se briše nakon što se arhiviranje završi.
Primjer 3: Kreirajte arhivsku datoteku
- name: Create a bz2 archive of /path/to/tecmint
archive:
path: /path/to/tecmint
format: bz2
Ovo kreira komprimiranu datoteku u formatu bz2 iz datoteke /path/to/tecmint.
Git Module
Modul upravlja git odjavom softverskih repozitorija.
Primjer 1: Provjerite Git Repositoires
- git:
repo: 'https://foosball.example.org/path/to/repo.git'
dest: /srv/checkout
version: release-0.22
Komandni modul
Jedan od najčešće korišćenih modula, command modul preuzima ime komande i kasnije ga prati lista argumenata. Naredba se prosljeđuje na isti način na koji biste upisali u Linux ljusku.
Primjer 1: Pokrenite naredbu
- name: Executing a command using the command module
command: cat helloworld.txt
Primjer 2: Provjerite vrijeme rada udaljenog Linuxa
---
- 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
Komandni modul preuzima vrijeme rada udaljenih servera.
Varijable za dohvaćanje rezultata izvođenja naredbi
Obično se Ansible priručnici koriste za izvršavanje zadataka na upravljanim hostovima bez prikazivanja izlaza na komandnoj liniji. Međutim, postoje slučajevi u kojima se od vas može tražiti da snimite izlaz ili rezultate. U ovom odjeljku ćemo vas provesti kroz kako možete snimiti izlaz playbooka u varijablu i kasnije ga prikazati.
Ansible registar se koristi za hvatanje izlaza zadatka i spremanje u varijablu. Varijabla će nakon toga sadržavati stdout zadatka.
Na primjer, pretpostavimo da želite provjeriti korištenje diska upravljanih čvorova u odgovarajućim korijenskim direktorijima pomoću naredbe df -Th /
. Koristit ćete ‘command’
modul za definiranje naredbe i ‘register’
za spremanje std izlaza u varijablu.
Za prikaz naredbe, koristit ćete ‘debug’
modul uz povratnu vrijednost stdout.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout
Sada, pokrenimo playbook. U ovom slučaju, naš priručnik smo nazvali check_disk_space.yml.
ansible-playbook check_disk_space.yml
Kao što ste vidjeli, rezultat je sav zbrkan i otežava praćenje.
Da biste poravnali izlaz i olakšali čitanje, zamijenite povratnu vrijednost stdout sa stdout_lines.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout_lines
Koristite uslove za kontrolu izvršavanja reprodukcije
Kao iu programskim jezicima, uslovni iskazi se koriste kada je moguće više od jednog ishoda. Pogledajmo neke od najčešće korištenih uvjetnih izjava u Ansible priručnicima.
Kada izjava
Ponekad ćete možda htjeti obavljati zadatke na određenim čvorovima, a ne na drugim. Uslovni izraz 'kada'
je prilično jednostavan za korištenje i implementaciju u playbook. Kada koristite 'when'
klauzulu jednostavno deklarirajte uslov pored klauzule kao što je prikazano:
when: condition
Kada je uslov zadovoljen, zadatak se izvršava na udaljenom sistemu.
Pogledajmo nekoliko primjera:
Primjer 1: Korištenje When Operator
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian”
Gornja igra instalira Nginx web server na hostove koji pokreću Debian familiju distribucija.
Također možete koristiti OR
i AND
operator uz uvjetni izraz when.
Primjer 2: Korištenje AND operatora s 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”
Kada koristite AND
operator, oba izraza moraju biti zadovoljena da bi zadatak bio izvršen.
Gornja igra instalira Nginx na čvorove koji koriste Debian familiju OS-a koji je verzija 18.04. Očigledno, ovo će biti Ubuntu 18.04.
Primjer 3: Korištenje operatora OR sa Kada
Sa OR
operatorom, zadatak se izvršava ako je ispunjen bilo koji od uslova.
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian” or
Ansible_os_family == “SUSE”
Gornja igra instalira Nginx web servere na Debian ili SUSE familiju OS-a ili na oba.
NAPOMENA: Uvijek se pobrinite da koristite znak dvostruke jednakosti ==
kada testirate uvjet.
Uslovi u petljama
Uvjeti se također mogu koristiti u petlji. Recimo, na primjer, imate listu više paketa koje je potrebno instalirati na udaljenim čvorovima.
U playbook-u ispod imamo niz pod nazivom packages koji sadrži listu paketa koje je potrebno instalirati. Ovi zadaci će se izvršavati jedan za drugim ako je obavezna klauzula postavljena na True.
---
- 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 }}”
Konfiguriši rukovanje greškama
Ponekad zadaci ne uspiju kada se pokreće playbooks. Pretpostavimo da izvodite 5 zadataka na 3 servera kao što je prikazano u priručniku ispod. Ako dođe do greške na zadatku 3 (Pokretanje MySQL) na serveru 2, Ansible će prestati izvršavati preostale zadatke na serveru 2 i pokušati da dovrši preostale zadatke na ostalim serverima.
---
- 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 >>
Ako želite dosljednost u izvršavanju playbook-a, na primjer, zaustavite izvršavanje playbook-a, ako jedan od servera ne uspije, dodajte opciju.
---
- name: Install Software packages
hosts: server1, server2, server3
any_errors_fatal: true
tasks:
Na ovaj način, ako jedan zadatak ne uspije na jednom serveru, Ansible će zaustaviti izvršavanje cijelog playbooka na svim serverima i izaći.
Ako želite da playbook ignorira greške i nastavi s izvršavanjem preostalog skupa zadataka, tada koristite opciju ignore_errors: True.
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
ignore_errors: True
Kreirajte Playbooks da konfigurišete sisteme u određeno stanje
U ovom odeljku ćemo pogledati neke dodatne opcije koje su dostupne kada se pokreće playbook.
Počnimo s opcijom Check ili Dry run. Opcija suhog rada ili provjere se koristi kada se pokreće playbook kako bi se provjerilo da li će se naići na bilo kakve greške i da li će biti bilo kakvih promjena koje će biti napravljene na upravljanim hostovima. On, međutim, ne pravi nikakve promjene na udaljenim čvorovima.
Na primjer, za suho pokretanje playbook-a pod nazivom httpd.yml
koji instalira i pokreće Apache web server:
ansible-playbook httpd.yml --check
Druga opcija koju trebamo pogledati je opcija --start-at-task
. Ovo se koristi kada se specificira naziv zadatka koji bi trebao započeti ili započeti.
Uzmimo primjer: Knjiga u nastavku navodi 2 zadatka: Prva igra instalira Apache web server, a druga instalira htop uslužni program.
---
- name: Install httpd
hosts: all
tasks:
yum:
name: httpd
state: Installed
- name: Install htop
yum:
name: htop
state: started
Ako želite preskočiti instalaciju Apache web servera i umjesto toga instalirati htop uslužni program, pokrenite:
ansible-playbook playbook.yml --start-at-task “Install htop”
Na kraju, možete označiti svoje zadatke ili igre dodavanjem opcije oznake u svoju knjigu kako je prikazano. Ovo je zgodno kada imate prilično veliki priručnik i želite da pokrenete određene zadatke iz cijele knjige.
---
- 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"
Za izostavljanje oznaka koristite opcije --skip-tags
kao što je prikazano.
ansible-playbook playbook.yml --skip-tags "Install"
Zaključak
U ovoj temi, proveli smo vas kroz najčešće korištene module u Ansible, kako dohvatiti stdout iz izvršavanja playbook-a za analizu, korištenje uvjeta u playbook-u i kako upravljati greškama koje se mogu pojaviti prilikom pokretanja zadataka. Na kraju, ponovili smo konfiguraciju priručnika i način na koji možete koristiti dodatne opcije da odlučite koje zadatke ćete pokrenuti ako ne namjeravate pokrenuti cijeli playbook.