はじめに
Ansible には、Playbook 内の実行するタスクを細かく制御するためのタグという機能があります。例えば、ansible-playbook コマンドのオプションで --tags sakana を指定したら、sakana というタグが適用されているタスクのみが実行される、というものです。(厳密にはタスク以外に Play などの単位でもタグを適用できる)
タグは基本的に任意の文字列を使えますが、いくつか特殊な用途として予約されたタグがあります。たとえば、ansible-playbook コマンドのオプションで指定するタとしては、tagged、untagged、 all という予約されたタグがあります。
tagged: 何かしらのタグが適用されているタスクを実行untagged: タグが適用されていないタスクを実行all: すべてのタスク(ただしnever以外)を実行
これら 3つの予約されたタグは、ansible-playbook コマンドのオプションで指定する特殊なタグなので、Playbook 内には適用できません。正確には「適用(tags ディレクティブに指定)すること自体はできるけど、適用した人の意図通りの挙動にはならない」という状態でした。つまり、うっかり tagged、untagged、all というタグを Playbook 内で適用できてしまう状態でした。
2025年11月にリリースされた ansible-core 2.20.0 では、こんなうっかりを発見できるように、警告が表示されるようになりました。親切設計ですね。
- ansible-core 2.20.0 CHANGELOGより引用
tags now warn when using reserved keywords.
ansible now warns if you use reserved tags that were only meant for selection and not for use in play.
どういう警告が表示されるのか、簡単に試してみたのでその結果をまとめます。
- 検証環境
- ansible-core 2.20.0
検証 Playbook
以下のように、tagged 、 untagged、all をそれぞれ適用した3つのタスクを準備しました。
--- - name: Tag Test Play hosts: localhost gather_facts: false tasks: - name: Tag test tagged ansible.builtin.debug: msg: "This task is tagged with 'tagged'" tags: - tagged - name: Tag test untagged ansible.builtin.debug: msg: "This task is tagged with 'untagged'" tags: - untagged - name: Tag test all ansible.builtin.debug: msg: "This task is tagged with 'all'" tags: - all
実行結果
Playbook を実行したところ、意図しない結果を生むのでおすすめしませんという警告(WARNING)が冒頭に表示されました。
$ ansible-playbook -i localhost, tag_test.yml
[WARNING]: Found reserved tagnames in tags: ['tagged'], we do not recommend doing this as it might give unexpected results
Origin: /home/sakana/ansible/ac220/tag_test.yml:11:9
9 msg: "This task is tagged with 'tagged'"
10 tags:
11 - tagged
^ column 9
[WARNING]: Found reserved tagnames in tags: ['untagged'], we do not recommend doing this as it might give unexpected results
Origin: /home/sakana/ansible/ac220/tag_test.yml:17:9
15 msg: "This task is tagged with 'untagged'"
16 tags:
17 - untagged
^ column 9
[WARNING]: Found reserved tagnames in tags: ['all'], we do not recommend doing this as it might give unexpected results
Origin: /home/sakana/ansible/ac220/tag_test.yml:23:9
21 msg: "This task is tagged with 'all'"
22 tags:
23 - all
^ column 9
PLAY [Tag Test Play] *******************************************************************************
TASK [Tag test tagged] *****************************************************************************
ok: [localhost] => {
"msg": "This task is tagged with 'tagged'"
}
TASK [Tag test untagged] ***************************************************************************
ok: [localhost] => {
"msg": "This task is tagged with 'untagged'"
}
TASK [Tag test all] *********************************************************************************
ok: [localhost] => {
"msg": "This task is tagged with 'all'"
}
PLAY RECAP *****************************************************************************************
localhost : ok=3 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
比較のため、ansible-core 2.18.11 で実行したらエラーにはなりませんでした。
おわりに
tagged や untagged は、ネットワークの VLAN の文脈で使ってしまうことはあり得るかもしれません。all もまぁまぁ使ってしまうかもしれません。
意図しない挙動を誘発させてしまう状況では、警告やエラーでお知らせしてくれたほうがいいので、ありがたい変更でした。