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.