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"