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.