Comandos básicos de Ansible
En este nuevo capítulo del tutorial de Ansible, seguimos profundizando en los comando ad-hoc, con un triple objetivo, tal y como te comentaba en el capítulo anterior. Por un lado, para que veas las posibilidades de esta tecnología, por otro lado para que comiences a realizar tus acciones, tareas y operaciones de una forma mas sencilla y cómoda, y por último, para que juegues con Ansible. Y es que por mucho que leas este y otros tutoriales de Ansible, por mucho que veas vídeos sobre esta tecnología, sino juegas con ella, sino practicas, no la utilizarás.
Por esta razón, te sugiero, es mas te invito, a que vayas probando los diferentes ejemplos que te pongo, para que veas lo sencillo que es de aplicar, y las posibilidades que te ofrece.
Comandos básicos De Ansible
Como te decía en la introducción, en este capítulo del tutorial de Ansible, verás distintas operaciones y acciones sencillas. Operaciones y acciones, que habitualmente las llevas a cabo de otra manera mas o menos complicada, y verás que con Ansible, es algo realmente sencillo.
Copiar archivos
Probablemente esta es una de las operaciones mas habituales que realizas con tus diferentes máquinas, ya sea una o cien, es igual. ¿Cuantas veces has copiado un mismo archivo a otro equipo?¿Cuantas veces has copiado un archivo a otras máquinas de tu red?
Si está claro que siempre puedes hacer un sencillo script o incluso en una línea de comando con un for
, tal y como puedes ver en el capítulo sobre bucles en bash del tutorial sobre scripts en Bash. Algo como,
for i in host1 host2 host3; do scp archivo $i:/tmp;done
Y su variante en Ansible, teniendo en cuenta que estas máquinas ya las tienes en el inventario,
ansible host* -m copy -a "src=archivo dest=/tmp"
Aquí es donde realmente le tienes que sacar partido al inventario. Si lo tienes correctamente categorizado, podrías, por ejemplo, enviar un archivo de configuración a todas las máquinas de base de datos, o a los servidores web… En fin, que como ves las posibilidades son enormes.
Gestionar archivos
Otra de las operativas mas habituales que puedes realizar es la de borrar un archivo o directorio. Esto es algo tan sencillo como, ejecutar la siguiente instrucción,
ansible host* -m file -a "path=/etc/conf/archivo.conf state=absent"
Igualmente, algo que seguro sueles hacer, por ejemplo, después de copiar los archivos, es el de cambiar permisos y propietarios. Así, por ejemplo para cambiar los permisos de un archivo concreto puedes ejecutar una instrucción como la que te muestro a continuación,
ansible host* -m file -a "path=/etc/conf/archivo.conf mode=644"
De la misma forma si quieres cambiar el usuario propietario del archivo o el grupo propietario del archivo, en este caso, la instrucción sería similar a la que puedes ver a continuación,
ansible host* -m file -a "path=/etc/conf/archivo.conf owner=atareao group=atareao"
¿Y si quisieras crear un directorio? En este caso, y combinando algunas de las opciones que has visto anteriormente, la respuesta sería algo como lo que puedes ver a continuación,
ansible host* -m file -a "path=/ruta/a/directorio state=directory mode=755 owner=atareao"
A mi, sinceramente, me parece realmente intuitivo. Simplemente se trata de recordar o encontrar el módulo que quieres utilizar y añadir los argumentos que necesites para que se obre la magia.
Por último, otra interesante opción que puedes realizar es la de borrar un directorio de todas tus máquinas. Borrar un directorio de forma recursiva, así que ojo con lo que borramos. Para hacer esto puedes ejecutar la siguiente instrucción,
ansible host* -m file -a "path=/ruta/a/directorio state=absent"
Gestionando paquetes
Otra de las operativas mas habituales que puedes hacer es la de instalar o desinstalar paquetes en todas las máquinas de tu granja (me gusta esta expresión). Quizá la instalación de un paquete es algo puntual, sin embargo, la actualización de paquetes, es susceptible de que esté en un playbook de Ansible. Sea como fuere, a continuación, puedes encontrar algunas recostas, de las operaciones mas habituales que realizas con tu distribución preferida.
Así, por ejemplo, si lo que quieres es actualizar el caché de tus repositorios, de todas tus máquinas, la instrucción a ejecutar es algo como lo que puedes ver a continuación,
ansible host* --become -m apt -a "update_cache=yes force_apt_get=yes cache_valid_time=3600"
Por otro lado, si lo que quieres hacer es actualizar toda la paquetería, la instrucción a ejecutar es,
ansible host* --become -m apt -a "ugprade=dist force_apt_get=yes"
Esto es interesante para hacerlo sobre una máquina, pero, ¿y si tienes dos máquinas? ¿y si como yo tienes una docena de Raspberry?¿Que haces ir una a una?
Pero, por supuesto, no solo puedes hacer este tipo de operaciones, sino que también puedes realizar acciones mucho mas granulares. Puedes realizar acciones, como la de instalar un paquete,
ansible host* --become -m apt -a "name=simpleproxy state=present"
Si no tienes instalado este paquete, verás que el resultado es algo como lo que te muestro a continuación,
co01 | CHANGED => {
"cache_update_time": 1592544109,
"cache_updated": false,
"changed": true,
"stderr": "",
"stderr_lines": [],
"stdout": "Reading package lists...\nBuilding dependency tree...
...
Sin embargo, si lo vuelves a ejecutar de nuevo, el resultado será el siguietmes,
co01 | SUCCESS => {
"cache_update_time": 1592544109,
"cache_updated": false,
"changed": false
}
Esta es la gracia de Ansible. No se trata de realizar acciones, sino de asegurar la foto final. En este contexto, ciertamente se realizarán acciones si hacen falta, pero solo para conseguir que la foto final sea, exactamente, la que tu quieres.
Ahora, para el caso de que quieras desinstalar este paquete, mejor dicho, para asegurarte que el paquete no está instalado, la instrucción sería la siguiente,
ansible host* --become -m apt -a "name=simpleproxy state=absent"
De la misma forma que antes, en el caso de que esté instalado, desinstalará el paquete y nos devolverá que ha cambiado el estado, CHANGED
. Por el contrario, en el caso de que no estuviera ya instalado, simplemente nos dirá que ha sido un éxito, y que no ha sido necesario modificar el estado de nuestro sistema.
co01 | SUCCESS => {
"changed": false
}
Servicios
Otro interesante uso de los comandos ad-hoc de Ansible es la posibilidad de trabajar con diferentes servicios. De esta manera podemos asegurarnos que un determinado servicio está parado.
Así, y en combinación con el apartado anterior, instalar un servicio web con Nginx, es tan sencillo como ejecutar la siguiente instrucción,
ansible host* -m apt -a "name=nginx state=present"
El siguiente paso sería arrancarlo y ponerlo en funcionamiento. Una operación que sería tan sencilla como ejecutar la siguiente instrucción,
ansible host* -m service -a "name=nginx state=started"
Una vez terminado lo que sea que queramos hacer con nuestro servicio, solo nos queda detenerlo, ejecutando la siguiente instrucción,
ansible host* -m service -a "name=nginx state=stopped"
Y por último desinstalarlo, haciendo el proceso inverso al primero de los pasos que hiciste, es decir,
ansible host* -m apt -a "name=nginx state=absent"
Por supuesto también tenemos la opción de reiniciar nuestro servicio utilizando la instrucción,
ansible host* -m service -a "name=nginx state=restarted"
De nuevo, insistir en el hecho de que aunque ejecutes dos veces la instrucción no sucederá nada, porque si te fijas, en todo momento estás indicando el estado en el que quieres que se quede, y no la acción que quieres que se realice. Por ejemplo, indicas que quiero que Nginx esté iniciado. De esta manera, si Nginx, ya está iniciado, no realizará nada mas.
Operaciones con usuarios y grupos
Otra operativa muy interesante es la de trabajar con usuarios y grupos. Por ejemplo, para crear un usuario llamado atareao
, tan solo tienes que ejecutar la siguiente instrucción,
ansible host* --become -m user -a "name=atareao state=present"
Y de la misma forma, si quieres quitar al usuario atareao
la instrucción a ejecutar será,
ansible host* --become -m user -a "name=atareao state=absent"
Esta misma operativa la puedes realizar con grupos, pero en lugar de utilizar el módulo user
tendrás que utilizar el módulo group
.
Comprimir y descomprimir
Algo que puedes hacer con mas o menos frecuencia es comprimir y descomprimir. Por ejemplo, una manera de desplegar código es utilizando precisamente un archivo comprimido. De esta manera, puedes querer comprimir el contenido de un directorio, y posteriormente copiarlo al resto de máquinas de tu granja. De esta manera, para comprimir el contenido del directorio /tmp/data
, puedes hacerlo de la siguiente forma,
ansible host* -m archive -a "path=/tmp/data dest=/tmp/data.tar.gz"
Y para completar el círculo, y una vez tengas tu archivo en el destino que consideres, tan solo tienes que ejecutar lo operación complementaria,
ansible host* -m unarchive -a "src=/tmp/data.tar.gz dest=/tmp"
Trabajando con git de forma remota
Al igual que he comentado que puedes realizar tus despliegues utilizando tar.gz, también podrías realizarlo con git. Para esto caso, simplemente tienes que utilizar el módulo git
con los argumentos necesarios.
Por ejemplo si quisieras clonar un repositorio en un directorio, la instrucción a ejecutar podría ser algo como el ejemplo que te muestro a continuación,
ansible host* -m git -a "repo=https://github.com/atareao/monitoriza_tu_raspberry.git dest=/tmp/repo"
Información de tu sistema
Por último, también puedes utilizar Ansible para obtener información de tu sistema. Que conste, que no es porque no se pueda hacer nada mas, todo lo contrario, sino por poner un límite.
Este módulo, lo utilizan de forma automática los playbooks, para obtener diferente información útil, como pueden ser variables de entorno y otros parámetros. Pero, por supuesto, también lo puedes utilizar tu, para obtener y utilizar esta información.
Así para obtener toda la información disponible, de todos tus hosts, simplemente tienes que ejecutar la siguiente instrucción,
ansible host* -m setup
Por supuesto, es posible pasar determinados valores para obtener toda la información o solo algunos parámetros concretos. Por ejemplo, si solo quieres obtener la información relativa al hardware, la instrucción a utilizar será algo como lo que te muestro a continuación,
ansible host* -m setup -a "gather_subset=hardware"
Conclusión
Entre el capítulo anterior, y este capítulo ya has podido ver todo lo que puedes hacer con una sola línea de comandos. Los comandos ad-hoc tienen un gran potencial. Sin embargo, no es mas que la punta del iceberg de lo que vas a poder hacer con los playbooks. Así que, te invito para que continúes, con el siguiente capítulo del tutorial donde precisamente nos adentraremos en esto, en los playbooks.
Imagen de portada de Aleksandar Cvetanovic en Unsplash
La entrada Comandos básicos de Ansible aparece primero en El atareao.