てくなべ (tekunabe)

ansible / network / automation

[Ansible] 変数優先順位の「20. role (and include_role) params」とは何なのか

はじめに

Ansible は、様々な場所に変数を定義できます。便利な半面、優先順位がどうだったか混乱してしまうこともあります。 調べたいときに確認するのが、以下の公式ドキュメントのページです。

docs.ansible.com

この中で、20. role (and include_role) params という、割と強めな定義方法が何なのか分かりませんでした。

以下のブログにもあるように、同じように感じてるかがいらっしゃるようです。

zaki-hmkc.hatenablog.com

ちゃんと調べてみると、以下の記事が参考になりました。 qiita.com

---
- name: "test ansible var precedence"
  hosts: all
# ...(略)..
  roles:
    - role: test_role
      var_test20: "This is 'role (and include_role) params'"

このように、roles ディレクティブを利用した際に、role と同じレベル定義した変数のことのようです。

この記事では、一応自分でも検証してみます。


検証

優先順位をあらためて確認すると、20. role (and include_role) params19. set_facts / registered vars より強いようです。

19. set_facts / registered vars
20. role (and include_role) params
21. include params
22. extra vars (always win precedence)

なので、set_fact より優先されることをもって確認したいと思います。

ファイル構成

test.yml から testrole ロールを呼び出す構成です。

.
├── roles
│   └── testrole
│       └── tasks
│           └── main.yml
└── test.yml
  • test.yml
---
- hosts: localhost
  gather_facts: false

  roles:
    - role: testrole
      vars:
        msg: I'm in roles vars  # 似て非なる定義(どれだろう・・優先度は低め)
      msg: I'm in roles param   # これが 20. role (and include_role) params のはず
  • roles/testrole/tasks/main.yml
---
- name: set_fact
  set_fact: 
    msg: "I'm in tasks/main set_fact" # 19. set_facts / registered vars
    
- name: debug
  debug:
    msg: "{{ msg }}"

実行

Playbook を実行します。

$ ansible-playbook -i localhost, test.yml 

PLAY [localhost] *************************************************************************************************

TASK [testrole : set_fact] ***************************************************************************************
ok: [localhost]

TASK [testrole : debug] ******************************************************************************************
ok: [localhost] => {
    "msg": "I'm in roles param"
}

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

I'm in roles param が表示されました。set_fact より優先されたことが分かりました。

補足

さすがに 22. extra vars (always win precedence) には負けます。

$ ansible-playbook -i localhost, test.yml -e msg="extra_vars"

PLAY [localhost] *****************************************************************************************************

TASK [testrole : set_fact] *******************************************************************************************
ok: [localhost]

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

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


おわりに

混乱のもとになるので、ある程度定義場所は制限したほうが良いと思います。