てくなべ (tekunabe)

ansible / network / automation

[Ansible] restconf_config モジュールで Cisco IOS XE のSyslogサーバー設定追加・削除してみる

■ はじめに

Ansible 2.8 では、RESTCONF でネットワーク機器の情報を取得したり、設定を変更したりできる RESTCONF モジュールが導入されました。

以前、本ブログでは、モジュールを利用してIOS-XE へ RESTCONF でアクセスしてインターフェース情報の取得をためした記事を投稿しました。

今回は、情報の取得ではなく、設定追加・削除を試します。restconf_config モジュールを利用し、送信先 Syslog サーバーの追加、削除をしてみます。

環境


■ 準備

Playook 実行に必要なファイルを作成していきます。

インベントリファイル

ホスト情報を示すインベントリファイルを作成します。

  • inventory
[ios]
iosao1 ansible_host=ios-xe-mgmt.cisco.com

変数定義ファイル

インベントリファイルで定義したグループ ios が利用する変数を定義するファイルを作成します。

  • group_vars/ios.yml
ansible_connection: httpapi
ansible_httpapi_port: 9443
ansible_network_os: restconf      # ios ではないので注意
ansible_user: root
ansible_password: p@ss9999
ansible_httpapi_use_ssl: yes
ansible_httpapi_validate_certs: no

各変数の意味は、前回の記事か、公式ドキュメントの httpapi コネクションプラグインのページを参照してください。


■ 追加(POST)する Playbook

追加 Playbook 作成

追加(POST)する Playbook を作成します。

Playbook 実行前は、ネットワーク機器側に送信先 Syslog サーバーの設定が一つもない状態です。 10.0.0.110.0.0.2 の2つ設定します。

  • config.yml
- hosts: ios
  gather_facts: no

  tasks:
    - name: restconf test
      restconf_config:
        path: /data/Cisco-IOS-XE-native:native/logging/host
        method: post
        content: "{{ content_data | to_json }}"
      vars:
        content_data:
            Cisco-IOS-XE-native:ipv4-host-list:
              - ipv4-host: 10.0.0.1
              - ipv4-host: 10.0.0.2

設定を追加したいので、method オプションには post を指定しています。

content オプションには、json データを指定します。restconf_config モジュールの Examples のよいうに、YAML 上に JSON を定義してもよいのですが、あまり好みではないため、普通に YAML の変数で定義したものを to_json フィルターに通しています。

追加 Playnook 実行

追加(POST)する Playbook を実行します。

$ ansible-playbook -i inventory config.yml 

PLAY [ios] ****************************************************************************************

TASK [restconf test] ******************************************************************************
changed: [iosao1]

PLAY RECAP ****************************************************************************************
ios         : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0 

なお、もう一度実行すると設定済みに POST することになるので、以下のエラーになります。

"msg": "resource '/data/Cisco-IOS-XE-native:native/logging/host' already exist"

普段使っているコマンドの感覚だとちょっと戸惑ってしまうかもしれません。

確認

設定されたことをネットワーク機器側で確認します。

csr1000v#sh run | inc logging host
logging host 10.0.0.1
logging host 10.0.0.2

無事に 10.0.0.110.0.0.2 が設定されました。 この時点では startup-config には保存されていません。

もちろん、restconf_get モジュールで情報取得して確認してもよいでしょう。

(補足)設定変更する場合は?

もし、設定済みの状態から設定変更する場合、は patchput メソッドを利用します。

    - name: restconf test
      restconf_config:
        path: /data/Cisco-IOS-XE-native:native/logging/host
        method: put
        content: "{{ content_data | to_json }}"
      vars:
        content_data:
          host:  # patch/put の場合はここから含める
            Cisco-IOS-XE-native:ipv4-host-list:
              - ipv4-host: 10.0.0.8
              - ipv4-host: 10.0.0.9

例えば、上記 の put する Playbook を実行すると、10.0.0.110.0.0.2消えて10.0.0.810.0.0.9 になります。no コマンドを意識しなくていいのは楽で良いです。(ただし毎回 chenged になる)


■ 削除(DELETE)する Playbook

削除 Playbook 作成

削除(DELETE)する Playbook を作成します。

Playbook 実行前は、さきほどの Playbook により、10.0.0.110.0.0.2 の2つが設定されている状態です。

  • config.yml
- hosts: ios
  gather_facts: no

  tasks:
    - name: restconf test
      restconf_config:
        path: /data/Cisco-IOS-XE-native:native/logging/host
        method: delete   # ポイント
        content: "{{ content_data | to_json }}"
      vars:
        content_data:
          Cisco-IOS-XE-native:ipv4-host-list:
            - ipv4-host: 10.0.0.1
            - ipv4-host: 10.0.0.2

追加(POST)の Playbook と違う点は、method オプションに delete を指定している点のみです。

削除 Playnook 実行

削除(DELETE)する Playbook を実行します。

$ ansible-playbook -i inventory config.yml 

PLAY [ios] ****************************************************************************************
TASK [restconf test] ******************************************************************************
changed: [iosao1]

PLAY RECAP **************************************************************************************
iosao1      : ok=1    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0   

もう一度実行すると chenged になりません。

確認

削除されたことをネットワーク機器側で確認します。

csr1000v#sh run | inc logging host
csr1000v#

無事に削除されました。


■ まとめ

restconf_config モジュールを利用して、Syslogサーバーの追加(POST)、削除(DELETE)をする簡単な例を試しました。

restconf_config モジュールmethod オプションには、他にも putpatch を指定することもできます。これらのメソッドにより、柔軟な設定変更ができます。RESTCONF なので、普段使っているコマンドとは勝手が違うものの、restconf_* モジュール は プラットフォームごとにモジュールを使い分ける必要がないというメリットもあります。

RESTCONF が利用できる機器では、設定変更の方法の選択肢になるのではないでしょうか。