Kako ustvariti odgovorne predstave in knjige z igrami - 5. del


V tem 5. delu Ansible Series bomo razložili, kako ustvariti Ansible Plays in Playbooks z uporabo modulov Ansible.

Ansible je opremljen s samostojnimi skripti, imenovanimi moduli, ki se uporabljajo v knjigah za izvajanje posebnih nalog na oddaljenih vozliščih.

Moduli so priročni za avtomatizacijo nalog, kot so upravljanje paketov, arhiviranje in kopiranje datotek, če omenimo le nekatere. Omogočajo vam prilagajanje konfiguracijskih datotek in upravljanje naprav, kot so usmerjevalniki, stikala, izravnalniki obremenitve, požarni zidovi in številne druge naprave.

Cilj te podteme je podati pregled različnih nalog, ki jih lahko opravijo moduli Ansible:

Upravljanje paketov v Linuxu

Upravljanje paketov je ena najpomembnejših in najpogostejših nalog sistemskih skrbnikov. Ansible je dobavljen z moduli, ki vam pomagajo izvajati naloge upravljanja paketov v sistemih RedHat in Debian.

Sorazmerno jih je enostavno uganiti. Obstajata apt modul za upravljanje paketov YUM in dnf modul, povezan z novejšimi distribucijami RHEL.

Spodaj je nekaj primerov uporabe modulov v knjigi iger:

---
- name: install Apache webserver
  hosts: webservers

  tasks:
       - name: install httpd
         dnf:  
          name: httpd  
          State: latest
---
- name: install Apache webserver
  hosts: databases

  tasks:
       - name: install Apache webserver
         apt:  
          name: apache2  
          State: latest

Servisni modul

Servisni modul sistemskim skrbnikom omogoča zagon, zaustavitev, posodobitev, nadgradnjo in ponovno nalaganje storitev v sistemu.

---
- name: Start service httpd, if not started
  service:
    name: httpd
    state: started
---
- name: Stop service httpd
  service:
    name: httpd
    state: stopped
---
- name: Restart network service for interface eth0
  service:
    name: network
    state: restarted
    args: enp2s0

Modul za kopiranje

Kot že ime pove, modul za kopiranje kopira datoteke z enega mesta na oddaljeni napravi na drugo mesto na istem računalniku.

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Predvajalna knjiga kopira konfiguracijsko datoteko tecmint.conf iz/etc/files/directory v/srv/directory kot uporabnik tecmint z dovoljenji 0644.

Dovoljenja je mogoče predstaviti tudi s simbolično predstavitvijo, kot je prikazano v zadnji vrstici.

---
- 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

Dovoljenja v prejšnjem primeru so lahko predstavljena, kot je prikazano v zadnji vrstici. Uporabniku so dodeljena dovoljenja za branje in pisanje, skupini so dodeljena dovoljenja za pisanje, preostali svet pa ima dovoljenja za branje.

Datotečni modul

Datotečni modul se uporablja za izvajanje številnih operacij z datotekami, vključno z ustvarjanjem datotek in imenikov, dodeljevanjem dovoljenj datotek in nastavitvijo povezav.

---
- name: Change file ownership, group, and permissions
  file:
    path: /etc/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Zgornje predvajanje ustvari datoteko z imenom tecmint.conf v dovoljenjih za nastavitev imenika/etc na 0644.

---
- name: Remove file (delete file)
  file:
    path: /etc/tecmint.conf
    state: absent

S tem odstranite ali izbrišete datoteko tecmint.conf.

---
- name: create a directory if it doesn’t exist
  file:
    path: /etc/mydirectory
    State: directory
    mode: '0777'

To bo ustvarilo imenik v dovoljenjih za nastavitev imenika/etc na 0777.

---
- name: Recursively deleting a  directory
  file:
    path: /etc/tecmint.conf
    state: absent

Zgornje predvajanje rekurzivno izbriše imenik.

Modul Lineinfile

Modul lineinfile je koristen, če želite spremeniti eno vrstico v datoteki. Lahko nadomesti obstoječo linijo.

