はじめに
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 指定やリダイレクトの仕組みに頼らない事業がある場合は、便利な方法だと思います。