zaki work log

作業ログやら生活ログやらなんやら

Ansibleのtag機能とalways/neverタグについて動作確認してみた

(2021.03.24追記) なお、alwaysneverを含め、--tags--skip-tagsオプションなどtag全体について以下にまとめました。

zaki-hmkc.hatenablog.com


Ansibleのtagの機能は一応知ってはいたけど使ったことがなく、alwaysneverはその存在を知らなかったので試してみた。

というのも、よこちさんが「タグで指定されない限り実行されないタスクって定義できるかな?」とツイートしたとき、ピタゴラスイッチでできないかリプしてみたら、neverでできると秒で解決済みだったというかなり恥ずかしい(笑)ことがあったので、せっかくの機会なので確認してみました。


ドキュメントはこちら。 Tags — Ansible Documentation

確認した環境は以下の通り

[zaki@manager tag]$ ansible --version
ansible 2.8.5
  config file = /etc/ansible/ansible.cfg
  configured module search path = [u'/home/zaki/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python2.7/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 2.7.5 (default, Aug  7 2019, 00:51:29) [GCC 4.8.5 20150623 (Red Hat 4.8.5-39)]

ドキュメントにある通り、alwaysneverについては、Ansible 2.5以上で対応してるっぽい。

ベースのplaybook

---
- hosts: localhost
  gather_facts: no
  tasks:
    - ping:
    - debug:
        msg: "hoge"
    - shell: date

この特に何の変哲もないpingdebugshellを指定したplaybookをベースとします。

普通のタグを追加

---
- hosts: localhost
  gather_facts: no
  tasks:
    - ping:
      tags: tag_ping
    - debug:
        msg: "hoge"
    - shell: date

pingtaskに対して、tags: tag_pingを付与。

タグ指定なしで実行

[zaki@manager tag]$ ansible-playbook playbook.yml
PLAY [localhost] ***************************************************************

TASK [ping] ********************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "hoge"
}

TASK [shell] *******************************************************************
changed: [localhost]

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

普通にすべてのtaskが実行される。

tags指定

[zaki@manager tag]$ ansible-playbook playbook.yml --tags tag_ping
PLAY [localhost] ***************************************************************
TASK [ping] ********************************************************************
ok: [localhost]

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

--tags tag_pingでタグを指定すると、指定のタグのtaskのみ実行される。

--skip-tags指定

[zaki@manager tag]$ ansible-playbook playbook.yml --skip-tags tag_ping
PLAY [localhost] ***************************************************************
TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "hoge"
}

TASK [shell] *******************************************************************
changed: [localhost]

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

--skip-tags tag_pingをでタグを指定すると、指定のタグ以外のtaskが実行される。

alwaysタグ

pingtaskのtags: tag_pingはそのままに、別のdebugtaskにtags: alwaysを付与。

---
- hosts: localhost
  gather_facts: no
  tasks:
    - ping:
      tags: tag_ping
    - debug:
        msg: "hoge"
      tags: always
    - shell: date

実行

alwaysがなければpingtaskのみ実行されるはずの--tags tag_pingを付けて実行すると以下の通り。

PLAY [localhost] ***************************************************************
TASK [ping] ********************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "hoge"
}

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

指定のタグのtaskと、alwaysのtaskも実行される。

alwaysをskipする

[zaki@manager tag]$ ansible-playbook playbook.yml --skip-tags=always
PLAY [localhost] ***************************************************************

TASK [ping] ********************************************************************
ok: [localhost]

TASK [shell] *******************************************************************
changed: [localhost]

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

--skip-tagsで指定すれば、一応スキップは可能。(通常タグと同じ使い方なので、あまり意味はないかな?)

タグの複数指定

playbookを以下の通りに書き直し。

---
- hosts: localhost
  gather_facts: no
  tasks:
    - ping:
      tags: sample_tag
    - debug:
        msg: "hoge"
      tags: sample_tag
    - shell: date

基本実行

[zaki@manager tag]$ ansible-playbook playbook.yml --tags=sample_tag
PLAY [localhost] ***************************************************************

TASK [ping] ********************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "hoge"
}

PLAY RECAP *********************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
[zaki@manager tag]$ ansible-playbook playbook.yml --skip-tags=sample_tag
PLAY [localhost] ***************************************************************

TASK [shell] *******************************************************************
changed: [localhost]

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

対象が複数になっただけで、--tags--skip-tagsも同じ動作

自前のタグと併用

---
- hosts: localhost
  gather_facts: no
  tasks:
    - ping:
      tags: sample_tag
    - debug:
        msg: "hoge"
      tags:
        - sample_tag
        - always
    - shell: date
[zaki@manager tag]$ ansible-playbook playbook.yml --skip-tags=sample_tag
PLAY [localhost] ***************************************************************

TASK [shell] *******************************************************************
changed: [localhost]

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

なるほど、--skip-tags指定の場合は、alwaysがついていても関係なくスキップする模様。

neverタグ

alwaysのときと同様に、通常タグのついたtaskと、neverを付与したタスクを作成

---
- hosts: localhost
  gather_facts: no
  tasks:
    - ping:
      tags: sample_tag
    - debug:
        msg: "hoge"
      tags:
#        - sample_tag
        - never
    - shell: date

(※ 11/17 23:33追記: コードの転記誤り。debugtaskはsample_tagタグ無しの場合(neverタグのみの場合)に以下の記述通りに動きます)

実行

[zaki@manager tag]$ ansible-playbook playbook.yml --tags=sample_tag
PLAY [localhost] ***************************************************************

TASK [ping] ********************************************************************
ok: [localhost]

PLAY RECAP *********************************************************************
localhost                  : ok=1    changed=0    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
[zaki@manager tag]$ ansible-playbook playbook.yml --skip-tags=sample_tag
PLAY [localhost] ***************************************************************

TASK [shell] *******************************************************************
changed: [localhost]

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

neverが指定されているdebugタスクはいずれも実行されない。

複数タグ指定

---
- hosts: localhost
  gather_facts: no
  tasks:
    - ping:
      tags: sample_tag
    - debug:
        msg: "hoge"
      tags:
        - sample_tag
        - never
    - shell: date

基本実行

[zaki@manager tag]$ ansible-playbook playbook.yml
PLAY [localhost] ***************************************************************

TASK [ping] ********************************************************************
ok: [localhost]

TASK [shell] *******************************************************************
changed: [localhost]

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

タグ指定なしで実行すると、neverの無いtaskのみ実行される。

--tags指定

[zaki@manager tag]$ ansible-playbook playbook.yml --tags=sample_tag
PLAY [localhost] ***************************************************************

TASK [ping] ********************************************************************
ok: [localhost]

TASK [debug] *******************************************************************
ok: [localhost] => {
    "msg": "hoge"
}

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

neverが設定されているtaskも、同時に設定されているタグが--tagsで指定されると実行される。

--skip-tags指定

[zaki@manager tag]$ ansible-playbook playbook.yml --skip-tags=sample_tag
PLAY [localhost] ***************************************************************

TASK [shell] *******************************************************************
changed: [localhost]

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

スキップの動作はnever関係なし。

neverまとめ

task タグ 指定なし --tags sample_tag指定 --skip-tags sample_tag指定
ping sample_tagのみ 実行 実行 スキップ
debug sample_tagとnever スキップ 実行 スキップ
shell なし 実行 スキップ 実行

NAVERまとめではない