てくなべ (tekunabe)

ansible / network / automation

[Ansible] 通常時は実行せず、タグが指定されたときのみタスクを実行する

はじめに

Playbook には タグ機能があり、ansible-playbook コマンドから特定のタグを持ったタスクのみ実行できます。

タグの中には、いくつか特別なものがあります。

never タグをつけたタスクは、通常時は無視されます。他のタグをあわせて付けると、そのタグが指定されると実行されます。

この性質を利用すると「普段は実行したくないが、特定のタグをしていたときのみ実行する」といったこごができます。

この記事では簡単なサンプルをご紹介します。

  • 動作確認環境
    • Ansible 2.9.10

これの詳細です。

サンプル Playbook

---
- hosts: localhost
  gather_facts: false


  tasks:
    - name: special task 
      debug:
        msg: special task
      tags:
        - never    # このタグにより通常時はこのタスクは実行されない
        - special

    - name:
      debug:
        msg: normal task

タグ指定なしで実行

ansible-playbook コマンドで特にタグの指定をせずに実行する場合です。

$ ansible-playbook -i localhost, tagtest.yml 

PLAY [localhost] *************************************************************************

TASK [normal task] *****************************************************************************
ok: [localhost] => {
    "msg": "normal task"
}

PLAY RECAP *******************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0  

never タグが付いた special task が実行されなかったことが分かります。

タグ指定で実行

今度は -t special でタグを指定して実行します。

$ ansible-playbook -i localhost, tagtest.yml -t special

PLAY [localhost] *************************************************************************

TASK [special task] **********************************************************************
ok: [localhost] => {
    "msg": "special task"
}

PLAY RECAP *******************************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

special タグがついたタスクが実行されました。

normarl taskspecial タグが指定されていないため実行されませんでした。

おわりに

never のような特別なタグの挙動が知られていない可能性もありますので、コメントで説明を書きておくと親切だと思います。