てくなべ (tekunabe)

ansible / network / automation / 学習の記録

[Ansible] role 単位で collections を指定する

はじめに

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)

f:id:akira6592:20200920140114p:plain
全体

(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.ymlcollections をしています。

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