Ansible
Tutvustus
Ansible on vabavaraline (GPL)[1] konfiguratsiooni ja seadistuse haldamise tarkvaraplatvorm.[2]
Konfiguratsiooni hoidmiseks kasutatakse YAML'i faile mis võivad olla omavahel hierarhiliselt seotud.[3] Ansible on kirjutatud Python'is ning seadistuse vahendamiseks kasutatakse SSH protokolli (Python'i paramiko teeki või OS'i ssh käsku rakendades). Hallatava masina eelduseks on sissetulevate SSH ühenduste lubamine ja Python'i interpretaatori olemasolu (vähemalt versioon 2.4), eraldiseisvat klienti või agenti ei ole.[4]
Tarkvara loojaks on Michael DeHaan, kes eelnevalt on loonud Cobbler'i ning olnud Puppet'i arendaja.[5]
Nimetus "Ansible" on pärit O.S.Card'i raamatust Enderi mäng, kus kirjeldatakse samanimelist valguse kiirusest kiiremat suhtlusprotokolli.[6]
Ansible'ile on võimalik osta ka ärikliendi tuge.[7]
Erinevused levinud alternatiividega
Ansible peamine erinevus oma konkurentidega Puppet ja Chef on agendi kui sellise puudumine. Klientide seadistamiseks kasutatakse juba (enamus juhtudel) olemasolevaid vahendeid - SSH ja Python. [8]
SaltStack on Ansible'ga vägagi sarnane, ent erineb klientidega suhtlemise osas, kasutades 0mq'd ning täiendades seda enda poolt AES krüpteeringuga (milles võib aeg-ajalt esineda vigasid[9]). Ansible poolt kasutatav SSH ei lisa süsteemi täiendavaid ründevektoreid.[10]
Kasutamine
Paigaldamine
Ansible paigaldamiseks on võimalik tõmmata see otse projekti GitHub'i repost või paigaldada operatsioonisüüsteemi pakihaldustarkvara abil.[4]
- Ansible paigaldamine APT'i abil
sudo apt-get install ansible
- Versiooni (ja paigaldatuse kontroll)
ansible --version
Esmane seadistamine
Süsteemne seadistusfail on /etc/ansible/ansible.cfg, kuid iga kasutaja võib isiklike seadete hoidmiseks tekitada faili .ansible.cfg enda kodukataloogi. Kasutaja kodukataloogis olevad seaded on süsteemse seadistusfaili suhtes ülemuslikud.[11]
Need muudatused on (rangelt) soovituslik sisse viia kas kasutaja seadistusfailis või süsteemses seadistusfailis.
- NB: Järgnevad muudatused asuvad sektsioonis [defaults]''!
Seadistatavaid sihtmasinaid kirjeldava faili teekonna muutmine
hostfile=~/ansible/hosts
Kasutatava protokolli muutmine SSH'ks et vähendada turvariske.[10] Autori isikliku kogemuse põhjal on Python'i paramiko teek kapriisne ning ei pruugi sobida keerukamateks lahendusteks.
transport=ssh
Juhul kui teil ei ole seadistatud SSH võtmega autentimine on vajalik muuta ssh ühenduse seadistust, lubamaks parooliga autentimist.
- NB: Järgnevad muudatused asuvad sektsioonis [ssh_connection]''!
ssh_args=-o PasswordAuthentication=yes -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-ssh-%h-%p-%r
Kasutaja sedistusfaili eeldatav sisu pärast muudatusi
[defaults] transport=ssh hostfile=~/ansible/hosts [ssh_connection] ssh_args=-o PasswordAuthentication=yes -o ControlMaster=auto -o ControlPersist=60s -o ControlPath=/tmp/ansible-ssh-%h-%p-%r
Tekitame kataloogi, milles hoida Ansible tööks olulisi faile ja samaaegselt ka sihtmasinate loendi faili.
mkdir ~/ansible && touch ~/ansible/hosts
Lisame sihtmasinate faili mõned kirjed:
[main:children] webservers [webservers] 192.168.56.1
Kirjete selgitus:
- [main:children] - Loogiline grupp, mis koosneb alamgruppidest
- webservers - Kõik grupi webservers masinad kuuluvad ka gruppi main
- [webservers] - Loogiline grupp sihtmasinaid
- 192.168.56.1 - Sihtmasin mis kuulub gruppi webservers (ja main)
Süsteemide seadistuse kirjeldamine
Loome kataloogi kus hoida seadistuse kirjelduse kogumeid ehk Ansible mõistes playbook'e
mkdir ~/ansible/playbooks
Põhiseaded
Tekitame põhifaili kus hoida üldist seadistust
touch ~/ansible/playbooks/main.yml
- NB: Näidete kopeerimisel tuleb olulist tähelepanu pöörata taanetele, kuna need on YAML'i süntaksi osa![12]
Lisame sellese faili järgnevad read
--- - hosts: main user: student gather_facts: no sudo: yes tasks: - name: Copy MOTD copy: src=~/ansible/files/motd.txt dest=/etc/motd backup=yes - include: ~/ansible/playbooks/apache.yml ...
Kirjete selgitus:
- --- - YAML'i süntaksis faili algus
- - hosts: main - Selles failis määratletud seadistused rakendadatkse sihtmasinatele, mis kuuluvad gruppi main
- user: student - Kasutajanimi, kellena sihtmasinasse sisse logitakse, ehk SSH kasutaja
- gather_facts: no - Sihtmasinate kohta käiva info kogumise keelamine: käesoleva näite raames ei ole see vajalik ning säästab käivitamisel aega
- sudo: yes - Seadistuse elluviimiseks eskaleerutakse juurkasutaja õigustesse
- tasks: - Sellele reale järgnevad seadistussammude kirjeldused
- - name: Copy MOTD - Konkreetse seadistussammu nimi on Copy MOTD
- (Igal seadistussammul peab olema nimi ning sellele on võimalik soovi korral viidata)
- copy: src=~/ansible/files/motd.txt dest=/etc/motd backup=yes - Kopeerida kohaliku masina fail ~/ansible/files/motd.txt sihtmasinasse, nimega /etc/motd ning varundada praegune sihtmasinas eksisteeriv fail[13]
- - include: ~/ansible/playbooks/apache.yml - Impordi seadistusfail ~/ansible/playbooks/apache.yml ja rakenda ka selles olevad seadistused
- ... - YAML'i süntaksis faili lõpp
Seadistuse abifailid
Loome kataloogi kus hoida sihtmasinatesse kopeeritavaid faile
mkdir ~/ansible/files
Loome MOTD faili, mida sihtmasinatesse kopeerida
echo "This is the Ansible MOTD" > ~/ansible/files/motd.txt
Veebiserveri seadistus
Tekitame faili, milles hoida Apache veebiserveri seadistust
touch ~/ansible/playbooks/apache.yml
- NB: Näidete kopeerimisel tuleb olulist tähelepanu pöörata taanetele, kuna need on YAML'i süntaksi osa![12]
Lisame sellese faili järgnevad read
--- - hosts: webservers user: student gather_facts: no sudo: yes tasks: - name: install apache and php packages apt: pkg=$item state=latest update_cache=yes with_items: - apache2 - php5 - php5-cli - php-pear - libapache2-mod-php5 notify: restart apache - name: install PHP_CodeSniffer command: pear install PHP_CodeSniffer creates=/usr/share/php/data/PHP_CodeSniffer - name: set php memory limit ini_file: dest=/etc/php5/apache2/php.ini option=memory_limit value=512M section=PHP - name: enable ssl file: src=/etc/apache2/mods-available/$item dest=/etc/apache2/mods-enabled/$item state=link with_items: - ssl.conf - ssl.load notify: restart apache handlers: - name: restart apache service: name=apache2 enabled=yes state=restarted ...
Kirjete selgitus:
- --- - YAML'i süntaksis faili algus
- - hosts: webservers - Selles failis määratletud seadistused rakendadatkse sihtmasinatele, mis kuuluvad gruppi webservers
- user: student - Kasutajanimi, kellena sihtmasinasse sisse logitakse, ehk SSH kasutaja
- gather_facts: no - Sihtmasinate kohta käiva info kogumise keelamine: käesoleva näite raames ei ole see vajalik ning säästab käivitamisel aega
- sudo: yes - Seadistuse elluviimiseks eskaleerutakse juurkasutaja õigustesse
- tasks: - Sellele reale järgnevad seadistussammude kirjeldused
- - name: install apache and php packages - Konkreetse seadistussammu nimi on install apache and php packages
- apt: pkg=$item state=latest update_cache=yes - Paigalda APT'iga muutujate loetelus olevate pakkide uusim versioon ning uuenda repositooriumite kirjeldused[14]
- with_items: - Muutujate loetelu algus
- - apache2 - Muutujate loetelu element apache2
- - php5 - Muutujate loetelu element php5
- - php5-cli - Muutujate loetelu element php5-cli
- - php-pear - Muutujate loetelu element php-pear
- - libapache2-mod-php5 - Muutujate loetelu element libapache2-mod-php5
- notify: restart apache - Teavita vajadusepõhist haldurit restart apache rakendamise nõudest
- - name: install PHP_CodeSniffer - Konkreetse seadistussammu nimi on install PHP_CodeSniffer
- command: pear install PHP_CodeSniffer creates=/usr/share/php/data/PHP_CodeSniffer - Käivita sihtmasinas käsk pear install PHP_CodeSniffer, ainult juhul kui viidatud faili/kataloogi pole olemas[15]
- - name: set php memory limit - Konkreetse seadistussammu nimi on set php memory limit
- ini_file: dest=/etc/php5/apache2/php.ini option=memory_limit value=512M section=PHP - Seadista .ini tüüpi failis /etc/php5/apache2/php.ini muutuja memory_limitväärtuseks 512M[16]
- - name: enable ssl Konkreetse seadistussammu nimi on enable ssl
- file: src=/etc/apache2/mods-available/$item dest=/etc/apache2/mods-enabled/$item state=link - Loo muutuja väärtusega failist kataloogis /etc/apache2/mods-available/, kataloogi /etc/apache2/mods-enabled/ muutuja väärtusega koopia, mille tüübiks on sümboolne link
- with_items: - Muutujate loetelu algus
- - ssl.conf - Muutujate loetelu element ssl.conf
- - ssl.load - Muutujate loetelu element ssl.load
- notify: restart apache - Teavita vajadusepõhist haldurit restart apache rakendamise nõudest
- handlers: - Vajadusepõhiste haldurite algus
- - name: restart apache - Konkreetse halduri nimi on restart apache
- service: name=apache2 enabled=yes state=restarted - Teenus, nimega apache2 tuleb alglaadimisel käivitada ning hetkel peab tema staatus taaskäivitunud[17]
- ... - YAML'i süntaksis faili lõpp
Süsteemide seadistamine
Eeldused
- Sihtmasinas on töötav SSH server
- Playbook'is määratud kasutajal on lubatud teha SSH ühendusi sihtmasinasse
- Kui seadistamine nõuab juurkasutaja õigustesse eskaleerimist, on playbookis määratud kasutajal lubatud seda teha
Playbook'ide rakendamine
Seadistusi rakendatakse käsuga ansible-playbook.
Käsu täiendavatest argumentidest saab Linux'i käsule omaselt ülevaate --help argumendiga.
ansible-playbook --help
Olulisemad argumendid:
- -k - Küsi SSH ühenduse loomiseks parooli
- -K - Küsi sudo käsu jaoks parooli
- NB: Kasutades Ansible't ilma võtmega autentimiseta, on vajalik paigaldada pakk sshpass!
sudo apt-get install sshpass
Rakendame kõigi sihtmasinate peal põhiseadistuse (ja kõik pärinevad lisaseadistused), kasutades parooliga autentimist ning andes ette sudo parooli.
ansible-playbook -k -K ~/ansible/playbooks/main.yml
Kokkuvõte
Kasulikke materjale
- https://www.youtube.com/watch?v=PDRdCqFp2sY Continuous Deployment with Ansible
- http://www.ansibleworks.com/tech/ How Ansible Works
- http://docs.ansible.com/modules.html Documentation
Kasutatud kirjandus
- ↑ Ansible license in GitHub, https://github.com/ekarak/ansible/blob/master/license/gpl.txt
- ↑ Ansible: CM, Deployment, and Ad-hoc Task Execution All in One, http://server.dzone.com/articles/ansible-cm-deployment-and-ad
- ↑ Ansible Playbooks, http://docs.ansible.com/playbooks_intro.html
- ↑ 4.0 4.1 Ansible installation manual, http://docs.ansible.com/intro_installation.html
- ↑ Michael DeHaan's bio, http://investing.businessweek.com/research/stocks/private/person.asp?personId=233466314&privcapId=233465248&previousCapId=233465248&previousTitle=AnsibleWorks,%20Inc
- ↑ Why is it called Ansible, http://www.ansibleworks.com/faq/
- ↑ AnsibleWorks homepage, http://www.ansibleworks.com/
- ↑ Review: Puppet vs. Chef vs. Ansible vs. Salt, http://www.infoworld.com/d/data-center/review-puppet-vs-chef-vs-ansible-vs-salt-231308?page=0,1
- ↑ SaltStack AES bug, https://github.com/saltstack/salt/commit/5dd304276ba5745ec21fc1e6686a0b28da29e6fc
- ↑ 10.0 10.1 Ansible and Salt: A detailed comparison, http://missingm.co/2013/06/ansible-and-salt-a-detailed-comparison/
- ↑ ansible-playbook man page, http://linux.die.net/man/1/ansible-playbook
- ↑ 12.0 12.1 YAML syntax, http://docs.ansible.com/YAMLSyntax.html
- ↑ copy module syntax, http://docs.ansible.com/copy_module.html
- ↑ apt module syntax, http://docs.ansible.com/apt_module.html
- ↑ command module syntax, http://docs.ansible.com/command_module.html
- ↑ ini_file module syntax, http://docs.ansible.com/ini_file_module.html
- ↑ service module syntax, http://docs.ansible.com/service_module.html
Autorid
Silver Vesi AK31
Peeter Tomusk AK41