---
 - name: Ensure SELinux is set to enforcing mode
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=disabled

Zgornja igra nastavi vrednost SELINUX na onemogočeno.

SELINUX=disabled
---
- 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

To v datoteko/etc/hosts doda vnos 10.200.50.51 linux-console.net.

Arhivski modul

Arhivski modul se uporablja za ustvarjanje stisnjenega arhiva ene ali več datotek. Predpostavlja, da je vir stiskanja prisoten na ciljnem cilju. Po arhiviranju lahko izvorno datoteko kasneje izbrišete ali odstranite z izjavo remove = True .

- 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
- 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

V zgornjem predvajanju se izvorna datoteka/pot/do/tecmint po zaključku arhiviranja izbriše.

- name: Create a bz2 archive of /path/to/tecmint
  archive:
    path: /path/to/tecmint
    format: bz2

To ustvari stisnjeno datoteko v obliki bz2 iz datoteke/path/to/tecmint.

Git modul

Modul upravlja git checkout skladišč programske opreme.

- git:
    repo: 'https://foosball.example.org/path/to/repo.git'
    dest: /srv/checkout
    version: release-0.22

Ukazni modul

Eden najpogosteje uporabljenih modulov, ukazni modul prevzame ime ukaza in kasneje sledi seznam argumentov. Ukaz je poslan na enak način, kot bi vnesli v lupino Linuxa.

- name: Executing a command using the command module
  command: cat helloworld.txt
---
 - 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

Ukazni modul pridobi uptime oddaljenih strežnikov.

Spremenljivke za pridobivanje rezultatov izvajanih ukazov

Običajno se Ansible playbooks uporabljajo za izvajanje nalog na upravljanih gostiteljih, ne da bi prikazali izhodne podatke v ukazni vrstici. Vendar obstajajo primeri, da boste morda morali zajeti izhod ali rezultate. V tem razdelku vas bomo vodili po tem, kako lahko zajemate izhod knjige iger v spremenljivko in jo kasneje prikažete.

Ansible register se uporablja za zajem izhoda naloge in shranjevanje spremenljivke. Spremenljivka bo nato vsebovala stdout naloge.

Predpostavimo na primer, da želite z uporabo ukaza df -Th/ preveriti uporabo diskov upravljanih vozlišč v ustreznih korenskih imenikih. Z modulom ‘command’ boste definirali ukaz in ‘register’ shranili izhod std v spremenljivko.

Za prikaz ukaza boste uporabili modul ‘odpravljanje napak’ poleg vrnjene vrednosti stdout.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout

Zdaj pa zaženimo knjigo iger. V tem primeru smo svojo knjigo iger poimenovali check_disk_space.yml.

# ansible-playbook check_disk_space.yml

Kot ste že videli, je rezultat povsem zmešan in otežuje sledenje.

Za poravnavo izhoda in lažje branje zamenjajte vrnjeno vrednost stdout s stdout_lines.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout_lines

Za nadzor izvajanja predvajanja uporabite pogoje

Tako kot v programskih jezikih se tudi pogojni stavki uporabljajo, kadar je možnih več izidov. Oglejmo si nekaj pogostih pogojnih stavkov v knjigah z igrami Ansible.

Včasih boste morda želeli izvajati naloge na določenih vozliščih in ne na drugih. Pogojni stavek when je dokaj enostaven za uporabo in izvajanje v knjigi iger. Ko uporabljate stavek when , preprosto navedite pogoj ob stavku, kot je prikazano:

when: condition

Ko je pogoj izpolnjen, se opravilo izvede na oddaljenem sistemu.

Oglejmo si nekaj primerov:

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian”

Zgornja igra namesti spletni strežnik Nginx na gostitelje, ki poganjajo družino distribucij Debian.

Poleg pogojnega stavka when lahko uporabite tudi operaterja ALI in AND .

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” and
           ansible_distribution_version == “18.04”

Pri uporabi operaterja AND morata biti oba stavka izpolnjena za izvajanje naloge.

Zgornja igra namesti Nginx na Nodes, ki izvajajo družino OS Debian, ki je različice 18.04. Očitno bo to Ubuntu 18.04.

