Ansible: verifique se as tags fornecidas são válidas antes de executar um manual

Ansible: verifique se as tags fornecidas são válidas antes de executar um manual

Suspeito que isso esteja tentando ser muito inteligente (e falhando), mas - especialmente no desenvolvimento de um PB, é realmente útil usar tags para limitar as funções que são executadas - então, por exemplo, temos: (snippet do manual) ...

 - { role: yum,      tags: [ 'yum' ] }
 - { role: proxy,    tags: [ 'proxy' ]  }
 - { role: firewall, tags: [ 'firewall' ] }

Agora, ocasionalmente, corro com uma tag com erro ortográfico - por exemplo

$ ansible-playbook servername, user=fred  my_playbook --tags=firewal

E as pré-tarefas são executadas, assim como as pós-tarefas, o que faz parecer que algo está acontecendo, mas é claro, nenhuma tarefa corresponde à tag inserida incorretamente. Eu percebo isso no registro (cada função faz isso:

- include_tasks: includes/log_role_completion.yml this_role={{ role_name }}

que resolve isso:

- 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

Em seguida, uma função post_tasks grava a lista de funções concluídas - ou uma mensagem dizendo que nenhuma foi executada, possivelmente devido a uma tag escrita incorretamente. Isso funciona muito bem - e eu sei que o ansible grava logs, mas eles são detalhados ou enigmáticos, e eu gosto de ter /var/log/ansible no destino com algo assim:

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

Isso é realmente útil, MAS (e aqui está a questão, finalmente) prefiro que o manual verifique se é fornecida uma tag que não corresponde a nenhuma tag usada no manual e pare - avisando-me que escrevi algo errado . isso também evitaria que um playbook fosse executado de forma incompleta - a função com a tag com erro ortográfico não seria executada, o que poderia causar um problema.

A variável vars.ansible_run_tags contém as tags fornecidas pelo usuário: existe alguma maneira de ver quais tags estão definidas em um playbook? Não quero executar primeiro no modo de verificação e analisar manualmente a saída - gostaria que fosse automático.

Responder1

IMHO não existe tal variável para "ver quais tags estão definidas em um manual". Há apenasansible_run_tagseansible_skip_tags. Receio que a única opção seria escrever um wrapper ansible-playbook para verificar se as tags fornecidas estão presentes no playbook ("executar primeiro no modo de verificação e analisar manualmente a saída").

POR FALAR NISSO. Abaixo está uma lista simplificada de funções concluídas

completed_roles: "{{ completed_roles|default('') }} {{ this_role }}"

Para evitar que "as pré-tarefas sejam executadas, assim como as pós-tarefas, o que faz parecer que algo está acontecendo", você pode querer usarimport_rolesequandocondição em vez de tags. Abaixo está um exemplo onde role3.yml e role4.yml imprimem apenas uma mensagem.

jogar.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"

informação relacionada