てくなべ (tekunabe)

ansible / network automation / 学習メモ

Juniperの仮想ファイアウォール(firefly perimeter/vSRX)を検証用にローカルに構築する

f:id:akira6592:20170715115057p:plain

■ はじめに

Juniper社は、検証用に仮想ファイアウォール(firefly perimeter/vSRX)のイメージファイルを提供しています。 イメージファイルはVagrant Cloud上(旧Atlas)にあります。 app.vagrantup.com

この記事では、ちょっとした操作感を簡単に試したり、ネットワーク自動化ツールとの連携を試したりする目的でローカルに環境を構築してCLI、Web GUIでログインできるところまでの手順を説明します。

環境

■ Virtual Box のインストー

今回は仮想化ソフトウェアとして Virtualboxを利用します。インストールしていない場合は以下のページからダウンロードしてインストールしておきます。 https://www.virtualbox.org/wiki/Downloads

Vagrant のインストー

仮想環境構築ソフトウェアとして Vagrant を利用します。インストールしていない場合は以下のページからダウンロードしてインストールしておきます。 https://www.vagrantup.com/downloads.html

仮想マシンの準備と起動

JUNOS用 vagrant プラグインのインストー

以下のコマンドで2つのプラグインをインストールします。

・コマンド

vagrant plugin install vagrant-junos
vagrant plugin install vagrant-host-shell

・ログ

D:\users\user\Documents\VirtualBox VMs\srx>vagrant plugin install vagrant-junos
Installing the 'vagrant-junos' plugin. This can take a few minutes...
Installed the plugin 'vagrant-junos (0.2.1)'!

D:\users\user\Documents\VirtualBox VMs\srx>vagrant plugin install vagrant-host-shell
Installing the 'vagrant-host-shell' plugin. This can take a few minutes...
Installed the plugin 'vagrant-host-shell (0.0.4)'!

Vagrantfileの作成(vagrant init)

以下のコマンドで Vagrantfile を作成します。

・コマンド

vagrant init juniper/ffp-12.1X47-D15.4

・ログ

D:\users\user\Documents\VirtualBox VMs\srx>vagrant init juniper/ffp-12.1X47-D15.4
A `Vagrantfile` has been placed in this directory. You are now
ready to `vagrant up` your first virtual environment! Please read
the comments in the Vagrantfile as well as documentation on
`vagrantup.com` for more information on using Vagrant.

仮想マシンの起動(vagrant up)

以下のコマンドで仮想マシンを起動します。

・コマンド

vagrant up

・ログ

D:\users\user\Documents\VirtualBox VMs\srx>vagrant up
Bringing machine 'default' up with 'virtualbox' provider...
==> default: Importing base box 'juniper/ffp-12.1X47-D15.4'...
==> default: Matching MAC address for NAT networking...
==> default: Checking if box 'juniper/ffp-12.1X47-D15.4' is up to date...
==> default: Setting the name of the VM: srx_default_1500081122453_26114
==> default: Clearing any previously set network interfaces...
==> default: Preparing network interfaces based on configuration...
    default: Adapter 1: nat
==> default: Forwarding ports...
    default: 22 (guest) => 2222 (host) (adapter 1)
==> default: Booting VM...
==> default: Waiting for machine to boot. This may take a few minutes...
    default: SSH address: 127.0.0.1:2222
    default: SSH username: root
    default: SSH auth method: private key
    default:
    default: Vagrant insecure key detected. Vagrant will automatically replace
    default: this with a newly generated keypair for better security.
    default:
    default: Inserting generated public key within guest...
    default: Removing insecure key from the guest if it's present...
    default: Key inserted! Disconnecting and reconnecting using new SSH key...
==> default: Machine booted and ready!
Sorry, don't know how to check guest version of Virtualbox Guest Additions on this platform. Stopping installation.
==> default: Checking for guest additions in VM...
    default: No guest additions were detected on the base box for this VM! Guest
    default: additions are required for forwarded ports, shared folders, host only
    default: networking, and more. If SSH fails on this machine, please install
    default: the guest additions and repackage the box to continue.
    default:
    default: This is not an error message; everything may continue to work properly,
    default: in which case you may ignore this message.

なお、 イメージファイルが見つからない旨のエラーメッセージが表示された場合は、ffp-12.1X47-D15.4 の箇所があっているか、Vagrant Cloud上で確認してください。

https://app.vagrantup.com/juniper/

