JUNOS MODULE IN
Ansible Study #1 - 06/10/2014	

Hideki Saito { twitterid: @saito_hideki }	

* Internet Initiative Japan Inc.
AGENDA
WHO AM I	

MOTIVATION	

ABOUT JUNOS	

WHAT IS NETCONF	

CONFIGURE NETCONF ON JUNOS	

JUNOS MODULE
おまえだれよ?
さいとうひでき
TwitterID: @saito_hideki
所属: 株式会社インターネットイニシアティブ
仕事: クラウド関連のちょっとした開発とか運用とかリサー
チとか、ちょっとした仕事で食ってます
趣味: コンテナ型データセンタの運用とOpenStack
MOTIVATION
日々の業務で繰り返し行われるシステム構築作業を自動化する一環
として、OSのプロビジョニング作業の中で[2,4]を行うワークフロー
を人手に頼らず自動化して、単純だがミスの許されない作業から開
放されたい。
例 ∼ 大まかなシステム構築作業の流れ ∼
1. Cobblerなどのプロビジョニングシステムでデプロイ設定を実施
2. サーバを収容するスイッチポートのVLANをサービス用からのデプロイ用に変更
3. サーバにOSをプロビジョニングしてサービス用設定を実施
4. サーバを収容するスイッチポートのVLANをデプロイ用からサービス用に変更
5. サーバ再起動
ABOUT JUNOS
JUNOSはJuniper Networks社製のネットワーク機器に採用され
ているFreeBSDベースのオペレーティングシステム
CLIやSNMPなどの従来の設定方式の他にJUNOscriptやNETCONF
といった、より進んだリモート管理手法を提供しているのが特徴
http://www.juniper.net/techpubs/en_US/junos13.3/information-products/pathway-pages/config-
guide-automation/configuration-and-operations-automation.html	

http://www.juniper.net/techpubs/en_US/junos13.3/information-products/pathway-pages/netconf-
guide/netconf.html
WHAT IS NETCONF
ネットワーク機器を設定する目的で利用されるXMLベース
のプロトコル。SSH経由でリモートから機器の設定を実施
することが可能。
http://datatracker.ietf.org/wg/netconf/charter/
http://en.wikipedia.org/wiki/NETCONF
ENABLE NETCONF ON JUNOS
JUNOSが動作するネットワーク機器でNETCONFを有効化する。
例 ∼ EX3300 (JUNOS version 12.3R5.7) ∼
user@ex3300# set system services netconf ssh
user@ex3300# commit
user@ex3300# show system services
ssh {
root-login deny;
connection-limit 10;
}
netconf {
ssh;
}
ANSIBLE MODULES
ソースコードの中のAnsibleモジュール
ansible/library/ 以下にカテゴリ毎に配置されている。
JUNOSモジュールは ansible/library/net_infrastructure/ 以下に置くこと
とした。
実行環境でのAnsibleモジュール
$PYTHONPATH/share/ansible/ 以下にカテゴリ毎にインストールされる。
virtualenv環境の場合は $VIRTUAL_ENV/share/ansible/ 以下にカテゴリ
毎にインストールされる。
ドキュメント
http://docs.ansible.com/modules.html
JUNOS MODULE
JUNOSモジュール(junos_port, junos_vlan)の仕組み
1. ansible, ansible-playbookコマンド実行
2. localhost(ansible-node)にSSHログイン
3. ansible-nodeでXMLファイル生成
4. EX3300にSSH経由でXMLファイルを送信
5. EX3300でcommit check
6. EX3300でcommit
AArriissttaaのはあるけど
JJUUNNOOSSのは無いから
nncccclliieennttライブラリを
利用して自分で書いた…


