16
JUNOS MODULE IN Ansible Study #1 - 06/10/2014 Hideki Saito { twitterid: @saito_hideki } * Internet Initiative Japan Inc.

Ansible study1

Embed Size (px)

Citation preview

Page 1: Ansible study1

JUNOS MODULE INAnsible Study #1 - 06/10/2014 Hideki Saito { twitterid: @saito_hideki } * Internet Initiative Japan Inc.

Page 2: Ansible study1

AGENDA

WHO AM I

MOTIVATION

ABOUT JUNOS

WHAT IS NETCONF

CONFIGURE NETCONF ON JUNOS

JUNOS MODULE

Page 3: Ansible study1

おまえだれよ?

さいとうひでき

TwitterID: @saito_hideki

所属: 株式会社インターネットイニシアティブ

仕事: クラウド関連のちょっとした開発とか運用とかリサーチとか、ちょっとした仕事で食ってます

趣味: コンテナ型データセンタの運用とOpenStack

Page 4: Ansible study1

MOTIVATION

日々の業務で繰り返し行われるシステム構築作業を自動化する一環として、OSのプロビジョニング作業の中で[2,4]を行うワークフローを人手に頼らず自動化して、単純だがミスの許されない作業から開放されたい。

例 ~ 大まかなシステム構築作業の流れ ~ 1. Cobblerなどのプロビジョニングシステムでデプロイ設定を実施 2. サーバを収容するスイッチポートのVLANをサービス用からのデプロイ用に変更 3. サーバにOSをプロビジョニングしてサービス用設定を実施 4. サーバを収容するスイッチポートのVLANをデプロイ用からサービス用に変更 5. サーバ再起動

Page 5: Ansible study1

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

Page 6: Ansible study1

WHAT IS NETCONF

ネットワーク機器を設定する目的で利用されるXMLベースのプロトコル。SSH経由でリモートから機器の設定を実施することが可能。

http://datatracker.ietf.org/wg/netconf/charter/

http://en.wikipedia.org/wiki/NETCONF

Page 7: Ansible study1

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; }

Page 8: Ansible study1

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

Page 9: Ansible study1

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にも対応

Page 10: Ansible study1

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>

Page 11: Ansible study1

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]

Page 12: Ansible study1

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>

Page 13: Ansible study1

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]

Page 14: Ansible study1

JUNOS MODULE

実際に使ってみる (デモ)

Page 15: Ansible study1

JUNOS MODULE

まとめ

JUNOSを操作するためのAnsibleのモジュールを作って実際に使ってみた。

日常業務の一部を自動化するための手段としてAnsibleを利用して安全に定型作業を行うことができるようになった。

ピンとこなかったAnsibleのモジュール作成方法がなんとなくわかった。冪等性を担保するのは俺だった!

NETCONF over SSHは便利!だけれども設定変更内容の反映(commit)にEX3300でVCを組んだ状態で60秒程度かかる(これは自前でスクリプトを書いていた頃から判っていた)ので手返しはイマイチよろしくない。

Juniper Networksさんには怒られいような気もしているので、どこかで公開したい。

Page 16: Ansible study1

JUNOS MODULE

もうちょっと真面目に清書してから公開しよう と思っていますが、もしも いまの状態でも 「このモジュールを使ってみたい…」

というひとは @saito_hideki まで連絡ください。

ご静聴ありがとうございましたm(__)m