はじめに
Playbook 内で利用する collection のモジュールを利用する際、モジュール名を FQCN(例:cisco.ios.ios_config
)で指定するほか、collections
ディレクティブでまとめて指定することもできます。
現時点(2020/09/20)の最新版のドキュメントには、以下のように Playbook の Play 単位で collections
を指定する例が紹介されています。
- hosts: all collections: # Play 単位の場合 - my_namespace.my_collection tasks: - import_role: name: role1
一方、開発版のドキュメントでは、role 単位で collections
を指定する例が紹介されています。role の meta/main.yml
に指定します。
# myrole/meta/main.yml collections: - my_namespace.first_collection - my_namespace.second_collection - other_namespace.other_collection
role としては、利用するコレクションを Playbook 側で指定されるより、role 自身で指定できる方が嬉しいのではないでしょうか。(試す限り、Playbook 側の collections は、ロール内のタスクには反映されないようでした)
この記事では、自分のサンプルでrole 単位での collections
の指定を検証します。
- 動作確認環境
- ansible-base 2.10.1
■ 各ファイルの内容
ディレクトリ構成
site.yml
から、testrole
を呼び出します。
. ├── roles │ └── testrole │ ├── meta │ │ └── main.yml (c) │ └── tasks │ └── main.yml (b) └── site.yml (a)
(a) Playbook (site.yml
)
testrole
role を呼び出すだけの Playbook です。
ここには collections
ディレクティブを指定しません。
--- - hosts: rt01 gather_facts: false tasks: - name: import testrole import_role: name: testrole
(b) role のタスク (testrole/tasks/main.yml
)
処理本体です。
cisco.ios
collection 内の ios_config
モジュールを利用する意図です。
--- - name: ios test ios_config: lines: - ntp server 10.0.0.123
cisco.ios.ios_config
のように FQCN 指定でもよいのですが、この記事の趣旨上、装飾なしの名前にしています。
代わりに、後述の testrole/meta/main.yml
で collections
をしています。
(c) role のメタ情報 (testrole/meta/main.yml
)
ここで collections
を指定します。cisco.ios
collection のみを指定しています。複数指定もできます。
--- collections: - cisco.ios
この指定により、装飾なしのモジュール名の探索に cisco.ios
collections が加わります。
(自動で collection がインストールされるわけではありません)
■ Playbook 実行
検証用の準備(リダイレクトの無効化)
少しややこしいですが、検証のためにちょっとした準備をします。
iso_config
モジュールは Ansible 2.9 以前は標準で含まれていたため、Ansible 2.10 では 移行容易性のため(おそらく)リダイレクトの仕組みがあります。つまり ios_config
と指定すると、cisco_ios.ios_config
にリダイレクトします。この機能に頼ると、今回の collections
の指定が効いたかどうか区別できません。
そのため、この検証では該当リダイレクトを無効にします。具体的には [python環境]/lib/python3.X/site-packages/ansible/config/ansible_builtin_runtime.yml
の cisco.ios.ios_config
へのリダイレクト定義を、以下のようにコメントアウトします。
# ios_config: # redirect: cisco.ios.ios_config
実行
Playbook を実行します。
$ ansible-playbook -i inventory.ini site.yml PLAY [rt01] ********************************************************************************************************************** TASK [testrole : ios test] ******************************************************************************************************* ok: [rt01] PLAY RECAP *********************************************************************************************************************** rt01 : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
無事に cisco.ios.ios_config
モジュールを実行できました。
もしろん、リダイレクトを無効にしたたまま、 collections
の指定をなくすと、ERROR! couldn't resolve module/action 'ios_config'.
のようにエラーになります。
おわりに
はじめにも書きましたが、role としては、利用するコレクションを Playbook 側で指定されるより、role 自身で指定できる方が制御が効いてよいでしょう。FQCN 指定やリダイレクトの仕組みに頼らない事業がある場合は、便利な方法だと思います。