Ansible

Ansible#

El nodo de control, es la máquina que tiene instalado Ansible. Desde ella administraremos el resto de nodos.

El Inventario es el archivo host para Ansible. En él se incluye información, estática o dinámica, de los nodos administrados y su información. Datos como IP o nombre.

Los Módulos, como en otros lenguajes, serían las librerías que ejecuta Ansible.

Los Playbooks se encargan de definir todas las tareas que debemos realizar sobre un conjunto de nodos administrador.

Los Roles es una agrupación de ficheros, tareas y plantillas

Una Task se podría definir como una acción a realizar.

Instalamos ansible (vídeo)

apt install ansible -y

Añadimos al final del archivo :

root@compute-0-0:~# cat /etc/ansible/hosts
[server]
server0 ansible_host=172.16.0.10
server1 ansible_host=172.16.0.11
server2 ansible_host=172.16.0.12

[all:vars]
ansible python interpreter=/usr/bin/python3

Para consultar el inventario

root@compute-0-0:~# ansible-inventory --list -y
all:
  children:
    server:
      hosts:
        server0:
          ansible python interpreter: /usr/bin/python3
          ansible_host: 172.16.0.10
        server1:
          ansible python interpreter: /usr/bin/python3
          ansible_host: 172.16.0.11
        server2:
          ansible python interpreter: /usr/bin/python3
          ansible_host: 172.16.0.12
    ungrouped: {}

Comprobamos la conexión

root@compute-0-0:~# ansible all -m ping -u root
server0 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}
server1 | SUCCESS => {
   "changed": false,
   "ping": "pong"
}
server2 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Comandos ad hoc#

Cualquier comando que ejecute normalmente en un servidor remoto a través de SSH puede ejecutarse con Ansible en los servidores especificados en su archivo de inventario. Como ejemplo, puede verificar la utilización del disco en todos los servidores con lo siguiente:

root@compute-0-0:~# ansible all -a "df -h /dev/sda2" -u root
server2 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        79G  6,0G   69G   9% /
server1 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        79G  6,4G   68G   9% /
server0 | CHANGED | rc=0 >>
Filesystem      Size  Used Avail Use% Mounted on
/dev/sda2        79G  6,5G   68G   9% /

Podemos instalar en todos los nodos el comando tree:

ansible all -m apt -a "name=tree" -u root

Podemos comprobar que se ha instalado ejecutando:

ansible all -a "tree" -u root

Podemos especificar múltiples hosts separándolos con comas:

ansible server1:server2 -m ping -u root

Plabook#

Ansible ad hoc estan bien para algo rápido, sin embargo para organizar varios modulos se utilizan los playbook, por ejemplo:

ansible all -m apt -a "name=vim state=latest" -u root

Podríamos escribir lo mismo con un plabook:

root@compute-0-0:~# cat playbook.yml
- name: Playbook
  hosts: all
  become: yes
  become_user: root
  tasks:
    - name: install vim latest
      apt:
        name: vim
        state: latest

Comprobamos la lista de tareas

root@compute-0-0:~# ansible-playbook playbook.yml --list-tasks

playbook: playbook.yml

play #1 (all): Playbook        TAGS: []
  tasks:
    install vim latest TAGS: []

Comprobamos la lista de maquinas dobre la que va actuar

root@compute-0-0:~# ansible-playbook playbook.yml --list-host

playbook: playbook.yml

 play #1 (all): Playbook       TAGS: []
   pattern: ['all']
   hosts (3):
     server1
     server0
     server2

Ejecutamos con ansible el playbook

root@compute-0-0:~# ansible-playbook playbook.yml

PLAY [Playbook] *************************************************************************

TASK [Gathering Facts] ******************************************************************
ok: [server2]
ok: [server0]
ok: [server1]

TASK [install vim latest] ***************************************************************
ok: [server1]
ok: [server0]
ok: [server2]

PLAY RECA P******************************************************************************
server0       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0
server1       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0
server2       : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0

Podríamos ejecutarlo solo en el server1

ansible-playbook -l server1 playbook.yml

Para cambiar el grupo de hosts por defecto.

ansible-playbook playbook.yml -i ansible_hosts

Roles#

Cuando se crea un rol, se descompone el playbook en partes y esas partes se encuentran en una estructura de directorios.

Vamos a ver un ejemplo utilizando el comando

ansible-galaxy init --offline cluster-ubuntu22.04

Como podemos ver se han creado los siguientes directorios:

root@compute-0-0:~# tree cluster-ubuntu22.04/
cluster-ubuntu22.04/
├── defaults
│   └── main.yml
├── handlers
│   └── main.yml
├── meta
│   └── main.yml
├── README.md
├── tasks
│   └── main.yml
├── tests
│   ├── inventory
│   └── test.yml
└── vars
    └── main.yml

6 directories, 8 files

Los diversos archivos main.yml contienen contenido dependiendo de su ubicación en la estructura de directorios que se muestra arriba. Por ejemplo, vars/main.yml hace referencia a variables, handlers/main.yaml describe controladores, y así sucesivamente.

Las variables se pueden establecer en vars/main.yml o defaults/main.yml, pero no en ambos lugares.

Para programar los roles podemos utilizar un control de versiones como es el git, además podemos publicarlo y luego indexarlo desde https://galaxy.ansible.com/, para su posterior instalación.