Hvernig á að búa til Ansible leikrit og leikrit - hluti 5


Í þessum hluta 5 af Ansible seríunni munum við útskýra hvernig á að búa til Ansible leikrit og leikbækur með því að nota Ansible einingar.

Ansible skip með sjálfstæðar forskriftir sem kallast einingar sem eru notaðar í leikbókum til að framkvæma sérhæfð verkefni á ytri hnútum.

Einingar koma sér vel til að gera sjálfvirk verkefni eins og pakkastjórnun, geymslu og afrita skrár svo aðeins sé nefnt. Þeir gera þér kleift að gera fínstillingar á stillingarskrám og stjórna tækjum eins og beinum, rofum, álagsjafnara, eldveggjum og fjölda annarra tækja.

Markmið þessa undirefnis er að gefa þér yfirsýn yfir ýmis verkefni sem hægt er að framkvæma með Ansible einingum:

Pakkastjórnun í Linux

Pakkastjórnun er eitt mikilvægasta og algengasta verkefnið sem kerfisstjórar bera með sér. Ansible er með einingar sem hjálpa þér að framkvæma pakkastjórnunarverkefni bæði í RedHat og Debian byggðum kerfum.

Þeir eru tiltölulega auðvelt að giska á. Það er viðeigandi eining fyrir YUM pakkastjórnun og dnf eining sem tengist nýrri RHEL dreifingu.

Hér að neðan eru nokkur dæmi um hvernig hægt er að nota einingarnar í leikbók:

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

Þjónustueining

Þjónustueiningin gerir kerfisstjórum kleift að ræsa, stöðva, uppfæra, uppfæra og endurhlaða þjónustu á kerfinu.

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

Afrita mát

Eins og nafnið gefur til kynna afritar afritareining skrár frá einum stað á ytri vélinni á annan stað á sömu vél.

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

Leikbókin afritar stillingarskrána tecmint.conf úr /etc/files/ möppunni í /srv/ möppuna sem tecmint notanda með 0644 heimildum.

Einnig er hægt að tákna heimildir með táknrænni framsetningu eins og sýnt er í síðustu línu.

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

Heimildirnar í fyrra dæmi má tákna eins og sýnt er í síðustu línu, Notandanum er úthlutað les- og skrifheimildum, hópnum er úthlutað skrifheimildum og umheiminum er úthlutað lesheimildum.

Skráareining

Skráareiningin er notuð til að framkvæma margar skráaraðgerðir, þar á meðal að búa til skrár og möppur, úthluta skráarheimildum og setja tákntengla.

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

Ofangreind spilun býr til skrá sem heitir tecmint.conf í /etc möppunni sem stillir heimildir á 0644.

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

Þetta fjarlægir eða eyðir skránni tecmint.conf.

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

Þetta mun búa til möppu í /etc möppunni sem stillir heimildir á 0777.

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

Ofangreind spilun eyðir möppu endurtekið.

Lineinfile Module

Lineinfile einingin er gagnleg þegar þú vilt breyta einni línu í skrá. Það getur komið í stað núverandi línu.

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

Spilunin hér að ofan setur SELINUX gildi á óvirkt.

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

Þetta bætir færslunni 10.200.50.51 linux-console.net við /etc/hosts skrána.

Skjalasafnseining

Skjalasafnseining er notuð til að búa til þjappað skjalasafn með einni eða mörgum skrám. Það gerir ráð fyrir að samþjöppunargjafinn sé til staðar sé til staðar á áfangastaðnum. Eftir geymslu er hægt að eyða upprunaskránni síðar eða fjarlægja hana með setningunni 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

Í spiluninni hér að ofan er frumskránni /path/to/tecmint eytt eftir að geymslunni er lokið.

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

Þetta býr til þjappaða skrá á bz2 sniði úr /path/to/tecmint skránni.

Git Module

Einingin stjórnar git-úttektum á hugbúnaðargeymslum.

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

Skipunareining

Ein af algengustu einingunum, skipanaeiningin tekur skipanafnið og síðar fylgt eftir með lista yfir rök. Skipunin er samþykkt á sama hátt og þú myndir slá inn í Linux skel.

- 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

Skipunareiningin sækir spennutíma ytri netþjóna.

Breytur til að sækja niðurstöður hlaupandi skipana

Venjulega eru Ansible leikbækur notaðar til að framkvæma verkefni á stýrðum gestgjöfum án þess að birta úttakið á skipanalínunni. Hins vegar eru dæmi um að þú gætir þurft að fanga úttakið eða niðurstöðurnar. Í þessum hluta göngum við í gegnum hvernig þú getur fanga úttak leikbókar í breytu og birt hana síðar.

Ansible skrá er notuð til að fanga úttak verkefnis og vista það breytu. Breytan mun síðan innihalda stdout verkefnisins.

Til dæmis, við skulum gera ráð fyrir að þú viljir athuga disknotkun á stýrðum hnútum í viðkomandi rótarskrám með df -Th / skipuninni. Þú ætlar að nota ‘skipun’ eininguna til að skilgreina skipunina og ‘register’ til að vista std úttakið í breytu.

Til að birta skipunina muntu nota ‘debug’ eininguna ásamt stdout-skilagildinu.

---

 - hosts: all
   become: yes

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

     - debug: var=df.stdout

Nú skulum við keyra leikbókina. Í þessu tilviki höfum við nefnt leikbókina okkar check_disk_space.yml.

# ansible-playbook check_disk_space.yml

Eins og þú hefur séð er framleiðslan öll í rugli og gerir það erfitt að fylgjast með.

Til að samræma úttakið og gera það auðveldara að lesa skaltu skipta út stdout skilgildinu fyrir stdout_lines.