しばらくすると、Virtualbox マネージャーでも仮想環境が起動したことが確認できます

f:id:akira6592:20170715115356p:plain

■ Web GUIアクセスログインのための設定

ユーザ作成とパスワード設定

SSHlocalhost:2222 に接続します。(デフォルトで「2222→22」にポートフォワーディングが設定されています) なお、ログインのためのrootの秘密鍵は、vagrant up したフォルダの .vagrant\machines\default\virtualbox\private_key にあります。

ログインできたら、ユーザーの作成とパスワードの設定を行います。設定を反映するための commit も忘れずに行います。

root@vsrx% cli

root@vsrx> configure
Entering configuration mode

[edit]
root@vsrx# set system login user [ユーザー名] class super-user

[edit]
root@vsrx# set system login user [ユーザー名] authentication plain-text-password
New password: [パスワードを入力]
Retype new password: [パスワードを入力]

[edit]
root@vsrx# commit
commit complete

ポートフォワーディング設定

デフォルトだど仮想インターフェースがNATモードなので、WEB GUIアクセスするためにはポートフォワーディングの設定が必要になります。ここではVirtual Box側の設定として以下のように「8888→80」に設定します。

f:id:akira6592:20170715114549p:plain

■ Web GUIログイン確認

Webブラウザで http://localhost:8888 にアクセスして、先ほど作成したユーザーでログインでします。

f:id:akira6592:20170715114610p:plain

無事ログインできました。

仮想マシンのシャットダウン

vagrant halt

するか、通常のSRXと同じように

root@vsrx> request system power-off

のようにしてシャットダウンします。

■ さいごに

今回はなるべく少ない手順で構築したため、インターフェースが1つだったりとファイアウォールとしては体をなしていない状態ですが、とにかく「JUNOSのコマンド体系に慣れたい」「SRXのWeb GUI画面に慣れたい」といった用途には利用できるのではないでしょうか。 必要に応じてカスタマイズしていただければと思います。

第10回 Jenkins勉強会 の資料まとめ

参加できませんでしたが、2017/7/7 に第10回 Jenkins勉強会が実施されたそうです。 www.meetup.com

資料のまとめた見当たらなかったので、自分で探してこちらにまとめさせていただきます。

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net

www.slideshare.net

speakerdeck.com

ネットワーク自動化の勉強会を開催します(Ansible/SaltStack/Netmiko/NAPALM)

7月と8月にネットワーク自動化の勉強会を開催しますのでご案内いたします。(2回とも同一内容です。)

実施概要

近年、APIに対応していないネットワーク機器でも自動化できる方法が増えてきました。 一方で、「興味はあるけど、試してみる時間も環境もない!」という方も多いのではないでしょうか。

そんな方のために、自動化のためのツールやライブラリを使ってみた所感や、 それぞれの特徴などについてデモを交えながらご紹介します。 自動化ツール導入の参考にして下さい。

取り扱うルーツ

1.構成管理ツール

  • その1:Ansible
  • その2:SaltStack

2.Pythonライブラリ

  • その1:Netmiko
  • その2:NAPALM

※一部デモ実施予定

日時場所などの詳細は以下のconnpassのページをご覧ください。

7/21開催分 詳細

8a1-apc.connpass.com

8/18開催分 詳細

8a1-apc.connpass.com

よろしくお願いいたします。

Python 3 エンジニア認定基礎試験に合格しました

f:id:akira6592:20170612212149p:plain

2017/06/09 に「Python 3 エンジニア認定基礎試験」が開始されました。

www.pythonic-exam.com

6/10に受験して合格しましたので、感想や自分の勉強方法を書きたいと思います。

試験の感想

特にクセもなく、素直な問題が多く、基礎試験という名の通りとだ感じました。 公開されている各分野の出題率を確認するとわかりますが、基礎知識にあたるがよく出題されるようになっています。

勉強方法

利用した教材

試験の認定教材でもある、オライリーの「Pythonチュートリアル 第3版」を利用しました。 www.oreilly.co.jp

Pythonの公式サイトにもPythonチュートリアルのコンテンツがあるのですが、単純に紙が好きなので書籍を購入しました。 なお、書籍が想定しているバージョンは3.5.1です。

勉強の流れ

(1) 書籍の読み込み

Pythonチュートリアル 第3版」を一通り読み込みました。

