なんかてきとうに

わりと個人的な忘備録的ですよ。

NetOpsCoding#4に行ってみた

NetOpsCoding#4 : ATND

資料もイベントページに上がっているのでそちらをご覧ください。

一番最初の株式会社フィックスポイント 服部 健太 さんの話を聞けただけでも行った価値はあったかなというところ。

ノンプログラマに使えるものはどいうものなのか、というところを考えさせられた。

LTでは株式会社サイバーエージェント 十場 裕 さんのレガシーデバイス向けにマネジメントサーバを立てて、そこ経由でAPIちっくにアクセスできるようなものをGo langで作っていて、そのうち公開したいという話が今後に期待という感じです。

年末くらいまでにはとおっしゃっていました。

Ansible Towerの話も別の方のLTで触れられていました。 Ansible Towerのほうは、APIを叩くとjobがキックされて、それが非同期で実行されるスタイルですが、十場さんの作っておられるものは APIちっくに叩くと、その結果がレスポンスとして帰ってくるみたいな。

はて、それは便利なのか、というか抽象化できているのか。みたいなところはあります。 telnet/sshの代わりに httpたたいてるだけなのかな?とか。

デモではもろにコマンドを渡しているだけだったので、それ以外がどんな感じなのか、気になります。

叩いたらすぐにレスポンスが返ってくるというのはうれしいのですが、コマンドの量が多いと、現実的な時間(1秒とか)で帰ってくるのかなというのも気になります。

なにせ、某スイッチをSSH対応させたらログインに2,3秒かかるようになってしまったみたいな笑えない話もあるので。

ネットワークの勉強をするための環境

はじめに

ネットワークの勉強をしていると、やはり動作確認をしたいという欲求は高まってきます。 そんな時、ネットワーク機器が手元にあればどんなに素晴らしいでしょう。 でも、動作確認に必要なだけの機器をそろえようと思うと、 場所やお金がそこそこかかります。特に場所。

ですが、最近はネットワーク機器メーカーも仮想アプライアンスを出していて、 さらに仮想アプライアンスの体験版というか、そういったものを提供してくれています。 そんな仮想アプライアンスの体験版を使えば、手元で仮想的にネットワークを作成して動作確認ができてしまいます。 いい時代になりましたね。

今回はそんな提供されている仮想アプライアンスをダウンロードする方法を紹介します。

Arista vEOS

ダウンロードにはユーザ登録が必要です。

ログインページのNeed a User Account? というところから新規登録しましょう。

名前や所属など、入力必須項目を埋めていけば仮登録されます。

入力したメールアドレス宛に仮登録メールが届きますので、そこから本登録すれば登録完了です。あとは ダウンロードページにvEOSが置かれています。

ダウンロードする必要があるファイルは2つあります。

  • Aboot-veos で始まる isoファイル。 これがvEOSをブートさせるためのファイルです。
  • vEOS-lab-<バージョン番号>.vmdk というファイル。これがvEOSの本体です。

仮想マシンを作り、CDドライブにisoファイルを指定し、HDDにvmdkファイルを指定して実行すれば動きます。

Juniper vSRX

ダウンロードにはユーザ登録が必要です。

ダウンロードまでの手順はvSRXトライアルページが詳しいです。

ユーザ作成ページから Issue TypeをAccess to software downloads(please specify software)にして Description of Issueにtype 60 Day vSRX Trial と記載します。

あとは必須項目を埋めてsubmitボタンを押すと、 数日以内にJuniperのサポートから"英語で"メールが届きます。

項目を埋めてくださいとフォームのようなものがついてくるので、それを埋めて返したり、メールに書かれている指示に従えば 最終的にvSRX体験版がダウンロードできるアカウントが出来上がります。頑張りましょう。

アカウントができたら ダウンロードページのsoftwareというタブからovaファイルがダウンロードできます。

vSRXトライアルページの下の方にClick here to retrieve the license key that activates your 60-dayと記載のある個所があります。 ここから、vSRXのUTMやIPSが60日間使えるようになるライセンスを取得することができます。

Cisco csr1000v

ダウンロードにはユーザ登録が必要です。

これはライセンス的には大丈夫なのかな?と思いつつ、 Ciscoオフィシャルサイト内に言及のあるものなので、いいのかなぁ?と。

ログインページの右側に 新しいアカウントを作成する という項目がありますので、 そこからアカウントを作成します。必要項目を入力し、登録ボタンを押せば登録できます。

登録できたら、ログインすると

ダウンロードページ のdownloadボタンからダウンロードできます。

他のバージョンも、ものによってはダウンロードできます。いずれも古いバージョン(3.15.0Sや3.14.2Sなど)ですが

Brocade vRouter 5600(Vyatta)

トライアル申請ページより申請が必要です。

申請をするとダウンロードページに進めます。そこでisoファイルがダウンロードできます。

トライアルライセンスキーについては、メールで送られてきます。

