てくなべ (tekunabe)

ansible / network / automation

[Ansible] 2018年のAnsible ネットワークモジュールのアップデートまとめ(詳細版)


これは Ansible Advent Calendar 2018 の15日目の記事です。

■ はじめに

2018年、Ansible は 2.5、2.6、2.7 とバージョンアップを重ねてきました。ネットワーク関連では、新規対応プラットフォームやモジュールの追加の他にも、ネットワークモジュール用コネクプラグインの追加といった、アーキテクチャ的なアップデートもありました。

この記事では、ネットワークモジュール周辺のアップデートについて、バージョンごとに振り返ります。

2018/12/06 開催の Ansible Night in Tokyo 2018.12 での発表「5分でふりかえる2018年のネットワークモジュールのアップデート」の詳細版です。

目次




■ Ansible 2.5.0 (2018/03/22 リリース)

新規対応プラットフォーム: 7 (計40)

Ansible 2.5.0 では以下の 7 つのプラットフォームに新たに対応しました。FortiManager、NSO といった運用管理系プラットフォームにも対応したことが特徴です。

追加モジュール: 116 (計595)

追加モジュール一覧

クリックすると Ansible 2.5 追加モジュール一覧が表示されます


プラットフォーム別の追加モジュール数は以下のとおりです。

プラットフォーム名 2.7 での追加モジュール数 備考
aci 20
avi 8
edgeos 3
enos 3
eos 6
f5 30
fortimanager 1
ios 5
iosxr 1
ironware 3
junos 2
netact 1
nso 5
nxos 4
onyx 17
panos 4
radware 2
vyos 1

なお、Ansible 2.5 時点の全ネットワークモジュールの一覧はこちらです。

コネクションプラグインの導入(network_cli、netconf)

これまでネットワークモジュールは local コネクションプラグインを利用する仕組みでした。2.5.0 では、以下の 2 つのネットワークモジュール用のコネクションプラグインが初めて導入されました。

これらのネットワークモジュール用のネクションプラグインを利用することで、以下のような利点があります。

  • 各タスクの provider オプションに都度認証情報を指定しなくてよい
  • 特権モードの指定を、サーバー系モジュールと同じく become で指定できる(authorize ではなく)

以下に ios_* モジュールを利用した Playbook のサンプルを、比較のため Ansible 2.4 までの場合と 2.5 からの場合に分けて紹介します。

Ansible 2.4 までの場合

Ansible 2.4 までの場合、このように privider オプションで認証情報を定義します。 内部で定義するオプション名は authorize など、ネットワークモジュール固有のものになっています。

---
- hosts: ios1
  gather_facts: no
  connection: local   # local コネクションプラグインを利用

  vars:     # 別途変数定義ファイルに書き出しても良い
    login:  # 認証情報をまとめたディクショナリ(NWモジュール固有)
      username: user          # ユーザー名
      password: testpass99    # パスワード
      authorize: yes          # 特権モードへの移行有無
      auth_pass: testenable99 # 特権パスワード

  tasks:
    - name: get information
      ios_command:
        commands:
          - show running-config
        provider: "{{ login }}"     # 認証情報の指定 
    
    - name: set ntp
      ios_config:
        lines:
          - ntp server 10.0.0.123
        provider: "{{ login }}"     # 認証情報の指定(再)

Ansible 2.5 から

Ansible 2.5 からは privider オプションの代わりに、サーバー系モジュールと同じような変数( ansible_become など)を利用できます。

---
- hosts: ios1
  gather_facts: no
  connection: network_cli   # network_cli コネクションプラグインを利用

  vars:  # 別途変数定義ファイルに書き出しても良い
    ansible_network_os: ios         # プラットフォーム名
    ansible_user: user              # ユーザー名
    ansible_password: user01        # パスワード
    ansible_become: yes             # 特権パスワード
    ansible_become_pass: enable01   # 特権モードへの移行有無
    ansible_become_method: enable   # 特権モードへの移行コマンド

  tasks:
    - name: get information
      ios_command:   # 認証情報の指定は不要
        commands:
          - show running-config
    
    - name: set ntp
      ios_config:    # 認証情報の指定は不要
        lines:
          - ntp server 10.0.0.123

なお、プラットフォームと対応するコネクションプラグインは、以下の表にまとまっています。 https://docs.ansible.com/ansible/latest/network/user_guide/platform_index.html#settings-by-platform

上記の表を確認すると分かるように、現在でも local コネクションプラグインを利用するプラットフォームもあります。

ネットワーク自動化向けドキュメントの拡充

各モジュールの説明ページだけでは分からなかった、トラブルシューティングベストプラクティスプラットフォームごとに利用できるオプションの説明 )などのページが、追加、集約されました。公式ドキュメントとしてまとまったという印象を受けます。

https://docs.ansible.com/ansible/latest/network/index.html

Ansible 2.5 参考情報




■ Ansible 2.6.0 (2018/06/28 リリース)

新規対応プラットフォーム: 3 (計43)

Ansible 2.6.0 では以下の 3 つのプラットフォームに新たに対応しました。 Extreme のプラットフォームが徐々に増えてきています。

追加モジュール: 56 (計651)

追加モジュール一覧

クリックすると Ansible 2.6追加モジュール一覧が表示されます


プラットフォーム別の追加モジュール数は以下のとおりです。

プラットフォーム名 2.6 での追加モジュール数 備考
aci 1
avi 3
cnos 2
exos 1
f5 32
files 2 ベンダー非依存(後述の net_getnet_put
fortios 1
meraki 4
netconf 2 | ベンダー非依存(後述の netconf_rpcnetconf_get
slxos 8

なお、Ansible 2.6 時点の全ネットワークモジュールの一覧はこちらです。

ベンター非依存モジュール(net_get/net_put/netconf_get/net_rpc)

ベンダー非依存モジュールとして以下の 4 つが追加されています。

net_getget_put は SCP や SFTP でコンフィグを転送するモジュールです。 netconf_getnetconf_rpc は NETCONF 対応機器から NETCONF で情報を取得したり処理を実行するモジュールです。

httpapi コネクションプラグインの追加

ネットワークモジュール用のコネクプラグインhttpapi が追加されました。

HTTP による API に対応しているネットワーク機器と通信するためのコネクションプラグインです。具体的には、Cisco NX-OSと、Arista EOS に利用できます。

HTTPS によるアクセスも可能

デフォルトでは、HTTPS ではなく HTTP です。HTTPS でアクセスしたい場合は、use_ssl オプション(変数 ansible_httpapi_use_ssl )を yes にセットします。

この場合、証明書の検証を必ず行うため注意が必要です。もし、検証を無効にしたい場合は、後述の Ansible 2.7 で追加されるオプション validate_certs (変数 ansible_httpapi_validate_certs )を no にセットします。

ネットワークモジュール用コネクションプラグインならではのメリットが

これまでも、local コネクションプラグインと各 nxos_* モジュールの transport: nxapi や、eos_* モジュールの transport: eapi を指定することで、ネットワーク機器に HTTP API によってアクセスできました。

ただし、local コネクションプラグインを利用する場合、以下のように都度 provider というオプション経由で認証情報を渡す必要がある、など少々面倒でした。

- name: task1
  eos_command:
    commands:
      - show version
    provider: "{{ eapi }}"     # 認証情報の指定

そこで、今回追加された httpapi コネクションプラグインを利用することで、認証情報は ansibe_useransible_password などの変数で定義するれば良くなり、provider オプションは不要になります。

このようなメリットは、Ansible 2.5 で導入された network_clinetconf コネクションプラグインを利用するメリットと同様です。

なお、Arista EOS での connettion: localconnection: httpapi でも書き方は、公式ドキュメントの EOS Platform Options で確認できます。

Ansible 2.6 参考情報




■ Ansible 2.7.0 (2018/10/04 リリース)

新規対応プラットフォーム: 5 (計48)

Ansible 2.7.0 では以下の 5 つのプラットフォームに新たに対応しました。引き続き Extreme のプラットフォームが追加されています。また、私の周辺では「ついに RouterOS に対応」と反応されている方もいらっしゃって、Router Board User's Group Jp のブログでも取り上げられていました。

追加モジュール: 46 (計697)

追加モジュール一覧

クリックすると Ansible 2.7 追加モジュール一覧が表示されます


プラットフォーム別の追加モジュール数は以下のとおりです。

プラットフォーム名 2.7 での追加モジュール数 備考
aci 1
cli 2 ベンダー非依存(後述の cli_command、 `cli
exos 2
f5 19
fortimanager 1
ftd 3
meraki 7
nos 3
nxos 1
onyx 1
opx 1
panos 1
routeros 1
slxos 1
voss 2

なお、Ansible 2.7 時点の全ネットワークモジュールの一覧はこちらです。

ベンター非依存モジュール(cli_command/cli_config)

ベンダー非依存モジュールとして以下の 4 つが追加されています。 - cli_command - Run a cli command on cli-based network devices - cli_config - Push text based configuration to network devices over network_cli

両者とも、コマンドをそのまま指定するタイプのモジュールです。ただし ios_command モジュールの commands オプションた、ios_configlines オプションのように、コマンドをリストで指定できません。代わりに改行を含んだ複数コマンドの文字列を指定します。使い勝手が、ベンダー固有の *_command*_config とは異なるので少し注意が必要です。

httpapi コネクションプラグインで証明書の検証有無を指定可能に

Ansible 2.6 で追加された httpapi コネクションプラグインで、SSL/TLS証明書の検証有無を validate_certs というオプション(変数 ansible_httpapi_use_ssl )で指定できるようになりました。デフォルトは true です。

例えば、Arista EOS の APIHTTPS でアクセスし、証明書の検証はしない場合は、以下のような変数定義をします。

  • group_vars/eos.yml
ansible_network_os: eos             # プラットフォームの指定
ansible_connection: httpapi         # httpapi コネクションプラグインを利用
ansible_httpapi_use_ssl: yes        # API に HTTPS でアクセスする
ansible_httpapi_validate_certs: no  # 証明書検証をしない
ansible_user: testuser              # ログインユーザー名
ansible_password: testpass9999      # ログインパスワード
ansible_become: yes                 # 特権モード移行を有効化
ansible_become_method: enable       # 特権モード移行コマンド
ansible_become_pass: enable9999     # 特権モード移行パスワード

Ansible 2.7 参考情報




■ まとめ(2.5 - 2.7)

大まかにまとめると以下の3点です。

  • ネットワークモジュール用のコネクションプラグインの導入
    • network_cli、netconf、httpapi
  • 15 プラットフォーム追加
    • Extreme Networks 系が特に増加
  • 218 モジュール追加
    • net_get、net_put、cli_* 等ベンダー非依存モジュールも

特に、ネットワークモジュール用のコネクションプラグインの導入については、大きな変化だったと思います。ネット上のサンプルも connection: localconnection: network_cli が混在した状態がしばらく続く気がします。(bigip_* のように、もともと local のみサポートするプラットフォームもあります)

次期バージョンである Ansible 2.8 (ロードマップ) では、さらに NAPALM コネクションプラグインも追加される予定です。引き続き注目していきたいと思います。

Ansible 2.5 - 2.6 参考情報