===== Ansible: eina d'orquestració =====
**Ansible** és un sistema d'orquestració **lliure**, escrit en ''Python'', que ens permet automatitzar la configuració d’una màquina d’una forma senzilla.
Ansible automatitza la gestió de sistemes remots i controla el seu estat desitjat.
{{:arquitectura_ansible.jpg?400|}}
{{:red-hat-ansible-vector-logo.png?400|}}
La web oficial de la documentació d'Ansible és: https://docs.ansible.com/ansible_community.html
{{tag> #FPInfor #Ceti #CetiMp03 #Ciber #CiberMp03 #Smx #SmxMp04 #Asix #AsixMp06 ansible vagrant DevOps}}
\\
==== Com funciona Ansible? ====
* Configura les màquines client des d’una altra màquina on tenim instal·lat l’Ansible.
* Accedeix per SSH als clients per realitzar les tasques de configuració.
* Utilitza arxius anomenats Playbooks en llenguatge YAML per gestionar els clients.
* Funciona habitualment en mode “push”.
* No té agents.
Un entorn ansible conté els següents **components principals**:
* **Node de control**: un sistema en el que s'instal·la Ansible. És el que controla tota l’execució del Playbook. És qui realitza la connexió per SSH, executa els mòduls en les màquines i realitza la instal·lació.
* **Node administrat**: un sistema remot, o amfitrió, que controla Ansible, és el host.
* **Inventari**: és un arxiu en text pla que conté la llista dels host on s’han d’executar els mòduls.
{{:funcionament_ansible.png?600|}}
Els **Playbooks** estan escrits en llenguatge YAML (només cal aprendre com col·locar els atributs dintre del fitxer). Les característiques claus generals són:
* El contingut ha de ser format UTF-8 o UTF’16.
* Per identar és recomanable utilitzar espais en blanc i no TAB.
* Cada element d’una llista comença amb un guió (-) i un espai.
* Els diccionaris clau utilitzen l’estructura clau: valor.
* Els comentaris s’indiquen amb una almohadilla (#).
* L’extensió dels fitxers ''YAML'' pot ser **.yml** o **.yaml** (recomanada).
Per configurar **l’inventari**:
$ sudo nano /etc/ansible/hosts
# Podem definir directament la IP o URL
104.155.184.125
Ansible1.prova.org
34.71.11.100
# Podem crear grups d’IPs o URL
[gupexemple]
104.155.184.125
Ansible1.prova.org
[altregrupexemple]
34.71.11.100
# Podem crear subgrups de grups
[subgrupprova: children]
grupexemple
altregrupexemple
Existeixen 2 grups per defecte:
* ''all'': Reuneix tots els servidors.
* ''ungrouped'': Reuneix tots els servidors però que no estan en cap grup.
També es poden utilitzar variables. Es pot consultar la [[https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html|llista de variables]].
\\
=== Modificadors del comando Ansible ===
El comando ''Ansible'' té diversos **arguments** (modificadors) que li podem posar. Es pot consultar la [[https://docs.ansible.com/ansible/latest/cli/ansible.html|llista de modificadors]] per Ansible.
**L’estructura** és:
$ansible
$ansible ansible1 --> el comando s’executaria en el servidor ansible1.
$ansible all --> per executar el comando en tots els servidors del fitxer "hosts"
Aquí us deixo una llista d’alguns **arguments** per Ansible.
* Argument **-f**: per indicar el nombre de fils que utilitzarà Ansible.
* Argument **-u** o **- -user**: per indicar l’usuari que realitzarà el comando Ansible utilitzant ssh.
* Argument **-b** o **- -become**: per indicar que el comando s’executarà en permisos de superusuari (root), però no demanarà contrasenya.
* Argument **-k** o **- -ask-become-pass**: per indicar que el comando s’executarà en permisos de superusuari (root), però dmanarà contrasenya de superusuari.
* Argument **-m** o **- -module-name** i **-a**:
* Si no s’especifica aquest argument s’utilitza el mòdul [[https://docs.ansible.com/ansible/latest/collections/ansible/builtin/command_module.html|command]] per defecte.
* Si es vol utlitzar el shell i poder utilitzar les variables d’entorn s’ha d'especificar:
$ ansible ansible1 -m shell -a "echo $HOME & date"
* Per comprovar la connexió amb el servidor, utilitzar el mòdul PING:
$ ansible ansible1 –m ping
* Per comprovar el nom del host dels servidors:
$ ansible ansible1 -a hostname
* Per veure la quantitat de RAM i la disponibilitat:
$ ansible ansible1 -a “free -m” --> es posa entre cometes perquè porta més d’un argument.
Alguns dels **mòduls** per utilitzar són:
* **apt**: per la gestió de paquets ''.deb'' des de la línia de comandos.
* **service**: per controlar els serveis del servidor: activar, parar, reiniciar,...
* **group**: per gestionar els grups dintre dels servidors. Pera utilitzar aquest mòdul necesitem permisos de superusuari, així que utilitzarem el modificar ''-b''.
#Per a crear un grup admin
$ ansible ansible1 -m group –a “name=admin state=present” -b
* **user**: per gestionar usuaris dintre dels servidors:
#Per crear un usuari:
$ ansible ansible1 -m user -a "name=anasanz group=admin create_home=yes" -b
* **stat**: per gestionar i modificar fitxers:
$ ansible ansible1 -m stat -a "path=/etc/host"
* **copy**: per copiar arxius als servidors
$ ansible ansible1 -m copy -a "src=/etc/hosts dest=/tmp/copia"
* **fetch**: per copiar arxius dels servidors al node de control.
$ ansible ansible1 -m fetch -a "src=/etc/hosts dest=/tmp/"
* **file**: per crear fitxers i directoris dintre dels servidors, gestionar permisos i crear enllaços simbòlics/físics.
* **cron**: comprova l’arxiu de text pla CRONTAB, que conté els scripts i hora programada d’execució de cadascun. Es poden controlar tots els aspectes del cron dels servidors:
#Per executar un script cada dimart a les 4:00 h tots els mesos de l’any.
$ ansible ansible1 -m cron -a "name='exemple' weekday=2 hour=4 minute=0 job='/script.sh'"
* **setup**: per veure totes les dades tècniques dels servidors. També es pot utilitzar el modificador ''-a'' per fer filtratges:
$ ansible ansible1 -m setup
$ ansible ansible1 -m setup -a “filter=*ipv4”
\\
----
==== Instal·lació d’Ansible ====
Per fer la **instal·lació** es pot seguir el manual oficial d’Ansible. En cas de tenir el sistema operatiu ''Ubuntu'' seria:
# apt update
# apt install software-properties-common
# add-apt-repository --yes --update ppa:ansible/ansible
# apt-get install ansible
Si es vol tenir l’última versió es pot baixar de pypi (pip install ansible). S’ha de tenir en compte que s’ha de tenir instal·lat abans ''python'' i ''ssh''.
Una vegada s’ha realitzat la instal·lació cal configurar el fitxer //Playbook//, en aquest exemple seria **playbook1.yaml**.
=== Estructura del Playbook1.yaml ===
L’estructura bàsica d’un //Playbook// és:
--
- hosts: ansible1
become: yes
tasks:
- name: Install Apache
apt: name=apache2 state=latest
- name: Check Apache is running & start on boot
service: name=apache2 state=started enabled=yes
...
En aquest cas seria un **exemple** de //**Playbook**// per instal·lar l’''Apache''. Es pot observar que el fitxer comença amb 2 guions (- -) i acaba amb 3 punts (...).
* Primer es posen els //**hosts**//, que són els servidors del nostre inventari, indicats com es vulgui.
* Opcionalment, però en aquest cas obligatori ja que es faran canvis en el sistema i es necessiten permisos de superusuari, es posa ''become: yes''. Seria equivalent al ''-b'' en els comandos AD-HOC. Si no es necessiten els permisos de superusuari no cal posar-lo.
* Es posen les tasques (tasks), una o diverses.
* Cada **tasca** s'inicia, encara que és opcional, amb un **nom** (name). Serveix només per a identificar la tasca.
* Després es posa el //**mòdul**// d’Ansible a utilitzar. En la mateixa línia del //mòdul// es posen els seus paràmetres i es configura igual que un comando AD-HOC.
* //**Tenir en compte**//:
* Es recomana **crear un directori** on guardar els //**playbooks**// o utilitzar un repositori ''GIT''.
* Les tasques s'executen per ordre.
* Es pot utilitzar qualsevol **editor**, tant un IDE tipus Visual Studio Code, com en la terminal amb un editor de text tipus ''NANO'' o ''VIM''.
* El nom de l'arxiu no ha de seguir cap format. Pot ser a gust.
* Els ''name'' de cada tasca pot estar en qualsevol idioma mentre segueixi UTF-8 o 16.
* Dintre d'un mateix //Playbook// es poden **crear** diferents **grups de tasques** per a diferents servidors. Només cal escriure una altra vegada ''- hosts: etc'' ja que a l'ésser una llista podem continuar afegint.
* Es pot **definir l'usuari** que executarà tot el //playbook// o una tasca afegint ''remote_user: nom''.
* Per a **executar** el //playbook// que hem escrit prèviament utilitzarem un nou comando d'Ansible:
$ ansible-playbook playbook1.yaml
Dintre dels //**Playbooks**// es poden **definir**:
* **Handlers**: tasques que s’executaran només quan se’ls faci la trucada.
* **Include**: és semblant a una llibreria en qualsevol llenguatge de programació.
* **Rol**: paquets d’aplicacions predefinides.
* **Pre_tasks**: tasques que s’executen abans que la resta.
* **Template**: aquest mòdul és semblant al COPY dels comandos AD-HOC, però el ''template'' va a buscar l'arxiu que se li indica en la ruta ''template''.
- name: template file to remote host
template:
src: archivo-config.j2
dest: /tmp/archivo-config
\\
Et proposo realitzar les **activitats** següents:
**Activitat 1**: Instal·la Ansible en el teu node controlador i crea un Playbook per realitzar tasques de manteniment i control dels teus servidors.
**Activitat 2**: Configura el crontab del servidor Ansible per llançar tots els Playbooks diàriament.
\\
----
==== Vagrant amb Ansible ====
Molts projectes necessiten d'un **entorn d'integració** contínua en el qual es pot veure i detectar les fallades de manera ràpida, sense arribar a l'entorn de producció. Doncs, gràcies a la combinació de [[vagrant|Vagrant]] i **Ansible** pots desplegar de manera senzilla un entorn d'integració contínua.
{{:ansible-vagrant.png?400|}}
Si et preguntes què pots fer amb ''Vagrant'' i ''Ansible'', aquí et deixo una pinzellada:
* Aixecar les màquines virtuals
* Configurar la xarxa
* Realitzar les actualitzacions de programari
* Instal·lar els paquets del programari que s'utilitzarà
* Copiar els fitxers de configuració de plantilles prèviament creades
* Aixecar o parar els serveis que es determinin
* Executar qualsevol tasca en cadascuna de les màquines virtuals
* Deixar l'entorn completament operatiu
Per a **executar** ''Ansible'' contra ''Vagrant'', la configuració bàsica de ''Vagrantfile'' seria:
Vagrant.configure("2") do |config|
#
# Executa Ansible des de Vagrant Host
#
config.vm.provision "ansible" do |ansible|
ansible.playbook = "playbook1.yml"
end
end
Només que hi hagi 1 màquina amb el //provisioner// vagrant es crearà l'arxiu ''.vagrant/provisioners/ansible/inventory/vagrant_ansible_inventory''. Així sabrem les màquines que disposem i les podrem modificar totes alhora, per exemple, per fer un //ping// Ansible, des de la màquina amfitriona:
$ ansible all --inventory-file=.vagrant/provisioners/ansible/inventory/ -m ping
Ull, perquè funcioni bé:
* Hem de tenir Ansible instal·lat a la màquina amfitriona.
* Probablement el primer cop ens demani confirmació dels certificats SSH (caldrà respondre "yes" a cada màquina).
* Potser xoca amb la configuració d'altres SSH. Si aquest fos el cas, caldria eliminar les claus antigues de ''~/.ssh/known_hosts''
Et proposo fer la següent **activitat**:
**Activitat 3**: Crear un entorn d’integració amb Vagrant i Ansible, per realitzar el manteniment i control dels teus servidors.
\\
--- //[[ccabre4@xtec.cat|CLARA CABRERA MESEGUER]] 2022/07/03 22:25//