Ansible: プレイブックを実行する前に、指定されたタグが有効であることを確認する

Ansible: プレイブックを実行する前に、指定されたタグが有効であることを確認する

これはあまりにも巧妙にしようとしている(そして失敗している)のではないかと思いますが、特に PB の開発では、実行されるロールを制限するためにタグを使用することは非常に便利です。たとえば、次のようになります: (プレイブックのスニペット) ...

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

時々、スペルミスのタグで実行することがあります - 例えば

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

また、事前タスクが実行され、事後タスクも実行されるため、何かが起こっているように見えますが、もちろん、誤って入力されたタグに一致するタスクはありません。これはログで検出されます (すべてのロールでこれを実行します)。

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

これは次のように解決されます:

- 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

次に、post_tasks ロールは完了したロールのリストを書き込みます。または、おそらくタグのスペルミスが原因で何も実行されなかったことを示すメッセージを書きます。これはうまく機能します。また、Ansible がログを書き込むことは知っていますが、それらは冗長であったり、わかりにくいものであったりするため、ターゲットに次のような /var/log/ansible を配置することを好みます。

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

これは本当に便利ですが、(そして、ここで最後に質問ですが)、プレイブックで使用されているどのタグとも一致しないタグが指定されているかどうかをチェックして停止し、スペルミスがあることを警告するプレイブックにしたいです。これにより、プレイブックが不完全に実行されることも防止されます。スペルミスのあるタグを持つロールはまったく実行されず、問題が発生する可能性があります。

変数 vars.ansible_run_tags には、ユーザーが指定したタグが含まれています。プレイブックに設定されているタグを確認する方法はありますか? 最初にチェックモードで実行して、出力を手動で解析するのではなく、自動的に実行してほしいです。

答え1

私の意見では、「プレイブックに設定されているタグを確認する」ような変数はありません。ansible_run_tagsそしてansible_skip_tags残念ながら、唯一の選択肢は、指定されたタグがプレイブック内に存在するかどうかを確認するための ansible-playbook ラッパーを作成することです (「最初にチェックモードで実行し、出力を手動で解析する」)。

ところで、以下は完了した役割の簡略化されたリストです

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

「事前タスクが実行され、事後タスクも実行されるため、何かが起こっているように見える」ことを避けるには、次のようにするとよいかもしれません。インポートロールそしていつタグの代わりに条件を使用します。以下は、role3.yml と role4.yml がメッセージのみを出力する例です。

プレイ.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"

関連情報