Introductie in Ansible - eenvoudig geautomatiseerd configuratie en serverbeheer

Ansible is een "radically simple IT orchestration engine that makes your applications and systems easier to deploy". Simpelgezegd, het is een tool waarmee je de installatie en configuratie van een server of applicatie kan automatiseren en daarmee kan herhalen. Bijvoorbeeld bij een reinstall, installatie van een nieuwe server of bij deployment van een nieuwe service. Als je Ansible structureel inzet voor het configureren van systemen en applicaties dan kan de configuratie zelf ook dienen als uitstekende systeemdocumetnatie.

Ansible past hiermee in het rijtje van tools als Chef, Puppet en Fabric.

Ansible heeft geen speciale "client" software nodig op de target hosts; alles gebeurt over SSH en via Python op de target hosts.

Taken

Taken die je zoal kan automatiseren:

  • Het installeren en verwijderen van packages na een schone OS installatie
  • Het aanmaken van gebruikers en het configureren van (sudo, ssh) toegang
  • Deployment van een Django applicatie vanuit git, configureren van uwsgi, supervisor, nginx en PostgreSQL in één "playbook"

Aan de slag

Ansible is uitgebreid gedocumenteerd maar het kan lastig zijn om op basis hiervan met het gebruik ervan te starten. De gedachte om alle configuratie te automatiseren (van bestaande of reeds operationele servers) is ook wat overweldigend.

Daarom een eenvoudig voorbeeld: deployment van twee simpele vhosts onder nginx.

Installatie

Er zijn meerdere manieren om Ansible te installeren, maar virtualenv + pip is een veilige optie waar niet eens root-toegang voor nodig is:

[ivo@host ~]$ virtualenv ansible-config
[ivo@host ~]$ cd ansible-config
[ivo@host ~/ansible-config]$ bin/pip install ansible

Alle verdere voorbeelden zullen vanuit de ansible-config/ directory gedaan worden. Je kan deze dus omzetten naar een git repository.

Configuratie

Raadpleeg de documentatie als je meer informatie wil weten over de configuratie, ik toon de stappen en een voorbeeld setup maar ga er inhoudelijk niet (diep) op in.

De eerste stap is het definieren van een lijst met host definities. Ansible verwacht dit (ook bij de virtualenv installatie) in /etc/ansible/hosts, maar wij doen dit lokaal in de virtualenv in conf/hosts.

[ivo@host ~/ansible-config]$ mkdir conf
[ivo@host ~/ansible-config]$ cat >> conf/hosts
sample.example.com

[webservers]
sample.example.com
^D
ansible-config$

Hier is sample.example.com als host gedefinieerd en tevens in de groep 'webservers' geplaatst. We kunnen dus aan deze host refereren als 'sample.example.com' of 'webservers'.

In de rest van de voorbeelden ga ik er vanuit dat er ssh toegang tot deze host is en de remote user zonder password kan sudo-en. Zoniet dan is de configuratie uiteraard hierop aan te passen.

Om ansible duidelijk te maken dat de hostsfile  (ook wel inventory file genoemd) ergens anders staat moet explicit de -i meegegeven worden:

[ivo@host ~/ansible-config]$ bin/absible all -m ping -i conf/hosts

Maar handiger is om een ansible.cfg aan te maken die dit definieert:

[ivo@host ~/ansible-config]$ cat >> ansible.cfg
[defaults]
hostfile=conf/hosts
^D

De volgende stap is het aanmaken van de feitelijke configuratie. Deze plaatsen we in de directory 'sample.example.com'

[ivo@host ~/ansible-config]$ mkdir sample.example.com
[ivo@host ~/ansible-config]$ mkdir sample.example.com/templates
[ivo@host ~/ansible-config]$ mkdir sample.example.com/tasks

Hierin komen de configuratiefiles:

sample.example.com/site1.yml

- name: Install site1.example.com
hosts: site1.example.com
user: ivo
sudo: true

vars:
sitename: site1.example.com

tasks:
- include: tasks/deploy_nginx.yml sitename=${sitename}

handlers:
- name: restart nginx
service: name=nginx state=restarted

sample.example.com/site2.yml

- name: Install site2.example.com
hosts: site2.example.com
user: ivo
sudo: true

vars:
sitename: site2.example.com

tasks:
- include: tasks/deploy_nginx.yml sitename=${sitename}

handlers:
- name: restart nginx
service: name=nginx state=restarted

sample.example.com/templates/site1.example.com

server {
server_name {{sitename}};

root /srv/sites/site1;
}

sample.example.com/templates/site2.example.com

server {
server_name {{sitename}};

root /srv/sites/site2;
}

sample.example.com/tasks/deploy_nginx.yml

- name: setup nginx configuration
template: src=templates/${sitename} dest=/etc/nginx/sites-available/${sitename}
notify:
- restart nginx

- name: symlink configuration
file: src=/etc/nginx/sites-available/${sitename} dest=/etc/nginx/sites-enabled/${sitename} state=link

 

Bovenstaande configuratie is fictief en (uiteraard) niet helemaal compleet. Zo zou de document root ook door ansible aangemaakt kunnen worden en zouden de twee nginx templates ook samengevoegd kunnen worden maar in de praktijk zouden ze juist heel verschillend kunnen zijn; je kan zelf bepalen hoever je wil gaan met het automatiseren en 'normaliseren' van deze configuratie.

Wat hebben we nu precies? "site1.yml" en "site2.yml" zijn zogenaamde "playbooks". Ze bevatten een aantal taken die uigevoerd moeten worden. Hiervoor wordt de "deploy_nginx.yml" task gebruikt, die de respectievelijke template rendert, kopieert, symlinkt en aangeeft dat nginx herstart moet worden.

Deploy

Beide playbooks kunnen in één keer uitgevoerd worden via bin/ansible-playbook:

[ivo@host ~/ansible-conf] ./bin/ansible-playbook sample.example.com/site1.yml sample.example.com/site2.yml
PLAY [Install site1.example.com] **********************************************

GATHERING FACTS ***************************************************************
ok: [sample.example.com]

TASK: [setup nginx configuration] *********************************************
changed: [sample.example.com]

TASK: [symlink configuration] *************************************************
changed: [sample.example.com]

NOTIFIED: [restart nginx] *****************************************************
changed: [sample.example.com]

PLAY RECAP ********************************************************************
sample.example.com : ok=4 changed=3 unreachable=0 failed=0


PLAY [Install site2.example.com] **********************************************

TASK: [setup nginx configuration] *********************************************
changed: [sample.example.com]

TASK: [symlink configuration] *************************************************
changed: [sample.example.com]

NOTIFIED: [restart nginx] *****************************************************
changed: [sample.example.com]

PLAY RECAP ********************************************************************
sample.example.com : ok=3 changed=3 unreachable=0 failed=0

Ansible tasks zijn idempotent; het commando kan nogmaals gerund worden, als er niks veranderd is dan zal er ook niks gewijzigd worden (en zal nginx ook niet herstart worden)

Conclusie

Bovenstaande setup zou voldoende moeten zijn om te starten met Ansible en van daaruit verder te bouwen. Op internet zijn talloze verdere voorbeelden en modules te vinden die je in je setup op kan nemen.

 

Last updated 9 september 2013 15:51 | beheer ansible software

Geen reakties

Post a comment:

captcha