てくなべ (tekunabe)

ansible / network / automation / StackStorm

【Ansible】--tags オプションを複数した時にタグをマージするバージョンとしないバージョンがある

■ はじめに

Ansible 2.7 への ポーティングガイドを眺めていたら、このような記載がありました。

If you specify --tags or --skip-tags multiple times on the command line, Ansible will merge the specified tags together. In previous versions of Ansible, you could set merge_multiple_cli_tags to False if you wanted to keep only the last-specified --tags. This config option existed for backwards compatibility. The overwriting behavior was deprecated in 2.3 and the default behavior was changed in 2.4. Ansible-2.7 removes the config option; multiple --tags are now always merged.

ansible-playbook コマンドには実行したいタスク、したくないタスクをタグで指定する --tags--skip-tags オプションがあります。知らなかったのですが、 --tags--skip-tags オプションを複数指定したときの挙動を設定によって変更できたようです。

デフォルトの挙動も変更されていて、

  • Ansible 2.3 までは、最後に指定されたオプションのみ有効
  • Ansible 2.4 から、マージする

になったようです。そして、Ansible 2.7 から挙動を変更する設定項目自体なくるようです。

この記事では、バージョンによってデフォルトの挙動に差分があることを試した結果を記載します。

■ 検証

共通 Playbook

3つのタスクにそれぞれタグをつけたPlaybookを用意します。

---
- hosts: all
  gather_facts: no

  tasks:
    - name: task1
      debug:
        msg: "task1"
      tags:
        - t1

    - name: task2
      debug:
        msg: "task2"
      tags:
        - t2

    - name: task3
      debug:
        msg: "task3"
      tags:
        - t3

Assible 2.3

--tags=t1 --tags=t3 のように複数の指定をして実行します。

$ ansible --version
ansible 2.3.3.0
(...略...)
$ ansible-playbook -i localhost, tagtest.yml --tags=t1 --tags=t3
[DEPRECATION WARNING]: Specifying --tags multiple times on the command line currently uses the last
specified value. In 2.4, values will be merged instead.  Set merge_multiple_cli_tags=True in ansible.cfg to
 get this behavior now..
This feature will be removed in version 2.5. Deprecation warnings can be disabled
by setting deprecation_warnings=False in ansible.cfg.

PLAY [all] *************************************************************************************************

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

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

DEPRECATION WARNING とともに、t3 というタグが付けられたタスク tasks3 のみが実行されました。最後に指定した --tags=t3 のみが有効であることが分かります。

Assible 2.6

おなじく、--tags=t1 --tags=t3 のように複数の指定をして実行します。

$ ansible --version
ansible 2.6.3
(...略...)

$ ansible-playbook -i localhost, tagtest.yml --tags=t1 --tags=t3

PLAY [all] *************************************************************************************************

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

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

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

今度は、t1t3 のタグが付けられたタスク task1task3 が実行されました。 --tags=t1 --tags=t3 という複数の指定がマージされたことが分かりました。

なお、--list-tags オプションを付けると実際にタスクを実行することなく、対象タグを確認できます。

$ ansible-playbook -i localhost, tagtest.yml --tags=t1 --tags=t3 --list-tags

playbook: tagtest.yml

  play #1 (all): all    TAGS: []
      TASK TAGS: [t1, t3]     ←★

■ まとめ

あまり、複数の --tags --skip-tags をオプションを付けて実行することは無いかもしれませんが、

  • Ansible 2.3 まではデフォルトで最後に指定されたオプションのみ有効。
  • Ansible 2.4 からデフォルトでマージされるようになった。設定で変更可能。
  • Ansible 2.7 では設定でも変更できなくなる。

という点は一応覚えておいたほうが良いかもしれません。