Download - Ansible study1
JUNOS MODULE INAnsible 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