(2021.03.24追記) なお、always
とnever
を含め、--tags
や--skip-tags
オプションなどtag全体について以下にまとめました。
Ansibleのtagの機能は一応知ってはいたけど使ったことがなく、always
とnever
はその存在を知らなかったので試してみた。
というのも、よこちさんが「タグで指定されない限り実行されないタスクって定義できるかな?」とツイートしたとき、ピタゴラスイッチでできないかリプしてみたら、never
でできると秒で解決済みだったというかなり恥ずかしい(笑)ことがあったので、せっかくの機会なので確認してみました。
Ansible で「タグで指定されない限り実行されない」ってタスクしていできるかな。
— よこち(yokochi) (@akira6592) 2019年11月16日
ドキュメントはこちら。 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)]
ドキュメントにある通り、always
とnever
については、Ansible 2.5以上で対応してるっぽい。
ベースのplaybook
--- - hosts: localhost gather_facts: no tasks: - ping: - debug: msg: "hoge" - shell: date
この特に何の変哲もないping
、debug
、shell
を指定したplaybookをベースとします。
普通のタグを追加
--- - hosts: localhost gather_facts: no tasks: - ping: tags: tag_ping - debug: msg: "hoge" - shell: date
ping
taskに対して、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タグ
ping
taskのtags: tag_ping
はそのままに、別のdebug
taskにtags: always
を付与。
--- - hosts: localhost gather_facts: no tasks: - ping: tags: tag_ping - debug: msg: "hoge" tags: always - shell: date
実行
always
がなければping
taskのみ実行されるはずの--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追記: コードの転記誤り。debug
taskは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まとめではない