Kuidas luua mängukavasid ja esitusraamatuid - 5. osa


Selles Ansible Series 5. osas selgitame, kuidas luua Ansible Plays ja Playbooks, kasutades Ansible mooduleid.

Võimalikud eraldiseisvate skriptidega laevad, mida nimetatakse mooduliteks ja mida kasutatakse mänguraamatutes kaugsõlmedes spetsiaalsete ülesannete täitmiseks.

Moodulid on kasulikud selliste ülesannete automatiseerimiseks nagu pakettide haldamine, failide arhiveerimine ja kopeerimine, mainides vaid mõnda. Need võimaldavad teil konfiguratsioonifailides muudatusi teha ja hallata selliseid seadmeid nagu ruuterid, lülitid, koormuse tasakaalustajad, tulemüürid ja palju muid seadmeid.

Selle alateema eesmärk on anda teile ülevaade erinevatest ülesannetest, mida Ansible moodulid saavad täita:

Pakettide haldamine Linuxis

Pakettide haldamine on süsteemihaldurite üks olulisemaid ja sagedasemaid ülesandeid. Võimalikud tarned koos moodulitega, mis aitavad teil täita paketihalduse ülesandeid nii RedHati kui ka Debiani põhistes süsteemides.

Neid on suhteliselt lihtne ära arvata. Uute RHEL-i jaotustega on seotud apt-moodul YUM-i pakettide haldamiseks ja dnf-moodul.

Allpool on toodud mõned näited selle kohta, kuidas mooduleid saab mänguraamatus kasutada:

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

Teenusemoodul

Teenusemoodul võimaldab süsteemiadministraatoritel süsteemi teenuseid käivitada, peatada, värskendada, uuendada ja uuesti laadida.

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

Kopeeri moodul

Nagu nimigi ütleb, kopeerib moodul copy failid kaugarvuti ühest kohast sama masina teise asukohta.

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

Esitusraamat kopeerib konfiguratsioonifaili tecmint.conf kataloogist/etc/files/kataloogi kataloogi/srv/kataloogi kui tecmint kasutaja, kellel on 0644 õigused.

Lube saab esitada ka sümboolse kujutise abil, nagu on näidatud viimasel real.

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

Eelmise näite õigusi saab kujutada nii, nagu on näidatud viimasel real. Kasutajale määratakse lugemis- ja kirjutamisõigused, rühmale kirjutamisõigused ja muule maailmale lugemisõigused.

Failimoodul

Failimoodulit kasutatakse paljude failitoimingute, sealhulgas failide ja kataloogide loomiseks, faililubade määramiseks ja sümbolilinkide määramiseks.

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

Ülaltoodud esitus loob faili nimega tecmint.conf kataloogi/etc seadistamisõigustes väärtusele 0644.

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

See eemaldab või kustutab faili tecmint.conf.

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

See loob kataloogi/etc kataloogi, määrates õigused 0777-le.

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

Ülaltoodud esitus kustutab kataloogi rekursiivselt.

Lineinfile moodul

Lineinfile moodulist on abi, kui soovite failis ühte rida muuta. See võib asendada olemasolevat liini.

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

Eespool esitatud mäng seab SELINUX-i väärtuseks keelatud.

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

See lisab faili/etc/hosts kirje 10.200.50.51 linux-console.net.

Arhiivimoodul

Arhiivimoodulit kasutatakse ühe või mitme faili tihendatud arhiivi loomiseks. Eeldatakse, et sihtkohas on olemas tihendusallikas. Pärast arhiivimist saab lähtefaili hiljem kustutada või eemaldada, kasutades lauset 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

Ülaltoodud näidendis kustutatakse lähtefail/path/to/tecmint pärast arhiivimise lõpetamist.

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

See loob failist/path/to/tecmint tihendatud faili bz2-vormingus.

Git moodul

Moodul haldab tarkvarahoidlate git kassasid.

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

Käsumoodul

Üks kõige sagedamini kasutatavatest moodulitest võtab käsumoodul käsu nime ja sellele järgneb argumentide loend. Käsk on edastatud samamoodi, nagu sisestaksite Linuxi kesta.

- 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

Käsumoodul otsib kaugserverite tööaja.

Muutujad käskude käitamise tulemuste hankimiseks

Tavaliselt kasutatakse rakendust Ansible hallatavate hostide ülesannete täitmiseks ilma väljundit käsureal kuvamata. Siiski võib juhtuda, et teil tuleb nõuda väljundi või tulemuste jäädvustamist. Selles osas tutvustame, kuidas saate muutujaga esitusraamatu väljundit jäädvustada ja seda hiljem kuvada.

Antud registrit kasutatakse ülesande väljundi hõivamiseks ja selle muutuja salvestamiseks. Seejärel sisaldab muutuja ülesande stdouti.

Oletame näiteks, et soovite kontrollida vastavate juurkataloogide hallatavate sõlmede kettakasutust käsu df -Th/ abil. Kasutate mooduli ‘command’ käsu määramiseks ja ‘register’ standardväljundi muutujasse salvestamiseks.

Käsu kuvamiseks kasutate mooduli ‘silumine’ kõrval stdout tagastusväärtust.

---

 - hosts: all
   become: yes

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

     - debug: var=df.stdout

Nüüd laseme mängida raamatut. Sel juhul oleme oma mänguraamatu nimetanud check_disk_space.yml.

# ansible-playbook check_disk_space.yml