---

 - hosts: all
   become: yes

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

     - debug: var=df.stdout_lines

Notaðu skilyrði til að stjórna framkvæmd leiksins

Rétt eins og í forritunarmálum eru skilyrtar staðhæfingar notaðar þegar fleiri en ein niðurstaða er möguleg. Við skulum skoða nokkrar af algengum skilyrtum yfirlýsingum í Ansible leikbókum.

Stundum gætirðu viljað framkvæma verkefni á tilteknum hnútum en ekki öðrum. Skilyrt setningin when er frekar auðveld í notkun og útfærsla í leikbók. Þegar þú notar when setninguna skaltu einfaldlega lýsa yfir ástandinu sem liggur að setningunni eins og sýnt er:

when: condition

Þegar skilyrðinu er fullnægt er verkefnið framkvæmt á ytra kerfinu.

Við skulum skoða nokkur dæmi:

---
- hosts: all

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

Leikritið hér að ofan setur upp Nginx vefþjón á vélum sem keyra Debian fjölskyldu dreifingar.

Þú getur líka notað OR og AND rekstraraðilana ásamt þegar skilyrtu yfirlýsingunni.

---
- hosts: all

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

Þegar AND stjórnandinn er notaður verða báðar setningarnar að vera uppfylltar til að hægt sé að framkvæma verkefnið.

Leikritið hér að ofan setur upp Nginx á hnútum sem keyra Debian fjölskyldu OS sem er útgáfa 18.04. Augljóslega mun þetta vera Ubuntu 18.04.

Með OR rekstraraðila er verkefnið framkvæmt ef annað hvort skilyrðanna er uppfyllt.

---
- hosts: all

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

Leikritið hér að ofan setur upp Nginx vefþjóna annað hvort á Debian eða SUSE stýrikerfisfjölskyldu eða þeim báðum.

ATHUGIÐ: Gættu þess alltaf að nota tvöfalda jafnréttismerkið == þegar ástand er prófað.

Skilyrði í lykkjum

Skilyrði er einnig hægt að nota í lykkju. Segjum til dæmis að þú sért með lista yfir marga pakka sem þarf að setja upp á ytri hnúta.

Í leikbókinni hér að neðan höfum við fylki sem kallast pakkar sem inniheldur lista yfir pakka sem þarf að setja upp. Þessi verkefni verða unnin hvert á eftir öðru ef nauðsynleg ákvæði er stillt á 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 }}”  

Stilla villumeðferð

Stundum mistakast verkefni þegar spilabækur eru keyrðar. Gerum ráð fyrir að þú sért að keyra 5 verkefni á 3 netþjónum eins og sýnt er í leikbókinni hér að neðan. Ef villa kemur upp í verkefni 3 (ræsir MySQL) á þjóni 2 mun Ansible hætta að framkvæma þau verkefni sem eftir eru á þjóni 2 og reyna að klára þau verkefni sem eftir eru á hinum þjónunum.

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

Ef þú vilt samkvæmni í framkvæmd leikbókarinnar, til dæmis, stöðvaðu framkvæmd leikbókar, ef einhver af þjónunum bilar, bættu við valkostinum.

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

Á þennan hátt, ef eitt verkefni mistekst á einum netþjóni, mun Ansible stöðva framkvæmd allrar leikbókarinnar á öllum netþjónum og hætta.

Ef þú vilt að leikbókin hunsi villurnar og haldi áfram að framkvæma þau verk sem eftir eru, notaðu þá valkostinn ignore_errors: True.

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

Búðu til Playbooks til að stilla kerfi í tilgreint ástand

Í þessum hluta skoðum við nokkra viðbótarvalkosti sem eru í boði þegar leikbók er keyrð.

Við skulum byrja á Athugaðu stillingu eða Dry run valkostinum. Valmöguleikinn fyrir þurrkeyrslu eða athugunarham er notaður þegar spilunarbók er keyrð til að athuga hvort einhverjar villur komi upp og hvort einhverjar breytingar séu gerðar á stýrðum vélum. Það gerir hins vegar engar breytingar á ytri hnútunum.

Til dæmis, til að þurrkeyra leikbók sem heitir httpd.yml sem setur upp og ræsir Apache vefþjóninn:

# ansible-playbook httpd.yml --check

Hinn valmöguleikinn sem við þurfum að skoða er valmöguleikinn --byrja-við-verkefni. Þetta er notað þegar tilgreint er heiti verkefnisins sem leikbókin á að byrja eða byrja á.

Tökum dæmi: Leikbókin hér að neðan lýsir 2 verkefnum: Fyrsta leikritið setur upp Apache vefþjón og annað setur upp htop tólið.

---
 - name: Install httpd

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

- name: Install htop

      yum:  
      name: htop
      state: started

Ef þú vilt sleppa því að setja upp Apache vefþjón og setja í staðinn upp htop tól keyra:

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

Að lokum geturðu merkt verkefnin þín eða leikrit með því að bæta merkisvalkostinum við leikbókina þína eins og sýnt er. Þetta kemur sér vel þegar þú ert með nokkuð stóra leikbók og þú vilt keyra ákveðin verkefni úr allri leikbókinni.

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

Til að sleppa merkjunum skaltu nota --skip-tags valkostina eins og sýnt er.

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

Í þessu efni fórum við í gegnum algengu einingarnar í Ansible, hvernig á að sækja stdout úr framkvæmd leikbókar til greiningar, með því að nota skilyrði í leikbókinni og hvernig á að stjórna villum sem geta komið upp þegar verkefni eru keyrð. Að lokum rifjuðum við upp uppsetningu leikbóka og hvernig þú getur notað fleiri valkosti til að ákveða hvaða verkefni á að keyra ef þú ætlar ekki að keyra alla leikbókina.