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.