利用にはオンラインにてアクティベーションする必要があります。

A10 vThunder

トライアル申請ページより申請が必要です。

申請をすると、アクティベーション用URLが送られてきます。

ダウンロードページよりvThunderをダウンロードし、仮想マシンとして実行すると、 UUIDが確認できますので、アクティベーション用URLに申請したメールアドレスとUUIDを記載するとアクティベートできます。

アクティベートできたら、期限まで使えるようになります。

F5 Big-IP

ユーザ登録が必要です。

トライアル申請ページより、 Register からユーザ登録ができます。フリーメールで登録できます。

登録が終わると、トライアル申請ページから ログインすると、トライアル版の60日ライセンスが発行できるようになります。

ダウンロードページからトライアル版がダウンロードできます。

おわりに

いくつかの仮想アプライアンスのダウンロード方法などを記載しました。

何かの参考になればなぁと思います。

個人的にはJuniperの英語でやり取りするというのが結構大変かなと感じます。

が、サポートの方が親切、丁寧に対応してくださるので、翻訳サイトなどを利用して頑張ればなんとかなりますよ。

最初英語にとまどって数日アクション起こせずにいたら催促が来ましたが。

無断転載 #とは

vaaaaaanquish.hatenadiary.jp

無断転載についていろいろと書いてありますね! 私のアイコンも無断転載です!すみません! 好きなアイコンなんですけどオワコンなんです!もう更新されないんですよ!!!

それはさておき。

無断転載とかをRTしたり言及するのはできるだけ避けるようにしてますけど、現実は厳しいのですよね。

Youtubeとかアプリを開いたとたん、真っ先に無断転載動画とかでるじゃないですか?

目的のものを探そうとしても無断転載動画がひっかかるじゃないですか?しかも場合によってはオフィシャルより上位に。

もうね、つらいんです。ほんとに。

アーティストがYoutubeにチャンネル作って、動画上げてるのに、 それより画質が残念な無断転載動画が上位にくるんですよね。

私が見たいのはそれじゃない! 声を大にして言いたい。

こんな感じで読者になってくれるんでしょうか。

Firewallの設定は難しい。

大体題意の通りなのですが。

Firewallなら大抵NAT機能なんかも普通についていて、結構頭が良い。

それだけに、設定値をどうすればいいのかみたいなところが、癖みたいなのを知ってないと苦労するような気がする。という話。

とあるFirewallがEOSになるからと、ルータに乗せ換える設計をしていましたが、

FirewallでNATしていると、NAT変換後のIPアドレスをベースにルールを書くのか、NAT変換前のIPアドレスをベースにルールを書くのか

みたいなところにズレが生じたり、ルールを設定できる箇所が違ったり。

なんだかいろいろ面倒だなぁという感じです。

Linuxiptables触っていると、

  1. パケットがインターフェースに着信する。
  2. 着信インターフェースにてPREROUTINGプロセスが走る
  3. 着信インターフェースにてINPUTフィルターが動作する
  4. FORWARDされる
  5. 発信インターフェースにてOUTPUTフィルターが動作する
  6. 発信インターフェースにてPOSTROUGINGプロセスが走る

みたいな動作をして NATアドレス変換はPREROUTINGとPOSTROUTINGで行われるので、 イメージ的にはルーティングプロセス内IPアドレスと、実世界IPアドレスみたいなのがあって、 フィルターはルーティングプロセス内IPアドレスに対して行う。 というのが正解なんだけれど、

NATアドレス変換後というか、実世界IPアドレスにてルールを設定するFirewallというのに出会って苦労しました。

dockerでansibleのテストをする。

docker でansibleのテストができれば、
きっと、vagrantよりも速いはず!

ということでやってみる。

まずは適当にDockerfile作ってbuild
この時、authorized_keyを設定するようにDockerfileを作ると幸せです。

FROM ...
...
RUN mkdir -p /home/username/.ssh;chown username /home/username/.ssh; chmod 700 /home/username/.ssh
ADD authorized_key /home/username/.ssh/authorized_keys
RUN chown username /home/username/.ssh/authorized_keys;chmod 600 /home/username/.ssh/authorized_keys
...

こんな風に。

あとは普通に

docker build /path/to/Dockerfiledir/ base

出来上がったら、テストしたいansibleのplaybookに登録してある台数分作る。

mkdir -p /tmp/for/docker
chcon -Rt svirt_sandbox_file_t /tmp/for/docker

for i in `seq 1 5`; do mkdir -p /tmp/for/docker/$i; done
chcon -Rt svirt_sandbox_file_t /tmp/for/docker

で、キャッシュ用ディレクトリを作っておくと、2回目以降、ファイルのダウンロードとか楽になるかも。

ただし、キャッシュ読み書きでconflict起こす可能性があるので、コンテナごとに作るか
.ansible.cfg を作って

[defaults]
forks=1

にしておきましょう。

