Ansible¶
Ansible es una herramienta de configuración de equipos (por decirlo muy resumidamente). Lo que hace es, a través de SSH, configurar equipos remotos. Estos equipos remotos no necesitan tener un agente / cliente de Ansible, solo SSH y poder usar sudo.
Instalación¶
sudo apt install ansible
# El siguiente comando es para ver que está instalado correctamente
ansible --version
Si no lo detectara, haría falta lo siguiente
sudo apt install software-properties-common
sudo apt-add-repository ppa:ansible/ansible
sudo apt update && sudo apt install -y ansible
Configuración¶
/etc/ansible
-> Carpeta con los ficheros de configuración:/etc/ansible/ansible.cfg
-> Configuración./etc/ansible/hosts
-> Inventario de equipos administrados.
Inventario¶
Se llama inventario al grupo de equipos / hosts, que se van a administrar con Ansible. Los hay estáticos, es decir, un fichero, o dinámicos, que dependen de una llamada a un proveedor de cloud.
Estático¶
El fichero de inventario por defecto es /etc/ansible/hosts
, aunque se puede definir otro. Usa formato INI
.
Equipo local¶
Para que todo suceda en el propio equipo, definimos -> localhost
.
Si queremos que no use SSH para el equipo local (cosa que tiene sentido), habría que poner localhost ansible_connection=local
Equipo remoto¶
Para actuar sobre un equipo remoto tienes que añadirle una clave SSH al host que se va a configurar con Ansible
# Generar clave (poner passphrase por seguridad)
ssh-keygen -t <algoritmo-cifrado>
# ssh-keygen -t rsa
# Copiar clave al host
ssh-copy-id -i <ruta-clave-privada> <usuario-host>@<host>
# ssh-copy-id ~/.ssh/id_rsa pi@raspberrypi
Luego debes añadirlo al inventario
Grupos children¶
Suponte que tienes dos grupos distintos, que quieres actuar tanto por separado, como conjuntamente, para ello tienes que usar la directiva :children
.
Variables¶
Usa la directiva :vars
.
Tienen prioridad las variables directas / locales de cada host, por encima de las del grupo, ejemplo:
En este caso, <variable>
tendrá <valor1>
.
Se pueden agrupar las variables en:
/etc/ansible/host_vars/<host>.yml
-> Un fichero yaml de variables para cada host./etc/ansible/group_vars/<grupo>.yml
-> Un fichero yaml de variables para cada grupo de hosts.
Las variables irán en formato YAML, es decir, <variable>: <valor>
.
Algunas variables:
-
ansible_connection
->ssh
(por defecto) |local
.-
ansible_connection=ssh
:ansible_host
ansible_port
ansible_user
ansible_ssh_private_key_file
-
-
ansible_become
->false
(por defecto) |true
ansible_become=true
:ansible_become_method
->su
|sudo
ansible_become_user
(root)
Patrones¶
Si tienes varios hosts con nombres como
Te puedes referir a ellos como web[1:3].dominio.com
.
Si en cambio tienes
Puedes usar web-[a:c].dominio.com
.
Elegir inventario¶
Con la opción -i <fichero-de-hosts>
eliges que inventario quieres, para si por ejemplo tienes diferentes entornos de desarrollo, pruebas y producción.
Dinámico¶
En vez de usar un fichero local, como el /etc/ansible/hosts
, se hace una llamada a un proveedor cloud (que es el que te lo da) a través de un script generado por los creadores de Ansible. Estos scripts están en github.com/ansible/ansible en la sección contrib/inventory.
Para ejecutarlos, simplemente usamos el script como fichero de host, seleccionándolo con la opción -i <script>.py
.
Combinar inventarios¶
Si en un directorio / carpeta tienes un inventario estático y otro dinámico, con especificar con -i
ese directorio, usará primero el estático y luego el dinámico.
Se recomienda usar la opción --list-hosts
al menos la primera vez para comprobar que haga la unión de los inventarios.
Comandos¶
A los comandos que se introducen "a pelo", se les llama comandos Ad hoc, y son para comprobar cosas rápido. tiene la estructura:
<opciones>
:--limit <filtro>
-> Para poder definir a que hosts afecta.<filtro>
puede serhost1,host2,host3,...
-> Lista de hosts.grupo1:grupo2:grupo3:...
-> Lista de grupos.grupo1:&grupo2
-> La intersección / lo común de grupo1 y grupo2.grupo1:!grupo2
-> Grupo 1 excepto lo común / intersección de grupo 2.
--user <usuario>
--become
-> Ser root-f <numero de procesos simultaneos>
-> Para que se haga en paralelo / simultáneamente.
<hosts>
-> servidores : grupos:all
(todos los hosts).modulo
->setup
|ping
|apt
|yum
| ... Mirar la docu- ``
Ping¶
Para hacer un hello world haríamos
Por ejemplo ansible localhost -m ping
Comando normal¶
Para usar un comando habría que hacer
Por ejemplo
Y te devuelve el nombre del host en la red.
Comando para todos los hosts¶
Definir el usuario con el que vamos a realizar la acción¶
Esto se puede automatizar cambiando el fichero de host /etc/ansible/hosts
con
Crear un usuario root en los hosts¶
Ahora tendré que añadir la opción --become
cada vez que quiera usar este usuario.
Configuración¶
Todo está autodocumentado en el fichero de configuración global /etc/ansible/ansible.cfg
:
- Contiene valores por defecto.
- Configuración de escalar permisos.
- Opciones de OpenSSH.
- Opciones de SELinux.
- Configuración de Ansible Galaxy.
La priorización de busqueda de archivos de configuración es:
- Variable de entorno
ANSIBLE_CONFIG
. - Fichero locales
ansible.cfg
y.ansible.cfg
. - Fichero global
/etc/ansible/ansible.cfg
.
Windows¶
Info oficial -> aquí.
Para poder ser usado en máquinas Windows hace falta:
- En la máquina con Ansible:
- Instalar pywinrm ->
pip install pywinrm
. - Definir
connection
al valorwinrm
->-c winrm
.
- Instalar pywinrm ->
- En la máquina Windows:
- Tener
PowerShell 3.0
o superior. - Habilitar control remoto con el script ConfigureRemotingForAnsible.ps1 desde la web de Ansible.
- Habilitar puerto
5986
.
- Tener
- Ignorar certificado SSL ->
ansible_winrm_server_cert_validation=ignore
.
Playbook¶
Un playbook es un fichero con un conjunto de recetas (tareas) ordenadas, para no tener que ir introduciendo todo a mano con comandos ad hoc. Usa formato YAML.
---
- name: Mi playbook
hosts: all
remote_user: pi
become: true
tasks:
- name: copiar fichero hosts
copy: src=/etc/hosts dest=/etc/hosts
Para ejecutarlo
Opciones¶
-i <inventario>
-> Indicar el inventario en formato fichero (estático) / script (dinámico) / directorio (estático + dinámico).--syntax-check
-> Comprobar sintaxus del playbook.--list-tasks
-> Listar tareas.--step
-> Pregunta paso a paso.--start-at-task=<tarea>
-> Empezar por una tarea concreta.--forks=<num de tareas> | -f <num de tareas>
-> Cantidad de tareas en paralelo (por defecto<num de tareas>
es5
).-v | -vv | -vvv
-> Aumentar elverbose
(información de cada operación que se hace).
Variables¶
TODO: