てくなべ (tekunabe)

ansible / network automation / 学習メモ

[Ansible] FQCN で省略系のモジュール名を指定できる仕組み(cisco.ios.ios_config を cisco.ios.config で)

この記事は、Ansible Advent Calendar 2021 (Adventar版) 20日目の記事です。

はじめに

先日 Ansible もくもく会に参加させていただきました。(参加レポート

ネットワーク編のコンテンツでは、たびたび cisco.ios.config のような、少しモジュール名を省略した形でされていました。

---
- name: snmp ro/rw string configuration
  hosts: cisco
  gather_facts: no

  tasks:

    - name: ensure that the desired snmp strings are present
      cisco.ios.config:
        commands:
          - snmp-server community ansible-public RO
          - snmp-server community ansible-private RW

Exercise 2 - First Ansible Playbook | workshops より)

例えば上記の例では、cisco.ios.ios_config ではなく、cisco.ios.config という指定をしています。

この省略方法ができるのは知っていたのですが、実際ここまで指定してる例ははじめて見ました。

リダイレクトの定義ファイルがある

cisco.ios.config という省略した指定でも利用できるのは、cisco.ios.ios_config に対してリダイレクトする定義があるためです。

リダイレクトの対応はコレクションの meta/runtime.yml というファイルに定義されています。他のモジュールにも同様の定義があります。

github.com

---
requires_ansible: ">=2.9.10"
plugin_routing:
# ...(略)...
  modules:
# ...(略)...
    ios_bgp_global:
      redirect: cisco.ios.ios
    bgp_global:
      redirect: cisco.ios.ios
    ios_command:
      redirect: cisco.ios.ios
    command:
      redirect: cisco.ios.ios
    ios_config:
      redirect: cisco.ios.ios
    config:
      redirect: cisco.ios.ios
    ios_facts:
      redirect: cisco.ios.ios
    facts:
      redirect: cisco.ios.ios
# ...(略)...

モジュールが非推奨になったときにもこのリダイレクトの定義を使うようですが、ここでは deprecation という指定はありません。

このような省略系が指定できる仕組みは、meta/runtime.yml 追加時のプルリクでは、short name module redirection と表現されています。

コレクション内でのリダイレクト定義なので、コレクションを指定する cisco.ios までは必要です。さすがに config ではモジュールが一意に定まりません。

他のコレクションにもリダイレクト定義がある

この仕組は cisco.ios コレクション固有ではなく、コレクション自体の仕組みです。

そのため、他のコレクションにもこのようなリダイレクト定義があったり(なかったり)します。

どっちを使うか

コレクションが導入される前は階層がなくフラットだったため、ios_config のように、モジュール名自体に名前空間的なプレフィックスが必要でした。コレクションの導入によって、cisco.ios のような名前空間ができたため、これで十分 ios 向けであることが判別できます。このため、モジュール名の ios_ の必要性が低くなり冗長であるという見方があって、cisco.ios.config という省略形でも指定できるようにしよう、という経緯なのかなという予想です。

私としては、初見の人にやさしいであろうという理由で省略形ではなく cisco.ios.ios_config という表記の方が良いかなと思います。