===== 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//