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.