あんまりうれしくない
綿密な設計図
vviirrttuuaalleennvvにも対応
JUNOS MODULE
junos_vlanモジュール
操作対象スイッチに対するVLANの作成/削除を行う。
stateがpresentの場合は作成、absentの場合は削除を実施
!
options:
node: 操作対象スイッチのノード名またはIPアドレス
port: 操作対象スイッチの接続ポート
user: ログインユーザID
password: ログインパスワード
vlan_name: 作成するVLANの名称を指定
vlan_id: 作成するVANのIDを指定
vlan_desc: VLANの概要を記述
state: 作成(present), 削除(absent)
virtualenv: virtuanenvパス
(例) VLAN作成用XML
<config>
<configuration>
<vlans>
<vlan operation="create">
<name>{{ vlan_name }}</name>
<description>{{ vlan_desc }}</description>
<vlan-id>{{ vlan_id }}</vlan-id>
</vlan>
</vlans>
</configuration>
</config>
JUNOS MODULE
junos_vlanモジュールを利用してスイッチにVLAN1000を作成する。
1. 設定前の状態
2. 設定実施 (名称: VLAN1000, VLANID: 1000, コメント: TEST_VLAN)
3. 設定後の状態
junos# show vlans VLAN1000
{master:1}[edit]
ansible-node$ ansible -i etc/hosts -u $ANSIBLE_USER -k -m junos_vlan 
-a “node=$NODE user=$USER password=$PASSWD vlan_name=VLAN1000 vlan_id=1000 vlan_desc=TEST_VLAN virtualenv=/home/saitou/devel
state=present" localhost
SSH password: ********
127.0.0.1 | success >> {
"changed": true,
"results": "commit succeeded"
}
junos# show vlans VLAN1000
description TEST_VLAN;
vlan-id 1000;
{master:1}[edit]
JUNOS MODULE
junos_portモジュール
操作対象スイッチのポートに対するVLAN(いわゆるPortVLAN)
の設定を行う。 stateがpresentの場合はVLANを割り当て、
absentの場合は割り当てを解除する
options:
node: 操作対象スイッチのノード名またはIPアドレス
port: 操作対象スイッチの接続ポート
user: ログインユーザID
password: ログインパスワード
interface: ポート番号(例: xe-0/0/0)
mode: ポートのモードを指定(access または trunk)
vlans: カンマ’,’区切りの形式でポートに設定する
VLAN名を指定
interface_desc: ポートの概要を記述
state: 割り当て(present), 割り当て解除(absent)
virtualenv: virtuanenvパス
(例) PortVLAN設定用XML
<config>
<configuration>
<interfaces>
<interface>
<name>{{ interface }}</name>
<description>{{ interface_desc }}</description>
<unit>
<name>0</name>
<family>
<ethernet-switching>
<port-mode>{{ mode }}</port-mode>
<vlan>
<members>{{ member }}</members>
</vlan>
</ethernet-switching>
</family>
</unit>
</interface>
</interfaces>
</configuration>
</config>
JUNOS MODULE
junos_portモジュールを利用してスイッチにPort VLANを設定する。
1. 設定前の状態
2. 設定実施 (名称: VLAN1000, VLANID: 1000, コメント: TEST_VLAN)
3. 設定後の状態
junos# show interface ge-0/0/40
unit 0 { family ethernet-switching; }
{master:1}[edit]
ansible-node$ $ ansible -i etc/hosts -u $ANSIBLE_USER -k -m junos_port 
-a "node=$NODE user=$USER password=$PASSWD interface=ge-0/0/40 mode=access vlans=VLAN1000 interface_desc=TEST_NETWORK
state=present virtualenv=/home/saitou/devel" localhost
SSH password: ********
127.0.0.1 | success >> {
"changed": true,
"results": "commit succeeded"
}
junos# show interfaces ge-0/0/40
description TEST_NETWORK;
unit 0 { family ethernet-switching { port-mode access; vlan { members VLAN1000; }}}
{master:1}[edit]
JUNOS MODULE
実際に使ってみる
(デモ)
JUNOS MODULE
まとめ
JUNOSを操作するためのAnsibleのモジュールを作って実際に使ってみた。
日常業務の一部を自動化するための手段としてAnsibleを利用して安全に定型作業を
行うことができるようになった。
ピンとこなかったAnsibleのモジュール作成方法がなんとなくわかった。冪等性を担
保するのは俺だった!
NETCONF over SSHは便利!だけれども設定変更内容の反映(commit)にEX3300
でVCを組んだ状態で60秒程度かかる(これは自前でスクリプトを書いていた頃から
判っていた)ので手返しはイマイチよろしくない。
Juniper Networksさんには怒られいような気もしているので、どこかで公開した
い。
JUNOS MODULE
もうちょっと真面目に清書してから公開しよう
と思っていますが、もしも いまの状態でも
「このモジュールを使ってみたい…」
というひとは @saito_hideki まで連絡ください。
ご静聴ありがとうございましたm(__)m

Ansible study1