Ansible PlaybookのTagsが混乱するのでまとめた


ansible-playbookにはTagsという機能があり、実行時に指定することで特定のタスクを実行しないようにしたり、実行させるようにしたりできます。
このTags、どう指定するとどう動くのかややこしい部分があるので、まとめることにしました。

原典: https://docs.ansible.com/ansible/latest/user_guide/playbooks_tags.html

まとめ

  • 実行時にタグ未指定の場合(=all指定の場合)はnever以外のすべてのタスクが動く。
  • タグ指定時には、そのタグが指定されているタスクのみが動く。
  • 実行時にuntaggedを指定すると、タグが指定されていないすべてのタスクが動く。
  • 実行時にtaggedを指定すると、neverタグが指定されていない、タグが指定されているすべてのタスクが動く。

実行時パラメータとタグ指定のマッピング

行がansible-playbook--tagsで指定するパラメータ。
列がタスクについているタグです。oが実行されるタスクで、xは実行されないタスクです。

未指定 foo foo,bar always(※) never(※) debug never,debug
未指定 o o o o x o x
foo x o o o x x x
bar x x o o x x x
never(※) x x x o o x o
debug x x x o x o o
untagged(※) o x x o x x x
tagged(※) x o o o x o x
all(※) o o o o x o x
all,never o o o o o o o
--skip-tags=foo o x x o x o x
--skip-tags=always o o o x x o x

※: Ansibleの仕様で定められている特殊なタグ。

たとえば、ansible-playbook --tags barでPlaybookを実行した場合(3行目)に動くタスクは

  • foobarが両方ついたタスク(3列目)
  • alwaysがついたタスク(4列目)

で、動かないタスクは

  • タグ未指定(1列目)
  • neverだけがついたタスク(5列目)
  • debugだけがついたタスク(6列目)
  • neverdebugがついたタスク(7列目)

です。

おまけ

ansible-playbook site.yml --list-tagsのように--list-tagsを付けるとPlaybook内で使われているタグがほぼ出力されます。
neverと同時にしか使っていない場合など、出力されないケースがあることは覚えておく必要があります。

後からタグを洗い出すのは若干辛いので、Tagsを使うPlaybookを作る場合は絶対に、絶対にドキュメント化しましょう。