juniper.junos
Junos向けJuniper Ansibleコレクション
概要
Juniper Networksは、Junosオペレーティングシステム(Junos OSおよびJunos Evolved)を実行しているデバイスの管理にAnsibleをサポートしています。 このコレクションは、Ansible Galaxyウェブサイトのコレクション juniper.deviceにホストされています。
juniper.device
コレクションには、Junos OSを実行しているデバイス上で特定の操作および設定タスクを実行するAnsibleモジュールが含まれています。
これらのタスクには、Junos OSのインストールおよびアップグレード、ネットワーク内の新しいJunosデバイスのプロビジョニング、設定変更のロード、
情報の取得、および管理デバイスのリセット、再起動、またはシャットダウンが含まれます。
このコレクションのインストール手順については、INSTALLATION セクションを参照してください。
Junosデバイス向けの2つのセットのAnsibleモジュール
Ansibleバージョン >= 2.1以降、AnsibleにはJunos向けのコアモジュールも含まれています。
Ansibleコアに含まれるJunosモジュールの名前は、junos_
というプレフィックスで始まります。
このjuniper.device
コレクションに含まれるJunosモジュールは、モジュールタイプで始まる名前を持っています。
これら2つのJunosモジュールセットは同じAnsibleコントロールマシン上で共存でき、Ansibleプレイブックはどちらのセットのモジュールを呼び出すことが可能です。
Juniper Networksでは、Junosデバイスを管理する新しいプレイブックを書く際には、juniper.device
コレクションのモジュールを使用することを推奨しています。
モジュールの概要
このjuniper.device
コレクションには以下のモジュールが含まれています:
- command — Junosデバイスで1つまたは複数のCLIコマンドを実行します。
- config — Junosデバイスの設定を操作します。
- facts — Junosデバイスからファクトを取得します。
- file_copy - Junosデバイスとの間でファイルをコピーします。
- jsnapy — Junosデバイス上でJSNAPyテストを実行します。
- ping — Junosデバイスからpingを実行します。
- pmtud — Junosデバイスから宛先へのパスMTUディスカバリを行います。
- rpc — Junosデバイスで1つまたは複数のNETCONF RPCを実行します。
- software — Junosデバイスにソフトウェアをインストールします。
- srx_cluster — SRXシャーシクラスタ設定を追加または削除します。
- system — Junosシステムで操作を開始します。
- table — PyEZテーブル/ビューを使用してJunosデバイスからデータを取得します。
PyEZバージョン要件
Ansibleコレクションjuniper.device
には、junos-ezncバージョン2.6.0以上をインストールする必要があります。
プラグインの概要
上記のモジュールに加えて、モジュールjsnapy用のコールバックプラグインjsnapy
が利用可能です。
コールバックプラグインjsnapy
は、jsnapyの失敗したテストに関する追加情報を画面に表示するのに役立ちます。
各失敗したテストについては、プレイブックのRECAPの後にログが表示されます。例:
PLAY RECAP *********************************************************************
qfx10002-01 : ok=3 changed=0 unreachable=0 failed=1
qfx10002-02 : ok=3 changed=0 unreachable=0 failed=1
qfx5100-01 : ok=1 changed=0 unreachable=0 failed=1
JSNAPyの結果: qfx10002-01 **************************************************
'//bgp-information/bgp-peer'の'peer-state'の値が{"peer-as": "65200", "peer-state": "Active", "peer-address": "100.0.0.21"}で'is-equal'ではありません。
'//bgp-information/bgp-peer'の'peer-state'の値が{"peer-as": "60021", "peer-state": "Idle", "peer-address": "192.168.0.1"}で'is-equal'ではありません。
'//interface-information/physical-interface[normalize-space(admin-status)='up' and logical-interface/address-family/address-family-name ]'の'oper-status'の値が{"oper-status": "down", "name": "et-0/0/18"}で'is-equal'ではありません。
JSNAPyの結果: qfx10002-02 **************************************************
'//bgp-information/bgp-peer'の'peer-state'の値が{"peer-as": "65200", "peer-state": "Active", "peer-address": "100.0.0.21"}で'is-equal'ではありません。
コールバックプラグインはデフォルトで有効になっていません。手動でAnsible設定ファイルの[defaults]
セクションにcallback_whitelist
変数を使って追加する必要があります。
jsnapy
コールバックプラグインを有効にするために、Ansible設定ファイルに次の行を追加する必要があります:
[defaults]
callback_whitelist = jsnapy
ドキュメント
公式Juniperドキュメント(詳細な情報、例を含む)
インストール
システムに依存関係をインストールする必要があります。 依存関係はrequirements.txtを確認してください。
注意事項
MacOS Mojaveおよび新しいバージョン
MacOS Mojave以上(>=10.14)では、システムのssh-keygen
で作成されたSSHキーは、新しい'OPENSSH'キー形式を使用して作成されます。これにより、ssh_private_key_file
の使用に直接影響します。キーの作成/変換/確認の手順は以下の通りです:
- 新しいRSAキーを作成:
ssh-keygen -m PEM -t rsa -b 4096
- 既存のキーを確認:
head -n1 ~/.ssh/some_private_key
RSAキーは-----BEGIN RSA PRIVATE KEY-----
で、OPENSSHキーは-----BEGIN OPENSSH PRIVATE KEY-----
になります。 - OPENSSHキーをRSAキーに変換:
ssh-keygen -p -m PEM -f ~/.ssh/some_key
Ansible Galaxyコレクション
juniper.device
コレクションの最新バージョンをインストールするには、ansible-galaxy installコマンドを使用できます。
sudo ansible-galaxy collection install juniper.device
また、ansible-galaxy installコマンドを使って、GitHubから直接最新の開発バージョンのjunosコレクションをインストールすることもできます。
sudo ansible-galaxy collection install git+https://github.com/Juniper/ansible-junos-stdlib.git#/ansible_collections/juniper/device
Gitクローン
テストのためにこのリポジトリをgit clone
して、リポジトリディレクトリ内でenv-setup
スクリプトを実行できます:
user@ansible-junos-stdlib> source env-setup
これにより、$ANSIBLE_LIBRARY
変数がリポジトリの場所とインストールされたAnsibleライブラリパスに設定されます。例えば:
$ echo $ANSIBLE_LIBRARY /home/jeremy/Ansible/ansible-junos-stdlib/library:/usr/share/ansible
Docker
JSNAPyとPyEZを含むDockerコンテナとしてこれを実行するには、Docker Hubからプルして実行します。次のコマンドで最新のイメージをプルし、インタラクティブなashシェルで実行します。
docker run -it --rm juniper/pyez-ansible
おそらく、プレイブックや関連ファイルを含むホストディレクトリをバインドマウントしたいでしょう。次のコマンドで現在の作業ディレクトリをバインドマウントし、ashシェルを開始します。
docker run -it --rm -v $PWD:/project juniper/pyez-ansible
このコンテナを実行可能な方法として、自分のプレイブックを実行するのに利用することもできます。以下のような典型的なプレイブック構造があるとしましょう:
example
|playbook.yml
|hosts
|-vars
|-templates
|-scripts
exampleディレクトリに移動して、次のコマンドでプレイブックを実行します:
cd example/ docker run -it --rm -v $PWD:/playbooks juniper/pyez-ansible ansible-playbook -i hosts playbook.yml
コンテナ名の後に有効なコマンド文字列を渡すことができ、そのコマンドはBashで実行されます。
基本コマンドは常にほぼ同じであることに気付いたかもしれません。いくつかのキーストロークを節約するためにエイリアスを使用することもできます。
alias pb-ansible="docker run -it --rm -v $PWD:/project juniper/pyez-ansible ansible-playbook" pb-ansible -i hosts playbook.yml
追加パッケージでコンテナを拡張する
コンテナのインスタンス化時に、追加のOS(Alpine)パッケージ、Pythonパッケージ(pip経由)、Ansibleコレクションをインストールすることが可能です。これは、環境変数を渡すか、ファイルをバインドマウントすることで実行できます。
OSパッケージ
環境変数: $APK
バインドマウント: /extras/apk.txt
ファイルフォーマット:有効なAlpineパッケージのリスト(行ごとに1つ)
例:
環境変数として、パッケージリストが現在のディレクトリにある場合:
docker run -it --rm -v $PWD:/project -e APK="apk.txt" juniper/pyez-ansible
バインドマウントとして:
docker run -it --rm -v $PWD/apk.txt:/extras/apk.txt juniper/pyez-ansible
Pythonパッケージ
環境変数: $REQ
バインドマウント: /extras/requirements.txt
ファイルフォーマット:pip requirementsファイル
例:
docker run -it --rm -v $PWD:/project -e REQ="requirements.txt" juniper/pyez-ansible
バインドマウントとして:
docker run -it --rm -v $PWD/requirements.txt:/extras/requirements.txt juniper/pyez-ansible
Ansibleパッケージ
環境変数: $ROLES
バインドマウント: /extras/requirements.yml
ファイルフォーマット:Ansible requirementsファイル
注: これはコレクションおよびロールの両方で機能します。
例:
docker run -it --rm -v $PWD:/project -e REQ="requirements.yml" juniper/pyez-ansible
バインドマウントとして:
docker run -it --rm -v $PWD/requirements.txt:/extras/requirements.yml juniper/pyez-ansible
プレイブックの例
この例では、Ansibleを使用してJunos OSを実行しているデバイス上にソフトウェアイメージをインストールまたはアップグレードする方法をアウトラインします。
---
- name: Junos OSのインストール
hosts: dc1
connection: local
gather_facts: false
vars:
wait_time: 3600
pkg_dir: /var/tmp/junos-install
os_version: 14.1R1.10
os_package: jinstall-14.1R1.10-domestic-signed.tgz
log_dir: /var/log/ansible
tasks:
- name: NETCONF接続の確認
ansible.builtin.wait_for:
host: "{{ inventory_hostname }}"
port: 830
timeout: 5
- name: Junos OSパッケージのインストール
juniper.device.software:
reboot: true
version: "{{ os_version }}"
package: "{{ pkg_dir }}/{{ os_package }}"
logfile: "{{ log_dir }}/software.log"
register: sw
notify:
- Wait_reboot
handlers:
- name: 再起動を待つ
ansible.builtin.wait_for:
host: "{{ inventory_hostname }}"
port: 830
timeout: "{{ wait_time }}"
when: not sw.check_mode
依存関係
このモジュールをAnsibleコントロールマシンにインストールするためには、次のものが必要です:
- Python >= 3.8
- Ansible 2.9以降
- Junos py-junos-eznc 2.6.0以上
- jxmlease 1.0.1以上
- xmltodict 0.13.0以上
- jsnapy 1.3.7以上
ライセンス
Apache 2.0
サポート
このjuniper.device
コレクションのサポートはコミュニティおよびJuniper Networksによって提供されています。
juniper.device
コレクション内のモジュールに関して問題がある場合は、以下のことができます:
- GitHubの問題を開く。
- Googleグループに質問を投稿する
- [email protected]にメールを送る
- JTACケースを開く
Ansibleコアに含まれるJunosモジュールのサポートはAnsibleにより提供されます。Ansibleコアモジュールに問題がある場合は、Ansibleプロジェクトに対してGitHubの問題を開く必要があります。
貢献者
Juniper Networksは、このリポジトリに積極的に貢献し、維持しています。問い合わせは[email protected]までお願いします。
- contribuição者:* Stephen Steiner, Dinesh Babu, Chidanand Pujar
元貢献者:
Stacy W Smith, Jeremy Schulman, Rick Sherman, Damien Garros, David Gethings, Nitin Kumar, Rahul Kumar
ansible-galaxy install juniper.junos