Sospecho que esto intenta ser demasiado inteligente (y falla), pero, especialmente en el desarrollo de un PB, es realmente útil usar etiquetas para limitar los roles que se ejecutan; por ejemplo, tenemos: (fragmento del libro de jugadas) ...
- { role: yum, tags: [ 'yum' ] }
- { role: proxy, tags: [ 'proxy' ] }
- { role: firewall, tags: [ 'firewall' ] }
Ahora, de vez en cuando, ejecuto una etiqueta mal escrita, por ejemplo
$ ansible-playbook servername, user=fred my_playbook --tags=firewal
Y las tareas previas se ejecutan, al igual que las tareas posteriores, lo que hace que parezca que algo está sucediendo, pero, por supuesto, ninguna tarea coincide con la etiqueta ingresada incorrectamente. Recojo esto al iniciar sesión (cada rol hace esto:
- include_tasks: includes/log_role_completion.yml this_role={{ role_name }}
que resuelve esto:
- name: "Setup completed_roles list"
set_fact:
completed_roles: "{{ this_role }}"
changed_when: false
when: completed_roles is not defined
- name: "Add role to list of completed roles"
set_fact:
completed_roles: "{{ completed_roles }} {{ this_role }}"
changed_when: false
when: completed_roles != this_role
Luego, un rol post_tasks escribe la lista de roles completados, o un mensaje que dice que ninguno se ejecutó posiblemente debido a una etiqueta mal escrita. Esto funciona muy bien, y sé que ansible escribe registros, pero son detallados o crípticos, y me gusta tener /var/log/ansible en el objetivo con algo como esto:
Ansible version 2.6.2 run commenced at 2018-08-31: 20:23:40 GMT using account vmw-user
Ansible version 2.6.2 run completed at 2018-08-31: 20:23:40 GMT for roles chrony, proxy, and log_complete
Eso es realmente útil, PERO (y aquí está la pregunta, finalmente) Prefiero que el libro de jugadas verifique si se proporciona una etiqueta que no coincide con ninguna etiqueta utilizada en el libro de jugadas y se detenga, advirtiéndome así que he escrito mal algo. . Esto también evitaría que un libro de jugadas se ejecutara de forma incompleta: el rol con la etiqueta mal escrita no se ejecutaría en absoluto, lo que podría causar un problema.
La variable vars.ansible_run_tags contiene las etiquetas proporcionadas por el usuario: ¿hay alguna forma de ver qué etiquetas están configuradas en un libro de estrategias? No quiero ejecutar primero en modo de verificación y analizar manualmente la salida; me gustaría que fuera automático.
Respuesta1
En mi humilde opinión, no existe tal variable para "ver qué etiquetas están configuradas en un libro de jugadas". Solo hayansible_run_tagsyansible_skip_tags. Me temo que la única opción sería escribir un contenedor ansible-playbook para verificar si las etiquetas proporcionadas están presentes en el libro de jugadas ("ejecutar primero en modo de verificación y analizar manualmente la salida").
POR CIERTO. A continuación se muestra una lista simplificada de roles completados.
completed_roles: "{{ completed_roles|default('') }} {{ this_role }}"
Para evitar que "se ejecuten las tareas previas, al igual que las tareas posteriores, lo que hace que parezca que algo está sucediendo", es posible que desee utilizarimportar_rolesycuandocondición en lugar de etiquetas. A continuación se muestra un ejemplo en el que role3.yml y role4.yml imprimen solo un mensaje.
jugar.yml
- hosts:
- localhost
tasks:
- import_role: name=role3
when: selector|default('') in [ 'role3', 'all_roles' ]
- import_role: name=role4
when: selector|default('') in [ 'role4', 'all_roles' ]
.
> ansible-playbook -e selector=role4 play.yml | grep msg
"msg": "role4"
.
> ansible-playbook -e selector=all_roles play.yml | grep msg
"msg": "role3"
"msg": "role4"