Z operaterjem OR se naloga izvede, če je izpolnjen kateri koli pogoj.

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” or
	      Ansible_os_family == “SUSE”

Zgornja igra namesti spletne strežnike Nginx v družini OS Debian ali SUSE ali na obeh.

OPOMBA: Pri preskušanju pogoja vedno uporabite znak dvojne enakosti == .

Pogojniki v zank

Pogojniki se lahko uporabljajo tudi v zanki. Recimo, da imate na primer seznam več paketov, ki jih je treba namestiti na oddaljena vozlišča.

V spodnji knjigi iger imamo polje z imenom paketi, ki vsebuje seznam paketov, ki jih je treba namestiti. Te naloge se bodo izvajale ena za drugo, če je zahtevana klavzula nastavljena 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 obravnavo napak

Včasih naloge pri zagonu knjig zgrešijo. Predpostavimo, da izvajate 5 nalog na 3 strežnikih, kot je prikazano v spodnji knjigi iger. Če pride do napake pri opravilu 3 (Zagon MySQL) na strežniku 2, bo Ansible prenehal izvajati preostala opravila na strežniku 2 in poskušal dokončati preostala opravila na ostalih strežnikih.

---
 - 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 >>

Če želite doslednost pri izvajanju knjige iger, na primer ustaviti izvajanje knjige iger, če eden od strežnikov ne uspe, dodajte možnost.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   any_errors_fatal:  true
   tasks:

Tako bo, če ena naloga ne uspe na enem strežniku, Ansible ustavil izvajanje celotne knjige iger na vseh strežnikih in izstopil.

Če želite, da playbook prezre napake in nadaljuje z izvajanjem preostalega sklopa nalog, uporabite možnost ignore_errors: True.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>
     ignore_errors: True

Ustvarite Playbooks za konfiguracijo sistemov v določeno stanje

V tem poglavju si ogledujemo nekatere dodatne možnosti, ki so na voljo pri zagonu knjige z igrami.

Začnimo z načinom preverjanja ali možnostjo suhega teka. Možnost suhega teka ali načina preverjanja se uporablja pri zagonu knjige za predvajanje, da preveri, ali se bodo pojavile kakršne koli napake in ali bo na upravljanih gostiteljih prišlo do sprememb. Vendar na oddaljenih vozliščih ne spreminja.

Če želite na primer suho zagnati knjigo predvajanja z imenom httpd.yml , ki namesti in zažene zagon spletnega strežnika Apache:

# ansible-playbook httpd.yml --check

Druga možnost, ki si jo moramo ogledati, je možnost --start-at-task . To se uporablja pri določanju imena naloge, s katero naj se začne ali začne predvajati.

Vzemimo primer: Spodnja knjižica opisuje 2 nalogi: prvo predvajanje namesti spletni strežnik Apache, drugo pa pripomoček htop.

---
 - name: Install httpd

   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

- name: Install htop

      yum:  
      name: htop
      state: started

Če želite preskočiti namestitev spletnega strežnika Apache in namesto tega namestiti pripomoček htop:

# ansible-playbook playbook.yml --start-at-task “Install htop”

Nazadnje lahko svoje naloge ali igre označite tako, da v svojo knjigo predvajanja dodate oznako, kot je prikazano. To je priročno, če imate precej veliko knjigo iger in želite zagnati določena opravila iz celotne knjige iger.

---
 - 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"

Če želite oznake izpustiti, uporabite možnosti --skip-tags , kot je prikazano.

# ansible-playbook playbook.yml --skip-tags "Install"

V tej temi smo vas popeljali skozi najpogosteje uporabljene module v programu Ansible, kako pridobiti stdout iz izvajanja playbook za analizo, uporabiti pogoje v playbook in kako upravljati napake, ki se lahko pojavijo med izvajanjem nalog. Nazadnje smo povzeli še konfiguracijo knjig iger in kako lahko z dodatnimi možnostmi določite, katere naloge boste izvajali, če ne nameravate zagnati celotne knjige iger.