¿Qué es Ansible?
Ansible es una herramienta de código abierto para la administración de servidores, con la que podemos orquestar cualquier número de maquinas. Permite realizar cualquier tipo de tarea en las máquinas clientes, ya sea configuraciones, instalaciones o despliegues varios de aplicaciones.
Imagina tener 300 o 400 máquinas, como es mi caso, entre servidores, portátiles y equipos distribuidos por varios edificios, y ahora tener que cambiar algo de la configuración. Sin este tipo de herramientas habría que ir una por una, perdiendo un tiempo valioso.
Aunque en mi centro ya utilizo Puppet para realizar tareas automatizadas, Ansible es diferente. Puppet depende de «master-agent» que debe estar corriendo en el cliente, mientras que Ansible no necesita agentes. Para mí, Ansible no es un sustituto de Puppet, sino más bien me vale para complementar ciertas tareas que no necesito de Puppet.
Ventajas de Ansible
- No necesita instalación de agente, es «agentless», así que no requiere de instalar ningún software en el cliente.
- Basado en Python. Utiliza lenguaje declarativo con YAML, con curva de aprendizaje leve
- Se lleva muy bien con los sistemas Cloud.
- Alta escalabilidad.
Instalación nodo de control
Partimos de una máquina actualizada: $ sudo apt update && sudo apt upgrade -y
Debemos tener instalado “python3” y “python-pip”. Después de eso instalaremos el paquete ansible y lo actualizamos a la última versión: $ sudo apt install python3 python3-pip && sudo apt install ansible && pip3 install ansible
Podemos ver la versión que tenemos actualizada de Ansible y la localización de diversos path de plugins y configuración: $ ansible --version
ansible [core 2.17.4]
config file = None
configured module search path = ['/home/administrador/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
ansible python module location = /home/administrador/.local/lib/python3.10/site-packages/ansible
ansible collection location = /home/administrador/.ansible/collections:/usr/share/ansible/collections
executable location = /usr/bin/ansible
python version = 3.10.12 (main, Sep 11 2024, 15:47:36) [GCC 11.4.0] (/usr/bin/python3)
jinja version = 3.0.3
libyaml = True
Configuración de Ansible
Nuestro usuario debe tener capacidad de escalar privilegios con sudo, ya que no es recomendable usar root. Para ello agregamos el usuario que usaremos al grupo sudo.
$ usermod -aG sudo <usuario> # Basados en Debian
$ usermod -aG wheel <usuario> # Basados en RedHat
Fichero de configuración ansible.cfg
Si trabajamos con un conjunto de nodos más o menos conocido, podemos definir en la sección [defaults] la variable inventory dentro de ansible.cfg, que apunta al fichero del inventario que normalmente usamos. Este fichero incluirá las máquinas por su ip.
Si queremos usar DNS podemos crearnos un fichero inventory-dns, e incluir los nombres de las máquinas aquí. No olvidar añadirlo a /etc/hosts para que resuelva las DNS.
Podemos especificar un remote_user, para indicar con qué usuario vamos a entrar en las máquinas.
Configuraciones varias en la sección [privilege_escalation]:
- become: (True/False). Para especificar cómo escalar privilegios
- become_method: (sudo, por ejemplo) método de escalado
- become_user: usuario de escalado
- become_ask_pass: (True/False). Si debe pedir contraseña o no. Cuando tengamos todo automatizado con un AWX o un Ansible Tower, no pediremos contraseñas y lo pondremos a False
administrador@server34:~/ansible-centro$ cat ansible.cfg
[defaults]
inventory = ./inventory-dns
[privilege_escalation]
become=True
become_method=sudo
becom_user=root
become_ask_pass=True
administrador@server34:~/ansible-centro$ cat inventory
[siatic]
172.18.220.45
172.18.220.88
172.18.220.105
[aio]
172.18.220.48
172.18.220.49
[lmde]
172.18.220.14
administrador@server34:~/ansible-centro$ cat inventory-dns
[webservers]
sC4
sD13
[siatic]
sD13
sC4
sD8
[aio]
aA1
aA2
[lmde]
lmde6
administrador@server34:~/ansible-centro$ ansible-inventory -i inventory --list
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"ungrouped",
"siatic",
"aoi"
]
},
"aoi": {
"hosts": [
"172.18.220.48",
"172.18.220.49"
]
},
"siatic": {
"hosts": [
"172.18.220.45",
"172.18.220.88"
]
}
}
administrador@server34:~/ansible-centro$ ansible-inventory -i inventory-d --list
ns --list
{
"_meta": {
"hostvars": {}
},
"all": {
"children": [
"ungrouped",
"siatic",
"aoi"
]
},
"aoi": {
"hosts": [
"aA1",
"aA2"
]
},
"siatic": {
"hosts": [
"sD13",
"sC4"
]
}
}