■ はじめに
Ansible 2.8 では、RESTCONF でネットワーク機器の情報を取得したり、設定を変更したりできる RESTCONF モジュールが導入されました。
以前、本ブログでは、モジュールを利用してIOS-XE へ RESTCONF でアクセスしてインターフェース情報の取得をためした記事を投稿しました。
今回は、情報の取得ではなく、設定追加・削除を試します。restconf_config モジュールを利用し、送信先 Syslog サーバーの追加、削除をしてみます。
環境
- Ansible 2.8.4
- 2.8.1 までは リクエスト時の media type 指定に関するバグがあるため、2.8.2 以降を利用することをおすすめします。
- Cisco IOS-XE (16.9)
- Cisco DevNet SandBox
netconf-yang
、restconf
コマンド有効
- Cisco DevNet SandBox
■ 準備
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.1
、10.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.1
と 10.0.0.2
が設定されました。 この時点では startup-config
には保存されていません。
もちろん、restconf_get モジュールで情報取得して確認してもよいでしょう。
(補足)設定変更する場合は?
もし、設定済みの状態から設定変更する場合、は patch
や put
メソッドを利用します。
- 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.1
と 10.0.0.2
は 消えて、 10.0.0.8
と 10.0.0.9
になります。no
コマンドを意識しなくていいのは楽で良いです。(ただし毎回 chenged
になる)
■ 削除(DELETE)する Playbook
削除 Playbook 作成
削除(DELETE)する Playbook を作成します。
Playbook 実行前は、さきほどの Playbook により、10.0.0.1
、10.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
オプションには、他にも put
や patch
を指定することもできます。これらのメソッドにより、柔軟な設定変更ができます。RESTCONF なので、普段使っているコマンドとは勝手が違うものの、restconf_*
モジュール は プラットフォームごとにモジュールを使い分ける必要がないというメリットもあります。
RESTCONF が利用できる機器では、設定変更の方法の選択肢になるのではないでしょうか。