Automatizacija konfiguracije i održavanja sustava alatom Ansible
Prema Red Hatu, pod automatizacijom infrastrukture podrazumijevamo uporabu tehnologije koja obavlja zadatke uz smanjenu ljudsku pomoć kako bi se upravljalo hardverom, softverom, mrežom, operativnim sustavom i uređajima za pohranu podataka koji zajedno pružaju usluge korisnicima.
Nama je zanimljiva automatizacija konfiguracije i održavanja sustava. Time se interaktivna konfiguracija računala, primjerice korištenjem sučelja naredbenog retka, zamjenjuje definicijskim datotekama koje sadrže konfiguraciju jednog ili više računala pa se naziva infrastrukura u obliku koda (engl. infrastructure as code). Takve definicijske datoteke imaju brojne prednosti, a najvažnije olakšan pregled konfiguracije, mogućnost verzioniranja konfiguracije i mogućnost višestrukog pokretanja procesa konfiguracije infrastrukture po potrebi.
Osim Ansiblea, koji koristimo u nastavku, za sličnu svrhu koriste se Chef, Puppet, Salt, Terraform i drugi alati.
Službena dokumentacija Ansiblea podijeljena je u dva dijela:
- dio koji pripada zajednici slobodnog softvera i softvera otvorenog koda: Community Documentation, Core Documentation, Galaxy Documentation, Lint Documentation i Community Contributors
- dio koji je samo za Red Hatove pretplatnike: Automation Documentation i Collections Documentation
Mi ćemo koristiti Ansible Documentation koji pripada zajednici i koji pokriva sve relevantne značajke.
U primjerima u nastavku pretpostavljamo da su računala imenovana posluzitelj
, radnastanica1
i radnastanica2
, da su ta imena navedena u /etc/hosts
ili u DNS poslužitelju, da je postavljen SSH na svakom od sustava koji se koristi te da je moguća potrebna prijava pomoću ključeva.
Instalacija Ansiblea
Instalirajmo Ansible (službena dokumentacija) na poslužitelju i klijentima naredbom:
$ sudo pacman -S ansible
Uvjerimo se da je uspješno instaliran:
$ ansible --version
ansible 2.7.5
Konfiguracija Ansiblea
Izmijenimo datoteku /etc/ansible/hosts
da bude sadržaja:
[local]
posluzitelj
[workstation]
radnastanica1
radnastanica2
Provjerimo možemo li doseći sva računala:
$ ansible all -m ping
posluzitelj | SUCCESS => {
"changed": false,
"ping": "pong"
}
radnastanica1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
radnastanica2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Provjerimo možemo li pokrenuti naredbu na računalima:
$ ansible all -a "/usr/bin/hostname"
posluzitelj | CHANGED | rc=0 >>
posluzitelj
radnastanica1 | CHANGED | rc=0 >>
radnastanica1
radnastanica2 | CHANGED | rc=0 >>
radnastanica2
Stvaranje i pokretanje Ansible playbooka
Stvorimo YAML datoteku /etc/ansible/playbook.yml
koja će tražiti instalaciju paketa koji sadrži MkDocs (paket je nazvan upravo mkdocs
) i pokrenuti uslugu Uncomplicated Firewall (kraće UFW, ime usluge ufw
) ako već nije pokrenuta. Datoteka je sadržaja:
- name: Install MkDocs and ensure UFW is running
hosts: all
become: yes
tasks:
- name: install mkdocs
package:
name: mkdocs
state: present
- name: ensure ufw is running
service:
name: ufw
state: started
Pokrenimo Ansible playbook datoteku playbook.yml
naredbom:
$ ansible-playbook -K /etc/ansible/playbook.yml
SUDO password:
PLAY [Update and Install packages] ********************************************************************************************************************************************************************************
TASK [Gathering Facts] ********************************************************************************************************************************************************************************************
ok: [posluzitelj]
ok: [radnastanica1]
ok: [radnastanica2]
TASK [install mkdocs] *********************************************************************************************************************************************************************************************
changed: [posluzitelj]
changed: [radnastanica1]
changed: [radnastanica2]
TASK [ensure ufw is running] **************************************************************************************************************************************************************************************
ok: [posluzitelj]
ok: [radnastanica1]
ok: [radnastanica2]
PLAY RECAP ********************************************************************************************************************************************************************************************************
posluzitelj : ok=3 changed=1 unreachable=0 failed=0
radnastanica1 : ok=3 changed=1 unreachable=0 failed=0
radnastanica2 : ok=3 changed=1 unreachable=0 failed=0
Paket je instaliran, a usluga je već bila pokrenuta na svim računalima tako da tu nema promjene.
Recimo da u nekom trenutku dodamo još jednu radnu stanicu imena radnastanica3
koja ima zadovoljene iste preduvjete kao radne stanice koje smo ranije dodali. Provjerimo možemo li je doseći:
$ ansible all -m ping
posluzitelj | SUCCESS => {
"changed": false,
"ping": "pong"
}
radnastanica1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
radnastanica2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
radnastanica3 | SUCCESS => {
"changed": false,
"ping": "pong"
}
Ponovimo pokretanje Ansible playbook playbook.yml
naredbom:
$ ansible-playbook -K /etc/ansible/playbook.yml
SUDO password:
PLAY [Update and Install packages] *********************************************
TASK [Gathering Facts] *********************************************************
ok: [posluzitelj]
ok: [radnastanica1]
ok: [radnastanica2]
ok: [radnastanica3]
TASK [install mkdocs] **********************************************************
ok: [posluzitelj]
ok: [radnastanica1]
ok: [radnastanica2]
changed: [radnastanica3]
TASK [ensure ufw is running] ***************************************************
ok: [posluzitelj]
ok: [radnastanica1]
ok: [radnastanica2]
ok: [radnastanica3]
PLAY RECAP *********************************************************************
radnastanica1 : ok=2 changed=0 unreachable=0 failed=0
radnastanica2 : ok=2 changed=0 unreachable=0 failed=0
radnastanica3 : ok=2 changed=1 unreachable=0 failed=0
posluzitelj : ok=2 changed=0 unreachable=0 failed=0
Uočimo kako se mijenja samo radnastanica3
koja ranije nije imala instaliran paket mkdocs
.
Više detalja moguće je pronaći na stranici Ansible na ArchWikiju.
Pokretanje postojećih Ansible playbooka
Vrlo jednostavan primjer postojećeg playbooka koji instalira HTTP poslužitelj Apache može se pronaći na službenom GitHubu u repozitoriju ansible/workshop-examples. Složeniji primjeri dostupni su u repozitoriju ansible/ansible-examples. Kako su neki od njih pisani specifično za Red Hat Enterprise Linux, potrebne su manje preinake u navođenju sustava za instalaciju paketa i putanjama pojedinih direktorija i datoteka kako bi se mogle pokrenuti na Arch Linuxu.
Author: Mario Ćuro, Vedran Miletić