Kako stvoriti Ansible Plays and Playbooks - Dio 5
U ovom 5. dijelu serije Ansible, objasnit ćemo kako izraditi Ansible Plays i Playbooks koristeći Ansible module.
Ansible isporučuje se sa samostalnim skriptama zvanim moduli koje se koriste u priručnicima za izvršavanje specijaliziranih zadataka na udaljenim čvorovima.
Moduli su korisni za automatizaciju zadataka kao što su upravljanje paketima, arhiviranje i kopiranje datoteka da spomenemo samo neke. Omogućuju vam podešavanje konfiguracijskih datoteka i upravljanje uređajima poput usmjerivača, preklopnika, balansera opterećenja, vatrozida i niza drugih uređaja.
Cilj ove podteme je dati vam pregled raznih zadataka koji se mogu izvršiti pomoću Ansible modula:
Upravljanje paketima u Linuxu
Upravljanje paketima jedan je od najvažnijih i najčešćih zadataka koje obavljaju administratori sustava. Ansible se isporučuje s modulima koji vam pomažu u izvršavanju zadataka upravljanja paketima u sustavima temeljenim na RedHat i Debian.
Relativno ih je lako pogoditi. Postoji apt modul za upravljanje APT paketima za Debian temeljen, stari yum modul za YUM upravljanje paketima i dnf modul povezan s novijim RHEL distribucijama .
U nastavku je nekoliko primjera kako se moduli mogu koristiti u priručniku:
Primjer 1: Instaliranje Apache web poslužitelja na RHEL 8
---
- name: install Apache webserver
hosts: webservers
tasks:
- name: install httpd
dnf:
name: httpd
State: latest
Primjer 2: Instaliranje web poslužitelja Apache na Debian 10
---
- name: install Apache webserver
hosts: databases
tasks:
- name: install Apache webserver
apt:
name: apache2
State: latest
Servisni modul
Servisni modul omogućuje administratorima sustava pokretanje, zaustavljanje, ažuriranje, nadogradnju i ponovno učitavanje usluga na sustavu.
Primjer 1: Pokretanje web poslužitelja Apache
---
- name: Start service httpd, if not started
service:
name: httpd
state: started
Primjer 2: Zaustavljanje web poslužitelja Apache
---
- 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
Kopiraj modul
Kao što naziv sugerira, modul kopiranja kopira datoteke s jednog mjesta na udaljenom računalu na drugo mjesto na istom računalu.
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 direktorija /etc/files/ u direktorij /srv/ kao tecmint > korisnik s dopuštenjima 0644.
Dopuštenja se također mogu prikazati korištenjem simboličkog prikaza kao što je prikazano u zadnjem retku.
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 prikazati kao što je prikazano u zadnjem retku, korisniku se dodjeljuju dozvole za čitanje i pisanje, grupi se dodjeljuju dozvole za pisanje, a ostatak svijetu su dodijeljene dozvole za čitanje.
Modul datoteke
Datotečni modul koristi se za obavljanje mnogih operacija datoteka uključujući stvaranje datoteka i direktorija, dodjeljivanje dopuštenja za datoteke i postavljanje simboličkih veza.
Primjer 1: Izvođenje dopuštenja za datoteke Linuxa
---
- name: Change file ownership, group, and permissions
file:
path: /etc/tecmint.conf
owner: tecmint
group: tecmint
mode: '0644'
Gornja reprodukcija stvara datoteku pod nazivom tecmint.conf u direktoriju /etc postavljajući dopuštenja na 0644.
Primjer 2: Brisanje Linux datoteke
---
- name: Remove file (delete file)
file:
path: /etc/tecmint.conf
state: absent
Ovo uklanja ili briše datoteku tecmint.conf.
Primjer 3: Napravite imenik
---
- name: create a directory if it doesn’t exist
file:
path: /etc/mydirectory
State: directory
mode: '0777'
Ovo će stvoriti direktorij u direktoriju /etc koji postavlja dopuštenja na 0777.
Primjer 4: Rekurzivno brisanje imenika
---
- name: Recursively deleting a directory
file:
path: /etc/tecmint.conf
state: absent
Gornja igra rekurzivno briše direktorij.
Modul Lineinfile
Modul lineinfile je koristan kada želite promijeniti jedan redak 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
Gornja igra postavlja vrijednost SELINUX na onemogućeno.
SELINUX=disabled
Primjer 2: Promjena 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 koristi se za stvaranje komprimirane arhive jedne ili više datoteka. Pretpostavlja se da izvor kompresije postoji na ciljnom odredištu. Nakon arhiviranja, izvorna datoteka se kasnije može izbrisati ili ukloniti pomoću izjave remove=True
.
Primjer 1: Napravite 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: Stvorite i uklonite arhivsku datoteku
- 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, izvorna datoteka /path/to/tecmint briše se nakon dovršetka arhiviranja.
Primjer 3: Napravite arhivsku datoteku
- name: Create a bz2 archive of /path/to/tecmint
archive:
path: /path/to/tecmint
format: bz2
Ovo stvara komprimiranu datoteku u formatu bz2 iz datoteke /path/to/tecmint.
Git modul
Modul upravlja git pregledima softverskih repozitorija.
Primjer 1: Provjerite Git repozitorije
- 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štenih modula, modul command uzima naziv naredbe i kasnije slijedi popis argumenata. Naredba se prosljeđuje na isti način na koji biste upisali u Linux ljusku.
Primjer 1: Izvođenje naredbe
- name: Executing a command using the command module
command: cat helloworld.txt
Primjer 2: Provjerite vrijeme neprekidnog 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
Naredbeni modul dohvaća vrijeme rada udaljenih poslužitelja.
Varijable za dohvaćanje rezultata izvođenja naredbi
Obično se knjige Ansible koriste za izvršavanje zadataka na upravljanim hostovima bez prikazivanja rezultata u naredbenom retku. Međutim, postoje slučajevi u kojima se od vas može tražiti da zabilježite izlaz ili rezultate. U ovom odjeljku, vodimo vas kroz način na koji možete uhvatiti izlaz playbook-a u varijablu i kasnije ga prikazati.
Ansible registar koristi se za hvatanje izlaza zadatka i njegovo spremanje kao 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 modul ‘command’
za definiranje naredbe i ‘register’
za spremanje std izlaza u varijablu.
Za prikaz naredbe upotrijebit ćete modul ‘debug’
uz stdout povratnu vrijednost.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout
Sada, pokrenimo priručnik. U ovom slučaju, našu knjižicu smo nazvali check_disk_space.yml.
ansible-playbook check_disk_space.yml
Kao što ste vidjeli, ispis je zbrkan i otežava praćenje.
Da biste poravnali izlaz i olakšali čitanje, povratnu vrijednost stdout zamijenite sa stdout_lines.
---
- hosts: all
become: yes
tasks:
- name: Execute /boot usage on Hosts
command: 'df -Th /'
register: df
- debug: var=df.stdout_lines
Upotrijebite uvjete za upravljanje izvođenjem igre
Baš kao u programskim jezicima, uvjetne izjave koriste se kada je moguće više od jednog ishoda. Pogledajmo neke od često korištenih uvjetnih iskaza u knjigama za igru Ansible.
Kada izjava
Ponekad ćete možda htjeti izvršavati zadatke na određenim čvorovima, a ne na drugima. Uvjetnu izjavu 'when'
vrlo je jednostavno koristiti i implementirati u priručnik. Kada koristite klauzulu 'when'
jednostavno deklarirajte uvjet uz klauzulu kao što je prikazano:
when: condition
Kada je uvjet zadovoljen, zadatak se izvodi na udaljenom sustavu.
Pogledajmo nekoliko primjera:
Primjer 1: Korištenje operatora When
---
- hosts: all
tasks:
- name: Install Nginx on Debian
apt: name=nginx state=present
when: ansible_os_family == “Debian”
Gornja igra instalira Nginx web poslužitelj na hostove koji pokreću Debian obitelj distroa.
Također možete koristiti operatore OR
i AND
uz uvjetnu naredbu when.
Primjer 2: Korištenje operatora AND 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 operator AND
, obje izjave moraju biti zadovoljene da bi se zadatak izvršio.
Gornja igra instalira Nginx na čvorove koji pokreću obitelj OS-a Debian verzije 18.04. Očito, ovo će biti Ubuntu 18.04.
Primjer 3: Upotreba operatora OR s When
S OR
operatorom, zadatak se izvršava ako je ispunjen bilo koji od uvjeta.
---
- 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 poslužitelje na Debian ili SUSE obitelj OS-a ili na oba.
NAPOMENA: Uvijek koristite dvostruki znak jednakosti ==
kada testirate uvjet.
Uvjeti u petljama
Uvjeti se također mogu koristiti u petlji. Recimo, na primjer, da imate popis više paketa koje je potrebno instalirati na udaljenim čvorovima.
U priručniku ispod imamo niz pod nazivom paketi koji sadrži popis paketa koje je potrebno instalirati. Ovi će se zadaci izvršavati jedan za drugim ako je klauzula required 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 }}”
Konfigurirajte rukovanje pogreškama
Ponekad zadaci ne uspiju pri pokretanju priručnika. Pretpostavimo da izvodite 5 zadataka na 3 poslužitelja kao što je prikazano u priručniku u nastavku. Ako dođe do pogreške na zadatku 3 (Pokretanje MySQL-a) na poslužitelju 2, Ansible će prestati izvršavati preostale zadatke na poslužitelju 2 i pokušati dovršiti preostale zadatke na ostatku poslužitelja.
---
- 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 priručnika, na primjer, zaustavite izvršavanje priručnika, ako jedan od poslužitelja zakaže, 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 poslužitelju, Ansible će zaustaviti izvršenje cijelog playbook-a na svim poslužiteljima i izaći.
Ako želite da playbook zanemari pogreške i nastavi s izvršavanjem preostalog skupa zadataka, upotrijebite opciju ignore_errors: True.
---
- name: Install Software packages
hosts: server1, server2, server3
tasks:
- name: Install dependencies
<< some code >>
ignore_errors: True
Stvorite priručnike za konfiguraciju sustava u određeno stanje
U ovom odjeljku pogledat ćemo neke dodatne opcije koje su dostupne prilikom pokretanja priručnika.
Počnimo s načinom rada Provjeri ili opcijom Rad na suho. Opcija suhog rada ili načina provjere koristi se prilikom pokretanja priručnika kako bi se provjerilo hoće li se naići na pogreške i hoće li se izvršiti promjene na upravljanim hostovima. Međutim, ne čini nikakve promjene na udaljenim čvorovima.
Na primjer, za suho pokretanje priručnika pod nazivom httpd.yml
koji instalira i pokreće Apache web poslužitelj:
ansible-playbook httpd.yml --check
Druga opcija koju trebamo pogledati je opcija --start-at-task
. Ovo se koristi kada se navodi naziv zadatka s kojim bi priručnik trebao započeti ili kojim bi trebao početi.
Uzmimo primjer: U priručniku u nastavku navode se 2 zadatka: prva igra instalira web poslužitelj Apache, a druga instalira uslužni program htop.
---
- 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 poslužitelja 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 svoj playbook kao što je prikazano. Ovo je zgodno kada imate prilično veliku knjižicu i želite pokrenuti 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 smo vas temi proveli kroz najčešće korištene module u Ansibleu, kako dohvatiti stdout iz izvršavanja priručnika za analizu, korištenje uvjeta u priručniku i kako upravljati pogreškama koje se mogu pojaviti prilikom izvođenja zadaci. Na kraju, ponovili smo konfiguraciju priručnika i kako možete koristiti dodatne opcije za odlučivanje koje zadatke pokrenuti ako ne namjeravate pokrenuti cijeli priručnik.