Nagu nägite, on väljund kõik segamini ja see muudab selle jälgimise keeruliseks.

Väljundi joondamiseks ja lugemise hõlbustamiseks asendage stdout return väärtus stdout_lines.

---

 - hosts: all
   become: yes

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

     - debug: var=df.stdout_lines

Esituse täitmise juhtimiseks kasutage tingimisi

Täpselt nagu programmeerimiskeeltes, kasutatakse ka tingimuslauseid, kui võimalik on mitu tulemust. Vaatame mõningaid Ansible playbooksis tavaliselt kasutatavaid tingimuslauseid.

Mõnikord võite soovida täita ülesandeid konkreetsetes sõlmedes ja mitte teistes. Tingimuslauset millal on mänguraamatus üsna lihtne kasutada ja rakendada. Kasutades klauslit millal , deklareerige lihtsalt klausliga külgnev tingimus, nagu näidatud:

when: condition

Kui tingimus on täidetud, täidetakse ülesanne kaugsüsteemis.

Vaatame mõnda näidet:

---
- hosts: all

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

Ülaltoodud mäng installib Nginxi veebiserveri hostidele, mis käitavad Debiase distroside perekonda.

Tingimuslause kõrval saate kasutada ka operaatorit OR ja 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”

Operaatori AND kasutamisel peavad toimingu täitmiseks mõlemad laused olema täidetud.

Ülaltoodud mäng installib Nginxi Nodes, kus töötab OS Debiani perekond, mille versioon on 18.04. Ilmselt on selleks Ubuntu 18.04.

Operaatori OR abil täidetakse ülesanne, kui üks neist tingimustest on täidetud.

---
- hosts: all

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

Ülaltoodud mäng installib Nginxi veebiserverid kas Debiani või OS-i perekonda SUSE või mõlemasse.

MÄRKUS. Tingimuse testimisel kasutage alati topeltvõrdusmärki == .

Tingimused silmustes

Tingimusi saab kasutada ka silmusena. Oletame näiteks, et teil on loend mitmest paketist, mis tuleb kaugsõlmedesse installida.

Allolevas mänguraamatus on meil massiiv nimega paketid, mis sisaldavad installimist vajavate pakettide loendit. Need ülesanded täidetakse üksteise järel, kui nõutud klausli väärtuseks on seatud Tõene.

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

Konfigureerige veakäsitlus

Mõnikord ebaõnnestuvad ülesanded mänguraamatute käivitamisel. Oletame, et käitate 5 ülesannet kolmes serveris, nagu on näidatud allolevas mänguraamatus. Kui serveri 2 ülesandes 3 (MySQL-i käivitamine) ilmneb tõrge, peatab Ansible ülejäänud serveris 2 olevate ülesannete täitmise ja proovib ülejäänud serverites ülejäänud ülesanded täita.

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

Näiteks kui soovite, et esitusraamatu täitmine oleks järjepidev, peatage esitusraamatu täitmine, kui mõni serveritest ebaõnnestub, lisage suvand.

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

Nii peatab Ansible ühe ülesande ühes serveris nurjumise korral kogu esitusraamatu käivitamise kõigis serverites ja väljub.

Kui soovite, et playbook ignoreeriks vigu ja jätkaks ülejäänud ülesannete komplekti täitmist, kasutage valikut ignore_errors: True.

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

Looge mänguraamatud süsteemide seadistamiseks määratud olekusse

Selles jaotises vaatleme mõningaid lisavõimalusi, mis on saadaval mänguraamatu käitamisel.

Alustame valikuga Check mode või Dry run. Kuivtõusu või kontrollirežiimi suvandit kasutatakse playbooki käivitamisel, et kontrollida, kas ilmnes vigu ja kas hallatavates hostides tehakse muudatusi. See aga ei tee kaugsõlmedes muudatusi.

Näiteks kui soovite käivitada Apache veebiserveri käitamise installiva ja käivitava esitusraamatu nimega httpd.yml :

# ansible-playbook httpd.yml --check

Teine võimalus, mida peame vaatama, on valik --start-at-task . Seda kasutatakse selle ülesande nime määramisel, millest mänguraamat peaks algama või algama.

Võtame näite: Allolevas mänguraamatus on välja toodud kaks ülesannet: esimene mäng installib Apache'i veebiserveri ja teine htop-utiliidi.

---
 - name: Install httpd

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

- name: Install htop

      yum:  
      name: htop
      state: started

Kui soovite Apache'i veebiserveri installimise vahele jätta ja selle asemel installida htop utiliidi käitamine:

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

Lõpuks saate oma ülesanded või mängud sildistada, lisades oma mängukirjale sildi valiku, nagu näidatud. See on kasulik, kui teil on üsna suur mänguraamat ja soovite käivitada konkreetseid ülesandeid kogu esitusraamatust.

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

Siltide väljajätmiseks kasutage valikuid --skip-tags , nagu näidatud.

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

Selles teemas tutvustasime teid jaotises Ansible levinumate moodulite abil, kuidas hankida analüüsimiseks esitusraamatu täitmisest stdout, kasutades käsiraamatus olevaid tingimisi ja kuidas hallata ülesannete käivitamisel tekkida võivaid tõrkeid. Lõpuks tutvustasime esitusraamatute konfiguratsiooni ja seda, kuidas saate lisavõimaluste abil otsustada, milliseid ülesandeid käivitada, kui te ei kavatse kogu esitusraamatut käivitada.