なお、Pythonチュートリアルは、プログラミングの基礎についてはあまり書かれていません。 そのため、プログラミング自体の経験がない方は、必要に応じてもっと基礎的な内容を ていねいに説明した本を併せて読むほうが勉強を進めやすいかもしれません。

(2) 動作の確認

書籍を読んで気になった箇所はJupyter Notebook(厳密にはAzure Notebooks)に コードと自分用の説明を書いて「動くあんちょこ」としてまとめました。

(3) 問題の作成

まだこの試験対策の問題が見当たらなかったので、自分で問題を作って勉強仲間のコミュニティに出題していました。 正解と不正解の選択肢を考えて作ることで、勘違いしやすい仕様や曖昧な理解の箇所も整理できた気がします。


Pythonの基礎を身に付けるける良いきっかけになったと思います。 PythonにはNAPALMのように開発が活発なネットワーク機器向けのライブラリがありますし、Pythonが読めるとAnsibleの詳細な挙動も読み取れたりするので、今後もPythonとのお付き合いはこれからも続くと思います。

ネットワーク自動化関連の気になる書籍

ネットワーク自動化関連で、気になっている書籍が2つあるのでご紹介します。 どちらも現在のところ2017年8月発売予定となっています。

Network Programmability and Automation: Skills for the Next-generation Network Engineer

https://www.amazon.co.jp/dp/1491931256/

自動化に向けてネットワークエンジニアが身に着けるべきスキルについての書籍。 オライリーのサイトで、Early Release 版がチラ見できます。 https://library.oreilly.com/book/0636920042082/network-programmability-and-automation/toc

「そもそもJSONYAMLとは何か」といった説明もあり、結構基礎的なことも書かれているようです。


Mastering Python Networking

https://www.amazon.co.jp/dp/B06XPQV549/

Python をベースとしたネットワーク自動化についての書籍で、Ansibleについても書かれているようです。

以下引用です。

What you will learn

  • Review all the fundamentals of Python and the TCP/IP suite
  • Use Python to execute commands when the device does not support the API or programmatic interaction > with the device
  • Implement automation techniques by integrating Python with Cisco, Juniper, and Arista eAPI
  • Integrate Ansible using Python to control Cisco, Juniper, and Arista networks
  • Achieve network security with Python
  • Build Flask-based web-service APIs with Python
  • Construct a Python-based migration plan from a legacy to scalable SDN-based netwo

Ansible のフィルターでリストから組み合わせを生成する(combinations, zip, zip_longest)

f:id:akira6592:20170604104846p:plain

■ はじめに

Ansible 2.3 でCombination Filters というリストの組み合わせを生成するフィルターが追加されました。 公式ドキュメントに使用例が載っていますが、いくつか実際に試してみて出力結果を含めて確認します。

Filters — Ansible Documentation

■ combinations で組み合わせを生成する

1つのリストを元に組み合わせを生成します。

使い方

例:リスト[1,2,3,4,5] から2つ選ぶ組み合わせを生成する

- name: give me combinations for sets of 2
  debug: msg="{{ [1,2,3,4,5]|combinations(2)|list }}"

実行結果

"msg": [
    [
        1,
        2
    ],
    [
        1,
        3
    ],
    [
        1,
        4
    ],
    [
        1,
        5
    ],
    [
        2,
        3
    ],
    [
        2,
        4
    ],
    [
        2,
        5
    ],
    [
        3,
        4
    ],
    [
        3,
        5
    ],
    [
        4,
        5
    ]
]

■ zip でリストを統合する

Pythonzip 関数のように、リストから組み合わせを生成します。 2つのリストの長さが異なる場合は、短いほうに合わせられます。

使い方

例:2つのリストが統合する

- name: give me shortest combo of 2 lists
  debug: msg="{{ [1,2,3]|zip(['a','b','c','d','e','f'])|list }}"

実行結果

"msg": [
    [
        1,
        "a"
    ],
    [
        2,
        "b"
    ],
    [
        3,
        "c"
    ]
]

■ zip_longest でリストを統合する

Pythonzip_longest関数のように、リストから組み合わせを生成します。 前述の zip とは異なり、2つのリストの長さが異なる場合は、長いほうに合わせられます。 足りない部分はfillvalueで指定したもので補完されます。

使い方

例:3つのリストを統合し、足りない部分は 'X' で補完する

- name: give me longest combo of 3 lists , fill with X
  debug: msg="{{ [1,2,3]|zip_longest(['a','b','c','d','e','f'], [21, 22, 23], fillvalue='X')|list }}"

