■ はじめに
Ansible は、Juniper Junos のネットワーク機器に対応していて、情報の取得や設定変更ができます。
Junos は設定投入後に commit することによって、実際の動作に反映されます。設定変更の流れの中で、commit 前の candidate config を確認したいこともあるのではないでしょうか。そこでこの記事では、Junos の設定変更後に commit せずに candidate config を取得する方法をご紹介します。
Junos はJuniper のラボサービス vLabs を利用させていただきました。(vmx 17.4R1-S2.2)
実現できるのは Galaxy モジュール
Junos 対応モジュールには、大きく分けて Ansible に標準で組み込まれているモジュールと、Ansible Galaxy 経由で提供されている Galaxy モジュールの 2 種類あります。
commit せずに candidate config を取得といったことができるのは、Galaxy モジュールのほうです。ここでは、juniper_junos_config モジュールを利用します。
■ 環境の準備
必要 Python パッケージのインストール
Galaxy モジュール を利用するためには junos-eznc(PyEZ)
をインストールする必要があります。私の環境では、 jxmlease
もインストール必要がありましたので合わせてインストールします。
pip install
コマンドでインストールします。
$ pip install junos-eznc jxmlease
(参考) インストールしていないと、あとで Playbook 実行時に以下のようなエラーになります。
fatal: [vmx]: FAILED! => {"changed": false, "msg": "junos-eznc (aka PyEZ) >= 2.1.7 is required for this module. However, junos-eznc does not appear to be currently installed. See https://github.com/Juniper/py-junos-eznc#installation for details on installing junos-eznc."}
Galaxy モジュール のインストール
aansible-galaxy install Juniper.junos
コマンドで対象の Galaxy モジュールをインストールします。
$ ansible-galaxy install Juniper.junos - downloading role 'junos', owned by Juniper - downloading role from https://github.com/Juniper/ansible-junos-stdlib/archive/2.1.0.tar.gz - extracting Juniper.junos to /home/vagrant/.ansible/roles/Juniper.junos - Juniper.junos (2.1.0) was installed successfully
■ Playbook の作成と実行
インベントリファイル
対象ホストの定義です。今回は1台を vlabs
というグループで囲っています。
- inventory
[vlabs] vmx ansible_host=172.16.0.1
Playbook
投入したいコマンドを指定した Playbook を作成します。
コミットしないという commit: no
と、candidate config を取得する retrieve: candidate
オプションがポイントです。
- junos_get_candidate.yml
- hosts: vlabs gather_facts: no roles: - Juniper.junos # ロールの読み込み tasks: - name: set config and get candidate config juniper_junos_config: lines: # 投入コマンド - set system ntp server 10.0.0.123 load: merge format: set # set 形式で扱う commit: no # コミットしない retrieve: candidate # candidate config 取得 host: "{{ ansible_host }}" # 対象ホスト register: res - name: save file # ファイルへの保存タスク copy: content: "{{ res.config }}" # 改行入りコンフィグの文字列を指定 dest: "{{ inventory_hostname }}_changed_candidate_config.txt" vars: # 説明簡略化のため、Playbook 内に変数定義 ansible_connection: netconf ansible_port: 35000 # 環境の都合上指定、デフォルトは netconf の場合 830 ansible_user: testuser ansible_password: testpass9999
host
オプションのデフォルトは {{ inventory_hostname }}
です。そのため今回のインベントリファイルでいうと、vmx
になりますが、これは便宜上付けた名前であり名前解決できないので、{{ ansible_host }}
(今回の場合 172.16.0.1
) を指定しています。
なお、Junos 側に ntp server の設定が何もない状態からはじめることを想定しています。
実行と確認
playbook の実行
今回は、安全のため Playbook 側に チェックモード相当の commit: no
を指定をしていいます。そのため、 ansible-playbook
コマンドとしては --check
オプションは不要ですが、ここでは意図を明確にするために --check
をつけて実行しています。
$ ansible-playbook -i inventory junos_commit.yml --check PLAY [vlabs] **************************************************************** TASK [set config and get candidate config] ********************************** changed: [vmx] TASK [save file] ************************************************************ ok: [vmx] PLAY RECAP ****************************************************************** vmx : ok=2 changed=1 unreachable=0 failed=0
changed
になりますが、あくまでコミットはしません。
取得した candidate config の確認
candidate config がファイルとして保存され、set system server 10.0.0.123
コマンドに相当するコンフィグが あること を確認します。
set version 17.4R1-S2.2 (...略...) set system ntp server 10.0.0.123 # ある(想定通り) set chassis fpc 0 pic 0 number-of-ports 8 set chassis fpc 0 lite-mode set interfaces fxp0 unit 0 fami
Junos 側の確認
Junos 機器側には、set system server 10.0.0.123
コマンドに相当するコンフィグが ないこと (commitしていいないため)を確認します。
jcluser@vMX-0> show configuration system ntp # ない(想定通り) jcluser@vMX-0>
■ まとめ
Ansibleで、Junos の設定投入後に commit せずに candidate config を取得する方法をご紹介しました。
投入しようとしている部分的なコンフィグが、文法エラーなどによってはじかれてしまうのではないか、という不安を解消するには、机上チェックではなかなか難しいです。
実機に投入後、commit せずに canndidate config を取得すれば、その不安を解消できると思います。また、candidate config には想定する作業後の全行のコンフィグが含まれています。これを例えば、さらに Batfish に読み込ませて、実機反映前に事前検証するといった用途が考えられます。
参考にしていただければ幸いです。