キャッシュを個別に作った場合は

for i in `seq 1 5';do docker run -v /tmp/for/docker/$i/:/var/cache/ -d --name ansible-test$i base;done

キャッシュを共用させる場合は

for i in `seq 1 5';do docker run -v /tmp/for/docker/:/var/cache/ -d --name ansible-test$i base;done

こんな感じでさくっと5台作る。
で、IPアドレスを確認

for i in `seq 1 5`;do docker inspect -f "{{ .NetworkSettings.IPAddress }}" ansible-test$i

これをansibleのインベントリファイルに書く。この辺はplaybook次第ですが
たとえば test-inventoryという名前で

[webservers]
172.17.0.2
172.17.0.3
172.17.0.4
[dbservers]
172.17.0.5
172.17.0.6

こんな感じのファイルを作る。IPアドレスは先のコマンドで確認したやつです。

あとは

ansible-playbook -i test-inventory --private-key=/path/to/docker/container/private-key /path/to/playbook

こんな感じでテストできます。

ダメだったら

docker ps -aq | xargs docker rm -f

でさくっとコンテナを削除してplaybook修正して docker runからやりなおし。

Expect的な処理は平行実行させると速いですね

&入れてwaitするだけでこの違い

平行実行するコード

#!/bin/bash
. ${0%/*}/.password
TMP=$(mktemp -d)
trap "rm -rf $TMP" 0
for i in $(cat list.txt);do
    expect -c "
    spawn ssh $user@$i -o UserKnownHostsFile=/dev/null
    expect {
        yes/no { send yes\r ; exp_continue }
        -nocase password { send $passwd\r ; }
    }
    expect >
    send \"term len 0\r\"
    expect >
    send \"sh arp\r\"
    expect >
    " > $TMP/$i.log &
done
wait
cat $TMP/* > $(date +"%Y%m%d").log

実行速度

real    0m6.605s
user    0m0.107s
sys     0m0.071s

順次実行するコード

#!/bin/bash
. ${0%/*}/.password
TMP=$(mktemp -d)
trap "rm -rf $TMP" 0
for i in $(cat list.txt);do
    expect -c "
    spawn ssh $user@$i -o UserKnownHostsFile=/dev/null
    expect {
        yes/no { send yes\r ; exp_continue }
        -nocase password { send $passwd\r ; }
    }
    expect >
    send \"term len 0\r\"
    expect >
    send \"sh arp\r\"
    expect >
    " > $TMP/$i.log
done
cat $TMP/* > $(date +"%Y%m%d").log

実行速度

real    0m59.881s
user    0m0.134s
sys     0m0.070s

paramikoで対話型処理をしたい

python使ってNW機器のコンフィグバックアップとか、
いろんなデータ拾ったりとかを自動化できると便利ですよねぇ。

そんなわけで、やってみる。

環境 * Python 3.5.1 * paramiko 1.16.0

import paramiko

host='somehost'
username='someuser'
password='password'
password_e='password_e'

client = paramiko.SSHClient()
client.load_system_host_keys()
client.set_missing_host_key_policy(paramiko.AutoAddPolicy())
client.connect(host,username=username,password=password,look_for_keys=False,allow_agent=False)

stdin,stdout,stderr = client.exec_command('show arp\n')
for line in stdout:
    print(line)

こういうのは問題なくできますね。
最後3行の部分を

stdin,stdout,stderr = client.exec_command('enable\n')
for line in stdout:
    print(line)

みたいな。enable送ってpasswordが来たら……みたいなexpectでやるようなことをしようとしたら、 できない。
exec_commandが、コネクション開いて、メッセージ送信して、その結果をもらって、コネクションを閉じる。
という一連の作業をやってコネクション閉じちゃうからなんですよねぇ

コネクション開いてそのコネクション自体をもらう
invoke_shell()
というのが用意されていますが、これを使うと……

shell = client.invoke_shell()
shell.recv(1000)
shell.send('enable\n')
output=''
while True:
    output = output + shell.recv(1000).decode('utf-8')
    if(re.search('[Pp]assword',output)):
        output=''
        break
shell.send(passwd_e+'\n')
while True:
    output = output + shell.recv(1000).decode('utf-8')
    if(re.search('#',output)):
        output=''
        break
shell.send('term len 0\n')
while True:
    output = output + shell.recv(1000).decode('utf-8')
    if(re.search('#',output)):
        output=''
        break
shell.send('show start\n')
while True:
    output = output + shell.recv(1000).decode('utf-8')
    if(re.search('\nend',output)):
        print(output)
        output=''
        break

こういう、データ自分で待ち受けたりとかする作業が必要に。

これならParamikoあきらめてPexpectとかPexpectのpxssh使いたくなりますね。

もともとopensshクライアントではないものを使ってみたくて(速度とかどうなんだろう?と思って) Paramiko使ってるのになぁ

何かいい感じの方法ないんですかねえ