実行結果

"msg": [
    [
        1,
        "a",
        21
    ],
    [
        2,
        "b",
        22
    ],
    [
        3,
        "c",
        23
    ],
    [
        "X",
        "d",
        "X"
    ],
    [
        "X",
        "e",
        "X"
    ],
    [
        "X",
        "f",
        "X"
    ]
]

■ さいごに

他の方法で代替できるケースもありそうですが、複雑になる場合はこれらのフィルターを利用するのが便利そうです。

以上です。

Netmikoで 「TELNET」経由のネットワーク機器自動化を試す

■ はじめに

Netmiko とは、Cisco IOS や Juniper Junos などのネットワーク機器にSSHでログインして操作するのを助けてくれるPythonのライブラリです。 例えば、ログインやコンフィギュレーションモードへの移行、ログアウトなどの操作は関数として抽象化されています。 IPアドレスやOSPFの設定など、細かい設定はコマンドを直接指定するタイプです。

github.com

上記リポジトリの説明にはSSH接続と記載されていますが、過去のリリースノート等を確認するとTELNETでも接続できるようです。 今回はCisco IOS機器へのTELNETを試してみます。

[参考] Netmiko 1.0 Release · Issue #245 · ktbyers/netmiko · GitHub

[通常の使い方] Netmiko Quickstart - Network to Code, LLC

【ご注意】
盗聴や改ざん等のセキュリティ上の観点により、
TELNETではなくSSHが推奨されます。
この記事はTELNETを推奨する意図はありません。
ネットワーク自動化系のライブラリやツールは、
CLIはSSH経由のものが多いため「TELNETが可能なものもある」
ということを知識、経験としておさえておくために
検証した結果を記事にしたものです。

■ 準備

Netmiko をインストールします。

pip install netmiko

■ コード

以下の要件のコードを記述します。

  • TELNETでログインして、vlan 1 の description を設定
  • 事前事後で running-config を確認

Netmiko の仕様として、通常通りSSHであれば device_type"cisco_ios" と指定するところ、 "cisco_ios_telnet" と指定するところがポイントです。

from netmiko import ConnectHandler

# デバイスのタイプやIPアドレス、認証情報をディクショナリで定義
cisco = {
    "device_type": "cisco_ios_telnet",
    "ip": "192.168.1.13",        # 接続先のCisco IOS機器
    "username": "testuser",      # ログインユーザー
    "password": "testpassword",  # ログインパスワード
    "secret": "enablepassword"   # enable パスワード
}

# TELNET接続して、コネクションオブジェクトを取得
net_connect = ConnectHandler(**cisco)

# 特権モードへ移行する
net_connect.enable()

print("--- [●事前確認] ---")
# show コマンドを実行
output = net_connect.send_command("show run int vlan 1")
# 結果を出力
print(output)

# 実行したい設定コマンドをリストで定義
lines = ["int vlan 1", "description hogehoge"]
# 設定コマンドを実行(事前のconf tも自動で実行される)
output= net_connect.send_config_set(lines)

print("\n--- [●事後確認] ---")
# show コマンドを実行
output = net_connect.send_command("show run int vlan 1")
# 結果を出力
print(output)

# 切断
net_connect.disconnect()

■ 実行結果

以下のように description が正常に追加されました。

--- [●事前確認] ---
Building configuration...

Current configuration : 77 bytes
!
interface Vlan1
 ip address 10.0.101.1 255.255.255.0
 ip ospf cost 10
end


--- [●事後確認] ---
Building configuration...

Current configuration : 99 bytes
!
interface Vlan1
 description hogehoge
 ip address 10.0.101.1 255.255.255.0
 ip ospf cost 10
end

■ 本当にTELNETか確認

念のため、本当にTELNET接続しているのか確認します。ここでは wireshark でパケットキャプチャして確認します。

※自身の管理下の環境で確認しています。 f:id:akira6592:20170528205334p:plain

さらに 「Follow TCP Stream」で当該TELNETセッションを流れを確認します。

f:id:akira6592:20170528205345p:plain

■ さいごに

Netmiko を利用して、TELNET経由で Cisco IOS 機器へ簡単な設定をすることができました。 ただし、冒頭の注意書きの通りTELNETはセキュリティ観点で推奨されません。 もし、既存の自動化システムの調査していてNetmikoが利用されている場合、SSHだと決めつけずにtelnetかもしれないという確認のきっかけにはなるかと思います。