Ejecutar solo una parte y cifrar los secretos
Una etiqueta (en inglés, tag) de Ansible marca tareas para ejecutar solo una parte de un playbook. Ansible Vault cifra los datos secretos para que no queden en texto plano. Con las dos, un rol grande se prueba rápido y sin exponer claves.
Una librería online quiere actualizar solo las portadas de su web, y guardar el token de su pasarela de pago sin dejarlo a la vista.
Al final de esta lección
Nota
Puedo ejecutar solo una parte de un playbook y guardar un secreto cifrado.
Palabras clave
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Etiqueta | una marca en una tarea para elegirla al ejecutar | tags: [contenido] |
| always y never | etiquetas con un papel propio: siempre y solo si se pide | |
| --limit | una opción que reduce los hosts de la ejecución | |
| Vault | la herramienta de Ansible que cifra archivos con una clave | ansible-vault |
| Archivo de clave | un archivo con la clave del vault, guardado aparte |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Una etiqueta elige qué tareas se ejecutan
Cada tarea puede llevar una o varias etiquetas. Con --tags contenido corren las tareas que tienen esa etiqueta. Con --skip-tags contenido corren todas menos esas.
La opción --list-tasks enseña qué tareas arrancarían, sin ejecutarlas. Las órdenes siguientes crean un playbook de cuatro tareas, y dos usan etiquetas especiales.
Crea una carpeta de trabajo
mkdir -p ~/etiquetasSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Entra en ella
cd ~/etiquetasSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe un playbook con etiquetas
printf -- '---\n- hosts: web\n gather_facts: false\n tasks:\n - name: Crear la carpeta\n ansible.builtin.file:\n path: /tmp/iac-t-dir\n state: directory\n mode: "0755"\n tags: [carpeta]\n - name: Escribir la portada\n ansible.builtin.copy:\n content: "portada\\n"\n dest: /tmp/iac-t-dir/portada.txt\n mode: "0644"\n tags: [contenido, web]\n - name: Escribir el aviso\n ansible.builtin.copy:\n content: "aviso\\n"\n dest: /tmp/iac-t-dir/aviso.txt\n mode: "0644"\n tags: [contenido]\n - name: Comprobar el acceso\n ansible.builtin.debug:\n msg: comprobando\n tags: [always]\n - name: Limpiar la carpeta\n ansible.builtin.file:\n path: /tmp/iac-t-dir/aviso.txt\n state: absent\n tags: [never, limpieza]\n' > site.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe un inventario con dos grupos
printf '[web]\nweb1 ansible_connection=local\n\n[reserva]\nreserva1 ansible_connection=local\n' > inventario.iniSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira qué tareas arrancaría una etiqueta
ansible-playbook -i inventario.ini site.yml --tags contenido --list-tasksSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Mira qué tareas arrancan al saltar una etiqueta
ansible-playbook -i inventario.ini site.yml --skip-tags contenido --list-tasksSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejecuta de verdad solo una etiqueta
ansible-playbook -i inventario.ini site.yml --tags carpeta | grep -E "TASK|changed="Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Ejemplo: qué tareas corren con cada opción
| Opción | Tareas que corren | Por qué |
|---|---|---|
| Ninguna | Carpeta, portada, aviso y acceso | La etiqueta never las oculta salvo que se pida |
| --tags contenido | Portada, aviso y acceso | Dos llevan la etiqueta y acceso es always |
| --skip-tags contenido | Carpeta y acceso | Se quitan las dos con esa etiqueta |
| --tags limpieza | Acceso y limpiar | Limpiar solo corre si se pide su etiqueta |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Un error frecuente
Advertencia
Mucha gente cree que --tags carpeta ejecuta solo la tarea de la carpeta. No es así. Las tareas con la etiqueta always corren también, y la ejecución de verdad lo muestra: salen dos tareas. Para saltarse una tarea always hay que pedirlo con --skip-tags always.
Limit reduce los hosts, pero no añade ninguno
La opción --limit reduce una ejecución a los hosts que nombras. Solo puede quitar: si el play usa el grupo web y limitas a un host del grupo reserva, no queda ninguno.
La orden siguiente muestra los hosts con --list-hosts: el play usa web y el límite nombra a reserva1, así que la lista sale vacía.
Limita a un host ajeno al play
ansible-playbook -i inventario.ini site.yml --limit reserva1 --list-hostsSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Vault cifra un archivo con una clave aparte
ansible-vault encrypt cifra un archivo con una clave. Aquí la clave es un archivo de texto, clave.txt, y el secreto es un token de prueba. Los dos son de práctica: nunca uses un secreto real en un laboratorio.
Un archivo cifrado empieza por una cabecera, $ANSIBLE_VAULT;1.1;AES256, y ya no contiene el texto original. En un proyecto real la clave no se guarda junto al archivo cifrado.
Escribe la clave de práctica
echo clave-de-practica > clave.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Escribe un secreto de prueba
printf 'api_token: token-de-prueba-4711\n' > secretos.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cifra el archivo de secretos
ansible-vault encrypt secretos.yml --vault-password-file clave.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee la primera línea del archivo
head -n 1 secretos.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Cuenta las líneas con el token
grep -c "token-de-prueba" secretos.ymlSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Lee el secreto con la clave
ansible-vault view secretos.yml --vault-password-file clave.txtSe muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.
Para ir más lejos
Ejecuta ansible-playbook -i inventario.ini site.yml --skip-tags always --list-tasks. Di antes cuántas tareas saldrán: son las tres que no llevan always ni never.
Después abre el README del laboratorio con cat ~/README.md. La última parte te pide cifrar un archivo de tu propio rol. Su contenido no debe quedar en ningún otro sitio.