20210511のGoに関する記事は8件です。

AWS Cognitoでユーザー情報をAWS Lambda(Golang)から取得する方法

目的 APIを叩いてきたユーザー名によって変えたいということがありました。 そこで、Cognitoでオーソライズを行っているLambda関数にて、API Gatewayの認証情報をLambda(Golang)の中で取得する方法を調べました。 結論 以下のコードでユーザー名を取得できます。 func handler(ctx context.Context, apiGWEvent events.APIGatewayProxyRequest) (events.APIGatewayProxyResponse, error) { ユーザー名取得 diaryGetter := apiGWEvent.RequestContext.Authorizer["claims"].(map[string]interface{})["cognito:username"].(string) /// ...略 } 割と途中のコードとかが謎ですので、以下に解説を載せておきます。(これより単純に取得できる方法がありましたらご教授いただけると幸いです。) 解説 (前提として、LambdaのオーソライザーにCognitoのユーザープールが設定されていることを確認) まず、events.APIGatewayProxyRequestにはどのようなhttpリクエストを受け取ったのかが格納されます。 ドキュメントを参照すると、 type APIGatewayProxyRequest struct { Resource string `json:"resource"` // The resource path defined in API Gateway Path string `json:"path"` // The url path for the caller HTTPMethod string `json:"httpMethod"` Headers map[string]string `json:"headers"` MultiValueHeaders map[string][]string `json:"multiValueHeaders"` QueryStringParameters map[string]string `json:"queryStringParameters"` MultiValueQueryStringParameters map[string][]string `json:"multiValueQueryStringParameters"` PathParameters map[string]string `json:"pathParameters"` StageVariables map[string]string `json:"stageVariables"` RequestContext APIGatewayProxyRequestContext `json:"requestContext"` Body string `json:"body"` IsBase64Encoded bool `json:"isBase64Encoded,omitempty"` } となっております。 参考:GoDoc package aws/aws-lambda-go/events 参考:AWS Lambda+API Gateway+DynamoDBでCRUD APIを作るのをGolangでやってみた こちらの、RequestContext構造体には、Authorizer情報がmap[string]interface{}型で入っています。 僕が作成したアプリのdev環境用のCognitoの情報を取得してみると、以下の様になっています。 map[claims:map[aud:tekitoutekitou auth_time:12345678 cognito:username:テスト太郎 event_id:tekitou-d37c-41c9-be67-tekitou exp:Tue May 11 14:18:46 UTC 2021 iat:Tue May 11 13:18:46 UTC 2021 iss:https://cognito-idp.ap-northeast-1.amazonaws.com/ap-northeast-tekitou sub:tekitou-c7e9-4649-ab16-tekitou token_use:id]] こちらから、claimsキーの中の、cognito:usernameキーがユーザーネームであることがわかります。 最初この構造を見たとき、 diaryGetter := apiGWEvent.RequestContext.Authorizer["claims"]["cognito:username"] みたいな感じでとれるんじゃないの? と思ったのですが、これをやろうとすると、 invalid operation: cannot index apiGWEvent.RequestContext.Authorizer["claims"] (map index expression of type interface{}) となってしまいます。 interface型の知識が欠如しておりました。 どんな型の値でも受け取れるinterface{}ですが、interface{}型の引数で受け渡された値は、元の型の情報が欠落しています。 (元の型の値を操作するための関数等を実行できません) 引用:https://blog.y-yuki.net/entry/2017/05/08/000000 元の型の値を操作できないため、辞書型のキーを取り出すという動作ができないっぽいです。 なので、型アサーションをして、取り出す必要がありました。さらにこのdiaryGetterはstring型として扱いたいので、最後も型アサーションをする必要があったということです。 まず、 apiGWEvent.RequestContext.Authorizer["claims"] を型アサーションでmap[string]interface{}型にして、mapのキーを取り出すという感じです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

備忘録 Goでginを使う時に、cssやjsのファイルが読み込めない問題の解決

書いた理由 go言語でginを使っていたら、htmlからjsが読み込めない問題が発生したので、忘れないようにメモっておきます。また、ginを使わない場合でも同様の操作が必要らしいです。 cssの読み込みも同様にやるので、省略します。 ディレクトリについて githubに今回のコードはおいてあります。 correct.goが正常に動作するプログラムで、incorrect.goが正常に動作しないプログラムです。 ./ ├── correct.go ├── incorrect.go └── src ├── index.html └── js └── main.js htmlとjs ボタンを押すと、alertでPushed!!と出るだけの簡単なプログラムです。 index.html <html> <head> <title>gin-js</title> <script defer="defer" src="./js/main.js" ></script> </head> <body> <button id="btn">Push!!</button> </body> </html> main.js document.getElementById("btn").onclick=function(){ alert("Pushed!!") } 失敗するプログラム /に接続すると、index.htmlが表示されるいたって簡単なプログラムです。 incorrect.go package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() router.LoadHTMLGlob("src/*.html") router.GET("/", func(ctx *gin.Context) { ctx.HTML(200, "index.html", gin.H{}) }) router.Run() } 実行すると/js/main.jsにGETリクエストをして、404が返ってきています。 成功するプログラム correct.go package main import "github.com/gin-gonic/gin" func main() { router := gin.Default() router.Static("/js", "src/js/") // ここを追加するだけ! // router.Static("HTMLで読み込むURL","読み込むファイルがあるディレクトリの場所") router.LoadHTMLGlob("src/*.html") router.GET("/", func(ctx *gin.Context) { ctx.HTML(200, "index.html", gin.H{}) }) router.Run() } 実行すると/js/main.jsにGETリクエストをして、200が返ってきて成功しています! 静的なファイルにはこのメソッドを使用するらしいです。(詳しくは自分で調べて...) router.Static("HTMLで読み込むURL","読み込むファイルがあるディレクトリの場所") 最後に 調べても全然出てこなく、30分ぐらいかかったので備忘録&周知のために記事を書きました。 誰かの役に立ったら幸いです。 今回のリポジトリ
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ServerlessFrameworkでGoのアプリをデプロイする

最近はCDKなどの他のツールに押され気味の印象のServerlessFrameworkですが、API Gateway+Lambda+ DynamoDBといったサーバレス構成の場合、記述のシンプルさ故、ServerlessFrameworkを選択するケースはまだ多い印象です。今回は、GoのアプリケーションをServerlessFrameworkで構築する方法について記載します。 ServerlessFrameworkで使用できるGoのテンプレートには以下の3つがあります。 aws-go aws-go-dep aws-go-mod Goではバージョン1.11から従来のGOPATHモードに加えてモジュールモードが用意されており、今後はこのモードが主流となることから、ここではaws-go-modを選択します。ちなみに、モジュールモードを使用すると、ソースコードを$GOPATH以外の任意のディレクトリに配置できるなどのメリットがあります。他にもメリットはありますが、ここでは割愛します(「GOPATHモード モジュールモード」などで検索いただければと思います)。 以降、このテンプレートを使って実際のAWS環境にデプロイするまでの流れを記載します。 基本的には、公式ドキュメントに記載の通りですが、このまま実行してもエラーになる箇所があるので、その点についても補足していきます。 まずは、以下コマンドでテンプレートを作成します(slsコマンドはインストール済みの前提)。 ※my-serviceの箇所はテンプレートを配置したい任意のディレクトリ名。 sls create --template aws-go-mod --path my-service my-serviceディレクトリ に入ると、諸々のファイルが生成されていることが確認できます。 続いて、ドキュメントに記載の通り以下コマンドでソースコードをビルドします。 make build すると、以下のようなエラーが発生します。 chmod u+x gomod.sh ./gomod.sh export GO111MODULE=on env GOOS=linux go build -ldflags="-s -w" -o bin/hello hello/main.go go: github.com/aws/aws-lambda-go@v1.6.0: missing go.sum entry; to add it: go mod download github.com/aws/aws-lambda-go make: *** [build] Error 1 go.sumがないとのこと。調べてみると、モジュールモードではgo.modとgo.sumでパッケージの管理をするのですが、1.16以降、go.mod に含まれている依存パッケージのうち、go.sum に含まれていないものが1つでもあるとビルドが通らない仕様になったようです。通常は、モジュールモードでプロジェクトを新規に作る時のコマンド(go mod init)を実行すると、go.sumも一緒に作成されます。今回は、初期化はすでに行っている状態なので、initコマンドではなく、以下を実行することで解決します。 go mod tidy ちなみに、こちらのコマンドはプログラム上のimport文を参照して、不要モジュールの削除と新規モジュールの追加を行ってくれるコマンドです。 続いて、再度ビルドコマンドを実行します。 make build すると、binディレクトリ直下にビルドされた結果が格納されていると思います。 あとは、以下のコマンドでデプロイするだけです(リージョンやprofileの設定が必要な場合はserverless.ymlを編集してください)。 sls deploy
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

napalm の 10 倍早いネットワーク機器のリモートコマンド実行ツールを書きました

ネットワーク機器のコマンドをリモート実行するツール「telee」を書きました。 このツールは、機器へのログイン処理とコマンド実行を代替します。 従来の TeraTerm マクロや expect スクリプトに近い役割を担います。 以下は動作例です。 Cisco 社製 OS はもちろん、Juniper, YAMAHA 等、他社製 OS へのログインにも対応しています。 接続プロトコルは telnet もしくは ssh が選択出来ます。その他のプロトコルには対応していません。 Napalm のコマンドライン機能と比較すると、実行速度は約 10 - 50 倍高速です。 ※ 測定の詳細は Performance Comparison: telee and napalm をご確認ください。 最新版は、リポジトリの Releases page からダウンロード出来ます。 バイナリは Linux, Mac の amd64, arm64 版をそれぞれ提供しています。 ネットワークエンジニアの皆様、ぜひお試しください。フィードバックも大歓迎です。 以下、詳細です。 背景 ネットワーク機器の操作には、telnet を利用する場合があります。 しかし telnet は、公開鍵のようなシームレスな認証に対応していません。 機器にログインするには、大半のケースでユーザ・パスワード認証が必要です。 この入力に手間を感じていました。 ネットワーク業界で最も高いシェアを持つ Cisco 社製のスイッチを例に取ります。 このスイッチで設定の一覧を表示するには、以下の 7 ステップが必要になります。 (1) telnet コマンドを実行 (2) ユーザ名を入力 (3) パスワードを入力 (4) enable コマンドを実行 (5) 特権 EXEC パスワードを入力 (6) terminal length 0 コマンドを実行 (7) show running-config コマンドを実行 多いです。数台であれば耐えられますが、台数が増えるにつれて辛みも増していきます。 解決策 この課題は、一般的に以下のような手段で解決します。 expect コマンドを用いたスクリプトを書く TeraTerm マクロ で TTL ファイルを書く しかし、これらはいずれも 1 行のコマンドを実行するために複数行の構文が必要です。 また、運用継続に伴ってスクリプトが焼き増された場合、多重メンテが必要になります。 これらを回避しつつ、より手軽にコマンドを実行したいという思いで、今回「telee」を書きました。 利用方法 以下は、記事作成時点の README.md (日本語版) です。最新の情報はリポジトリをご参照ください。 コマンド書式 telee -H HOSTNAME -C COMMAND [options...] コマンドオプション オプション 概要 デフォルト値 環境変数 --hostname(-H) ホスト名または IP アドレスを指定します。 - $TELEE_HOSTNAME --port(-p) ポート番号を指定します。 23 - --command(-C) 実行するコマンドを指定します。 - $TELEE_COMMAND --exec-platform(-x) 接続先の環境名を指定します。※後述参照 ios - --username(-u) ユーザ名を指定します。 admin $TELEE_USERNAME --password(-p) パスワードを指定します。 cisco $TELEE_PASSWORD --priv-password(--pp) 特権モードのパスワードを指定します。 enable $TELEE_PRIVPASSWORD --enable-mode(-e, --ena,--enable) 特権モードの利用時に設定します。 false - --ha-mode(-ha) HA モード機器への接続時に設定します。 false - --secure-mode(-s, --sec,--secure) SSH での接続時に設定します。 false - --timeout(-t) コマンドのタイムアウトを指定します。 5 - Exec Platform --exec-platform はログインプロンプトの識別に利用しています。 指定を誤った場合、正常にログイン出来ず、コマンドがタイムアウトします。 指定可能なプラットフフォームと、動作確認バージョンはそれぞれ以下の通りです。 定義名 (-x 指定) プラットフォーム名 Telnet SSH aireos Cisco AireOS ✅ 8.5.120.0 ✅ 8.5.120.0 allied AlliedTelesis AlliedWare ✅ 1.6.14B02 Not Supported asa Cisco ASA Software ✅ 9.0(4) Not Supported asa (--ha-mode) Cisco ASA Software (HA) ✅ 9.10(1) Not Supported foundry Brocade IronWare ✅ 07.2.02aT7e1 Not Supported ios Cisco IOS, IOS-XE ✅ 15.2(5c)E ✅ 15.2(5c)E nxos Cisco NX-OS ✅ 6.2(14) Not Supported srx JuniperNetworks JunOS Not Supported ✅ 15.1X49-D90.7 ssg JuniperNetworks ScreenOS ✅ 6.3.0r21.0 Not Supported ssg (--ha-mode) JuniperNetworks ScreenOS (HA) ✅ 6.3.0r22.0 Not Supported yamaha YAMAHA Router OS ✅ Rev.8.03.94 Not Supported 実行手順 ログインに利用するユーザ名とパスワードを、環境変数に設定します。 export TELEE_USERNAME=telee export TELEE_PASSWORD=Teleedev! export TELEE_PRIVPASSWORD=Teleedev!! ホスト名を指定してコマンドを実行します。 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" show int descr Load for five secs: 2%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:16:54.302 JST Sat May 8 2021 Interface Status Protocol Description Vl1 admin down down Vl800 up up *** LAB-MGMT *** Gi0/1 up up CLIENT_DEVICE_LONG_DESCR Gi0/2 up up CLIENT_DEVICE Gi0/3 up up CLIENT_DEVICE Gi0/4 up up CLIENT_DEVICE Gi0/5 up up CLIENT_DEVICE Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/8 up up GATEWAY_ROUTER Gi0/9 admin down down Gi0/10 admin down down lab-cat29l-02f99-01> 完了です。 応用例 パイプやリダイレクトにかける 出力結果を別のコマンドで処理出来ます。以下のように実行します。 実行例 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" | grep "Interface\|down" Interface Status Protocol Description Vl1 admin down down Gi0/1 down down CLIENT_DEVICE_LONG_DESCR Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/9 admin down down Gi0/10 admin down down $ telee --hostname lab-cat29l-02f99-01 --command "show run" --enable > telee.log $ head -n 10 telee.log show run Load for five secs: 1%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:21:34.501 JST Sat May 8 2021 Building configuration... Current configuration : 18687 bytes ! ! Last configuration change at 01:30:16 JST Sun Feb 14 2021 ! Cisco IOS 以外を操作する --exec-platform オプションの指定が必要です。 AireOS を操作する場合は、以下のように実行します。 実行例 $ telee -H 192.168.0.250 -C "show sysinfo" -x aireos show sysinfo Manufacturer's Name.............................. Cisco Systems Inc. Product Name..................................... Cisco Controller Product Version.................................. 8.5.120.0 Bootloader Version............................... 1.0.20 Field Recovery Image Version..................... 7.6.101.1 Firmware Version................................. PIC 19.0 OUI File Last Update Time........................ Sun Sep 07 10:44:07 IST 2014 Build Type....................................... DATA + WPS System Name...................................... lab-wlc-01f01-01a System Location.................................. System Contact................................... System ObjectID.................................. 1.3.6.1.4.1.9.1.1279 IP Address....................................... 192.168.0.250 <snip> Cisco ASA を操作する --enable-mode オプションの指定が必要です。 Cisco ASA は、ユーザ権限で terminal pager 0 が実行出来ません。 Cisco ASA を操作する場合は、以下のように実行します。 実行例 $ telee -H lab-asa5505-02f01-01 -C "show version" -x asa --enable-mode show version Cisco Adaptive Security Appliance Software Version 9.0(4) Device Manager Version 7.1(5)100 Compiled on Wed 04-Dec-13 08:33 by builders System image file is "disk0:/asa904-k8.bin" Config file at boot was "startup-config" lab-asa5505-02f01-01 up 70 days 2 hours Hardware: ASA5505, 512 MB RAM, CPU Geode 500 MHz, Internal ATA Compact Flash, 128MB BIOS Flash M50FW016 @ 0xfff00000, 2048KB Encryption hardware device : Cisco ASA-5505 on-board accelerator (revision 0x0) Boot microcode : CN1000-MC-BOOT-2.00 SSL/IKE microcode : CNLite-MC-SSLm-PLUS-2.03 <snip> SSH で接続する --secure-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-cat29l-02f99-01 -C "show run" --enable --secure show run Load for five secs: 8%/0%; one minute: 2%; five minutes: 1% Time source is NTP, 02:25:22.496 JST Fri May 14 2021 Building configuration... Current configuration : 18716 bytes ! ! Last configuration change at 01:46:41 JST Fri May 14 2021 by raciadev ! version 15.2 no service pad service tcp-keepalives-in service timestamps debug datetime msec localtime show-timezone service timestamps log datetime msec localtime show-timezone service password-encryption ! hostname lab-cat29l-02f99-01 <snip> RADIUS Attribute で権限を付与する --default-privilege-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-nx70-02f01-01 -C "show version" -x nxos --default-privilege-mode show version Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html Copyright (c) 2002-2015, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained in this software are owned by other third parties and used and distributed under license. Certain components of this software are licensed under the GNU General Public License (GPL) version 2.0 or the GNU Lesser General Public License (LGPL) Version 2.1. A copy of each such license is available at http://www.opensource.org/licenses/gpl-2.0.php and http://www.opensource.org/licenses/lgpl-2.1.php Software BIOS: version N/A kickstart: version 6.2(14) system: version 6.2(14) BIOS compile time: kickstart image file is: bootflash:///n7000-s1-kickstart.6.2.14.bin <snip> 応答の遅い機器を操作する --timeout でタイムアウト値を調整出来ます。以下のように実行します。 実行例 $ telee -H lab-fs909-02f01-01 -C "show system" -x allied -u manager --timeout 10 show system Switch System Status Date 2021-05-09 Time 01:04:54 Board Bay Board Name ---------------------------------------------------------------------- Base - FS909M ---------------------------------------------------------------------- Memory - DRAM : 32768 kB FLASH : 8192 kB MAC : 00-1A-EB-93-1C-95 ---------------------------------------------------------------------- SysDescription : CentreCOM FS909M Ver 1.6.14 B02 SysContact : SysLocation : LAB SysName : lab-fs909-02f01-01 SysUpTime : 1267989237(146days, 18:11:32) Release Version : 1.6.14 Release built : B02 (Nov 23 2010 at 14:29:56) Flash PROM : Good RAM : Good SW chip : Good <snip>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

napalm の 10 倍速いネットワーク機器のリモートコマンド実行ツールを書きました

ネットワーク機器のコマンドをリモート実行するツール「telee」を書きました。 このツールは、機器へのログイン処理とコマンド実行を代替します。 従来の TeraTerm マクロや expect スクリプトに近い役割を担います。 以下は動作例です。 Cisco 社製 OS はもちろん、Juniper, YAMAHA 等、他社製 OS へのログインにも対応しています。 接続プロトコルは telnet もしくは ssh が選択出来ます。その他のプロトコルには対応していません。 NAPALM のコマンドライン機能と比較すると、実行速度は約 10 - 50 倍高速です。 ※ 測定の詳細は Performance Comparison: telee and napalm をご確認ください。 最新版は、リポジトリの Releases page からダウンロード出来ます。 バイナリは Linux, Mac の amd64, arm64 版をそれぞれ提供しています。 ネットワークエンジニアの皆様、ぜひお試しください。フィードバックも大歓迎です。 以下、詳細です。 背景 ネットワーク機器の操作には、telnet を利用する場合があります。 しかし telnet は、公開鍵のようなシームレスな認証に対応していません。 機器にログインするには、大半のケースでユーザ・パスワード認証が必要です。 この入力に手間を感じていました。 ネットワーク業界で最も高いシェアを持つ Cisco 社製のスイッチを例に取ります。 このスイッチで設定の一覧を表示するには、以下の 7 ステップが必要になります。 (1) telnet コマンドを実行 (2) ユーザ名を入力 (3) パスワードを入力 (4) enable コマンドを実行 (5) 特権 EXEC パスワードを入力 (6) terminal length 0 コマンドを実行 (7) show running-config コマンドを実行 多いです。数台であれば耐えられますが、台数が増えるにつれて辛みも増していきます。 解決策 この課題は、一般的に以下のような手段で解決します。 expect コマンドを用いたスクリプトを書く TeraTerm マクロ で TTL ファイルを書く しかし、これらはいずれも 1 行のコマンドを実行するために複数行の構文が必要です。 また、運用継続に伴ってスクリプトが焼き増された場合、多重メンテが必要になります。 これらを回避しつつ、より手軽にコマンドを実行したいという思いで、今回「telee」を書きました。 利用方法 以下は、記事作成時点の README.md (日本語版) です。最新の情報はリポジトリをご参照ください。 コマンド書式 telee -H HOSTNAME -C COMMAND [options...] コマンドオプション オプション 概要 デフォルト値 環境変数 --hostname(-H) ホスト名または IP アドレスを指定します。 - $TELEE_HOSTNAME --port(-p) ポート番号を指定します。 23 - --command(-C) 実行するコマンドを指定します。 - $TELEE_COMMAND --exec-platform(-x) 接続先の環境名を指定します。※後述参照 ios - --username(-u) ユーザ名を指定します。 admin $TELEE_USERNAME --password(-p) パスワードを指定します。 cisco $TELEE_PASSWORD --priv-password(--pp) 特権モードのパスワードを指定します。 enable $TELEE_PRIVPASSWORD --enable-mode(-e, --ena,--enable) 特権モードの利用時に設定します。 false - --ha-mode(-ha) HA モード機器への接続時に設定します。 false - --secure-mode(-s, --sec,--secure) SSH での接続時に設定します。 false - --timeout(-t) コマンドのタイムアウトを指定します。 5 - Exec Platform --exec-platform はログインプロンプトの識別に利用しています。 指定を誤った場合、正常にログイン出来ず、コマンドがタイムアウトします。 指定可能なプラットフフォームと、動作確認バージョンはそれぞれ以下の通りです。 定義名 (-x 指定) プラットフォーム名 Telnet SSH aireos Cisco AireOS ✅ 8.5.120.0 ✅ 8.5.120.0 allied AlliedTelesis AlliedWare ✅ 1.6.14B02 Not Supported asa Cisco ASA Software ✅ 9.0(4) Not Supported asa (--ha-mode) Cisco ASA Software (HA) ✅ 9.10(1) Not Supported foundry Brocade IronWare ✅ 07.2.02aT7e1 Not Supported ios Cisco IOS, IOS-XE ✅ 15.2(5c)E ✅ 15.2(5c)E nxos Cisco NX-OS ✅ 6.2(14) Not Supported srx JuniperNetworks JunOS Not Supported ✅ 15.1X49-D90.7 ssg JuniperNetworks ScreenOS ✅ 6.3.0r21.0 Not Supported ssg (--ha-mode) JuniperNetworks ScreenOS (HA) ✅ 6.3.0r22.0 Not Supported yamaha YAMAHA Router OS ✅ Rev.8.03.94 Not Supported 実行手順 ログインに利用するユーザ名とパスワードを、環境変数に設定します。 export TELEE_USERNAME=telee export TELEE_PASSWORD=Teleedev! export TELEE_PRIVPASSWORD=Teleedev!! ホスト名を指定してコマンドを実行します。 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" show int descr Load for five secs: 2%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:16:54.302 JST Sat May 8 2021 Interface Status Protocol Description Vl1 admin down down Vl800 up up *** LAB-MGMT *** Gi0/1 up up CLIENT_DEVICE_LONG_DESCR Gi0/2 up up CLIENT_DEVICE Gi0/3 up up CLIENT_DEVICE Gi0/4 up up CLIENT_DEVICE Gi0/5 up up CLIENT_DEVICE Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/8 up up GATEWAY_ROUTER Gi0/9 admin down down Gi0/10 admin down down lab-cat29l-02f99-01> 完了です。 応用例 パイプやリダイレクトにかける 出力結果を別のコマンドで処理出来ます。以下のように実行します。 実行例 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" | grep "Interface\|down" Interface Status Protocol Description Vl1 admin down down Gi0/1 down down CLIENT_DEVICE_LONG_DESCR Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/9 admin down down Gi0/10 admin down down $ telee --hostname lab-cat29l-02f99-01 --command "show run" --enable > telee.log $ head -n 10 telee.log show run Load for five secs: 1%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:21:34.501 JST Sat May 8 2021 Building configuration... Current configuration : 18687 bytes ! ! Last configuration change at 01:30:16 JST Sun Feb 14 2021 ! Cisco IOS 以外を操作する --exec-platform オプションの指定が必要です。 AireOS を操作する場合は、以下のように実行します。 実行例 $ telee -H 192.168.0.250 -C "show sysinfo" -x aireos show sysinfo Manufacturer's Name.............................. Cisco Systems Inc. Product Name..................................... Cisco Controller Product Version.................................. 8.5.120.0 Bootloader Version............................... 1.0.20 Field Recovery Image Version..................... 7.6.101.1 Firmware Version................................. PIC 19.0 OUI File Last Update Time........................ Sun Sep 07 10:44:07 IST 2014 Build Type....................................... DATA + WPS System Name...................................... lab-wlc-01f01-01a System Location.................................. System Contact................................... System ObjectID.................................. 1.3.6.1.4.1.9.1.1279 IP Address....................................... 192.168.0.250 <snip> Cisco ASA を操作する --enable-mode オプションの指定が必要です。 Cisco ASA は、ユーザ権限で terminal pager 0 が実行出来ません。 Cisco ASA を操作する場合は、以下のように実行します。 実行例 $ telee -H lab-asa5505-02f01-01 -C "show version" -x asa --enable-mode show version Cisco Adaptive Security Appliance Software Version 9.0(4) Device Manager Version 7.1(5)100 Compiled on Wed 04-Dec-13 08:33 by builders System image file is "disk0:/asa904-k8.bin" Config file at boot was "startup-config" lab-asa5505-02f01-01 up 70 days 2 hours Hardware: ASA5505, 512 MB RAM, CPU Geode 500 MHz, Internal ATA Compact Flash, 128MB BIOS Flash M50FW016 @ 0xfff00000, 2048KB Encryption hardware device : Cisco ASA-5505 on-board accelerator (revision 0x0) Boot microcode : CN1000-MC-BOOT-2.00 SSL/IKE microcode : CNLite-MC-SSLm-PLUS-2.03 <snip> SSH で接続する --secure-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-cat29l-02f99-01 -C "show run" --enable --secure show run Load for five secs: 8%/0%; one minute: 2%; five minutes: 1% Time source is NTP, 02:25:22.496 JST Fri May 14 2021 Building configuration... Current configuration : 18716 bytes ! ! Last configuration change at 01:46:41 JST Fri May 14 2021 by raciadev ! version 15.2 no service pad service tcp-keepalives-in service timestamps debug datetime msec localtime show-timezone service timestamps log datetime msec localtime show-timezone service password-encryption ! hostname lab-cat29l-02f99-01 <snip> RADIUS Attribute で権限を付与する --default-privilege-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-nx70-02f01-01 -C "show version" -x nxos --default-privilege-mode show version Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html Copyright (c) 2002-2015, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained in this software are owned by other third parties and used and distributed under license. Certain components of this software are licensed under the GNU General Public License (GPL) version 2.0 or the GNU Lesser General Public License (LGPL) Version 2.1. A copy of each such license is available at http://www.opensource.org/licenses/gpl-2.0.php and http://www.opensource.org/licenses/lgpl-2.1.php Software BIOS: version N/A kickstart: version 6.2(14) system: version 6.2(14) BIOS compile time: kickstart image file is: bootflash:///n7000-s1-kickstart.6.2.14.bin <snip> 応答の遅い機器を操作する --timeout でタイムアウト値を調整出来ます。以下のように実行します。 実行例 $ telee -H lab-fs909-02f01-01 -C "show system" -x allied -u manager --timeout 10 show system Switch System Status Date 2021-05-09 Time 01:04:54 Board Bay Board Name ---------------------------------------------------------------------- Base - FS909M ---------------------------------------------------------------------- Memory - DRAM : 32768 kB FLASH : 8192 kB MAC : 00-1A-EB-93-1C-95 ---------------------------------------------------------------------- SysDescription : CentreCOM FS909M Ver 1.6.14 B02 SysContact : SysLocation : LAB SysName : lab-fs909-02f01-01 SysUpTime : 1267989237(146days, 18:11:32) Release Version : 1.6.14 Release built : B02 (Nov 23 2010 at 14:29:56) Flash PROM : Good RAM : Good SW chip : Good <snip>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

napalm の 6 倍速いネットワーク機器のリモートコマンド実行ツールを書きました

ネットワーク機器のコマンドをリモート実行するツール「telee」を書きました。 このツールは、機器へのログイン処理とコマンド実行を代替します。 旧来の TeraTerm マクロ、expect スクリプト、昨今の NAPALM に近い役割を担います。 以下は動作例です。 Cisco 社製 OS はもちろん、Juniper, YAMAHA 等、他社製 OS へのログインにも対応しています。 接続プロトコルは telnet もしくは ssh が選択出来ます。その他のプロトコルには対応していません。 NAPALM のコマンドライン機能と比較すると、実行速度は約 6 - 72 倍高速です。 ※ 測定の詳細は Performance Comparison: telee and napalm をご確認ください。 最新版は、リポジトリの Releases page からダウンロード出来ます。 バイナリは Linux, Mac の amd64, arm64 版をそれぞれ提供しています。 ネットワークエンジニアの皆様、ぜひお試しください。フィードバックも大歓迎です。 以下、詳細です。 背景 ネットワーク機器の操作には、telnet を利用する場合があります。 しかし telnet は、公開鍵のようなシームレスな認証に対応していません。 機器にログインするには、大半のケースでユーザ・パスワード認証が必要です。 この入力に手間を感じていました。 ネットワーク業界で最も高いシェアを持つ Cisco 社製のスイッチを例に取ります。 このスイッチで設定の一覧を表示するには、以下の 7 ステップが必要になります。 (1) telnet コマンドを実行 (2) ユーザ名を入力 (3) パスワードを入力 (4) enable コマンドを実行 (5) 特権 EXEC パスワードを入力 (6) terminal length 0 コマンドを実行 (7) show running-config コマンドを実行 多いです。数台であれば耐えられますが、台数が増えるにつれて辛みも増していきます。 解決策 この課題は、一般的に以下のような手段で解決します。 (1) expect コマンドを用いたスクリプトを書く (2) TeraTerm マクロ で TTL ファイルを書く (3) Ansible の専用 module を用いた task を書く (4) NAPALM を用いてコードまたは YAML を書く (5) NAPALM CLI を利用する (1) - (4) は、いずれも 1 行のコマンドを実行するために複数行の構文が必要です。 また、運用継続に伴ってスクリプトやコードが焼き増された場合、多重メンテが必要になります。 (5) は解決策たりえますが、telnet や SSH と比較すると処理が緩慢で、普段使いには難があります。 これらを回避しつつ、より手軽にコマンドを実行したいという思いで、今回「telee」を書きました。 利用方法 以下は、記事作成時点の README.md (日本語版) です。最新の情報はリポジトリをご参照ください。 コマンド書式 telee -H HOSTNAME -C COMMAND [options...] コマンドオプション オプション 概要 デフォルト値 環境変数 --hostname(-H) ホスト名または IP アドレスを指定します。 - $TELEE_HOSTNAME --port(-p) ポート番号を指定します。 23 - --command(-C) 実行するコマンドを指定します。 - $TELEE_COMMAND --exec-platform(-x) 接続先の環境名を指定します。※後述参照 ios - --username(-u) ユーザ名を指定します。 admin $TELEE_USERNAME --password(-p) パスワードを指定します。 cisco $TELEE_PASSWORD --priv-password(--pp) 特権モードのパスワードを指定します。 enable $TELEE_PRIVPASSWORD --enable-mode(-e, --ena,--enable) 特権モードの利用時に設定します。 false - --ha-mode(-ha) HA モード機器への接続時に設定します。 false - --secure-mode(-s, --sec,--secure) SSH での接続時に設定します。 false - --timeout(-t) コマンドのタイムアウトを指定します。 5 - Exec Platform --exec-platform はログインプロンプトの識別に利用しています。 指定を誤った場合、正常にログイン出来ず、コマンドがタイムアウトします。 指定可能なプラットフフォームと、動作確認バージョンはそれぞれ以下の通りです。 定義名 (-x 指定) プラットフォーム名 Telnet SSH aireos Cisco AireOS ✅ 8.5.120.0 ✅ 8.5.120.0 allied AlliedTelesis AlliedWare ✅ 1.6.14B02 Not Supported asa Cisco ASA Software ✅ 9.0(4) Not Supported asa (--ha-mode) Cisco ASA Software (HA) ✅ 9.10(1) Not Supported foundry Brocade IronWare ✅ 07.2.02aT7e1 Not Supported ios Cisco IOS, IOS-XE ✅ 15.2(5c)E ✅ 15.2(5c)E nxos Cisco NX-OS ✅ 6.2(14) Not Supported srx JuniperNetworks JunOS Not Supported ✅ 15.1X49-D90.7 ssg JuniperNetworks ScreenOS ✅ 6.3.0r21.0 Not Supported ssg (--ha-mode) JuniperNetworks ScreenOS (HA) ✅ 6.3.0r22.0 Not Supported yamaha YAMAHA Router OS ✅ Rev.8.03.94 Not Supported 実行手順 ログインに利用するユーザ名とパスワードを、環境変数に設定します。 export TELEE_USERNAME=telee export TELEE_PASSWORD=Teleedev! export TELEE_PRIVPASSWORD=Teleedev!! ホスト名を指定してコマンドを実行します。 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" show int descr Load for five secs: 2%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:16:54.302 JST Sat May 8 2021 Interface Status Protocol Description Vl1 admin down down Vl800 up up *** LAB-MGMT *** Gi0/1 up up CLIENT_DEVICE_LONG_DESCR Gi0/2 up up CLIENT_DEVICE Gi0/3 up up CLIENT_DEVICE Gi0/4 up up CLIENT_DEVICE Gi0/5 up up CLIENT_DEVICE Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/8 up up GATEWAY_ROUTER Gi0/9 admin down down Gi0/10 admin down down lab-cat29l-02f99-01> 完了です。 応用例 パイプやリダイレクトにかける 出力結果を別のコマンドで処理出来ます。以下のように実行します。 実行例 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" | grep "Interface\|down" Interface Status Protocol Description Vl1 admin down down Gi0/1 down down CLIENT_DEVICE_LONG_DESCR Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/9 admin down down Gi0/10 admin down down $ telee --hostname lab-cat29l-02f99-01 --command "show run" --enable > telee.log $ head -n 10 telee.log show run Load for five secs: 1%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:21:34.501 JST Sat May 8 2021 Building configuration... Current configuration : 18687 bytes ! ! Last configuration change at 01:30:16 JST Sun Feb 14 2021 ! Cisco IOS 以外を操作する --exec-platform オプションの指定が必要です。 AireOS を操作する場合は、以下のように実行します。 実行例 $ telee -H 192.168.0.250 -C "show sysinfo" -x aireos show sysinfo Manufacturer's Name.............................. Cisco Systems Inc. Product Name..................................... Cisco Controller Product Version.................................. 8.5.120.0 Bootloader Version............................... 1.0.20 Field Recovery Image Version..................... 7.6.101.1 Firmware Version................................. PIC 19.0 OUI File Last Update Time........................ Sun Sep 07 10:44:07 IST 2014 Build Type....................................... DATA + WPS System Name...................................... lab-wlc-01f01-01a System Location.................................. System Contact................................... System ObjectID.................................. 1.3.6.1.4.1.9.1.1279 IP Address....................................... 192.168.0.250 <snip> Cisco ASA を操作する --enable-mode オプションの指定が必要です。 Cisco ASA は、ユーザ権限で terminal pager 0 が実行出来ません。 Cisco ASA を操作する場合は、以下のように実行します。 実行例 $ telee -H lab-asa5505-02f01-01 -C "show version" -x asa --enable-mode show version Cisco Adaptive Security Appliance Software Version 9.0(4) Device Manager Version 7.1(5)100 Compiled on Wed 04-Dec-13 08:33 by builders System image file is "disk0:/asa904-k8.bin" Config file at boot was "startup-config" lab-asa5505-02f01-01 up 70 days 2 hours Hardware: ASA5505, 512 MB RAM, CPU Geode 500 MHz, Internal ATA Compact Flash, 128MB BIOS Flash M50FW016 @ 0xfff00000, 2048KB Encryption hardware device : Cisco ASA-5505 on-board accelerator (revision 0x0) Boot microcode : CN1000-MC-BOOT-2.00 SSL/IKE microcode : CNLite-MC-SSLm-PLUS-2.03 <snip> SSH で接続する --secure-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-cat29l-02f99-01 -C "show run" --enable --secure show run Load for five secs: 8%/0%; one minute: 2%; five minutes: 1% Time source is NTP, 02:25:22.496 JST Fri May 14 2021 Building configuration... Current configuration : 18716 bytes ! ! Last configuration change at 01:46:41 JST Fri May 14 2021 by raciadev ! version 15.2 no service pad service tcp-keepalives-in service timestamps debug datetime msec localtime show-timezone service timestamps log datetime msec localtime show-timezone service password-encryption ! hostname lab-cat29l-02f99-01 <snip> RADIUS Attribute で権限を付与する --default-privilege-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-nx70-02f01-01 -C "show version" -x nxos --default-privilege-mode show version Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html Copyright (c) 2002-2015, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained in this software are owned by other third parties and used and distributed under license. Certain components of this software are licensed under the GNU General Public License (GPL) version 2.0 or the GNU Lesser General Public License (LGPL) Version 2.1. A copy of each such license is available at http://www.opensource.org/licenses/gpl-2.0.php and http://www.opensource.org/licenses/lgpl-2.1.php Software BIOS: version N/A kickstart: version 6.2(14) system: version 6.2(14) BIOS compile time: kickstart image file is: bootflash:///n7000-s1-kickstart.6.2.14.bin <snip> 応答の遅い機器を操作する --timeout でタイムアウト値を調整出来ます。以下のように実行します。 実行例 $ telee -H lab-fs909-02f01-01 -C "show system" -x allied -u manager --timeout 10 show system Switch System Status Date 2021-05-09 Time 01:04:54 Board Bay Board Name ---------------------------------------------------------------------- Base - FS909M ---------------------------------------------------------------------- Memory - DRAM : 32768 kB FLASH : 8192 kB MAC : 00-1A-EB-93-1C-95 ---------------------------------------------------------------------- SysDescription : CentreCOM FS909M Ver 1.6.14 B02 SysContact : SysLocation : LAB SysName : lab-fs909-02f01-01 SysUpTime : 1267989237(146days, 18:11:32) Release Version : 1.6.14 Release built : B02 (Nov 23 2010 at 14:29:56) Flash PROM : Good RAM : Good SW chip : Good <snip>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

napalm の 6 倍速いネットワーク機器用リモートコマンド実行ツールを書きました

ネットワーク機器のコマンドをリモート実行するツール「telee」を書きました。 このツールは、機器へのログイン処理とコマンド実行を代理します。 旧来の TeraTerm マクロ、expect スクリプトに近い役割を担います。 以下は動作例です。 Cisco 社製 OS はもちろん、Juniper, YAMAHA 等、他社製 OS へのログインにも対応しています。 接続プロトコルは telnet もしくは ssh が選択出来ます。その他のプロトコルには対応していません。 NAPALM のコマンドライン機能と比較すると、実行速度は約 6 - 72 倍高速です。 ※ 測定の詳細は Performance Comparison: telee and napalm をご確認ください。 最新版のバイナリは、リポジトリの Releases page からダウンロード出来ます。 プラットフォームは、Linux, Mac の amd64, arm64 版をそれぞれ提供しています。 ネットワークエンジニアの皆様、ぜひお試しください。フィードバックも大歓迎です。 以下、詳細です。 背景 ネットワーク機器の操作には、telnet を利用する場合があります。 しかし telnet は、公開鍵のようなシームレスな認証に対応していません。 機器にログインするには、大半のケースでユーザ・パスワード認証が必要です。 この入力に手間を感じていました。 ネットワーク業界で最も高いシェアを持つ Cisco 社製のスイッチを例に取ります。 このスイッチで設定の一覧を表示するには、以下の 7 ステップが必要になります。 (1) telnet コマンドを実行 (2) ユーザ名を入力 (3) パスワードを入力 (4) enable コマンドを実行 (5) 特権 EXEC パスワードを入力 (6) terminal length 0 コマンドを実行 (7) show running-config コマンドを実行 多いです。数台であれば耐えられますが、台数が増えるにつれて辛みも増していきます。 解決策 この課題は、一般的に以下のような手段で解決します。 (1) expect コマンドを用いたスクリプトを書く (2) TeraTerm マクロ で TTL ファイルを書く (3) Ansible の専用 module を用いた task を書く (4) NAPALM を用いてコードまたは YAML を書く (5) NAPALM CLI を利用する (1) - (4) は、いずれも 1 行のコマンドを実行するために複数行の構文が必要です。 また、運用継続に伴ってスクリプトやコードが焼き増された場合、多重メンテが必要になります。 (5) は解決策たりえますが、telnet や SSH と比較すると処理が緩慢で、普段使いには難があります。 これらを回避しつつ、より手軽にコマンドを実行したいという思いで、今回「telee」を書きました。 利用方法 以下は、記事作成時点の README.md (日本語版) です。最新の情報はリポジトリをご参照ください。 コマンド書式 telee -H HOSTNAME -C COMMAND [options...] コマンドオプション オプション 概要 デフォルト値 環境変数 --hostname(-H) ホスト名または IP アドレスを指定します。 - $TELEE_HOSTNAME --port(-p) ポート番号を指定します。 23 - --command(-C) 実行するコマンドを指定します。 - $TELEE_COMMAND --exec-platform(-x) 接続先の環境名を指定します。※後述参照 ios - --username(-u) ユーザ名を指定します。 admin $TELEE_USERNAME --password(-p) パスワードを指定します。 cisco $TELEE_PASSWORD --priv-password(--pp) 特権モードのパスワードを指定します。 enable $TELEE_PRIVPASSWORD --enable-mode(-e, --ena,--enable) 特権モードの利用時に設定します。 false - --ha-mode(-ha) HA モード機器への接続時に設定します。 false - --secure-mode(-s, --sec,--secure) SSH での接続時に設定します。 false - --timeout(-t) コマンドのタイムアウトを指定します。 5 - Exec Platform --exec-platform はログインプロンプトの識別に利用しています。 指定を誤った場合、正常にログイン出来ず、コマンドがタイムアウトします。 指定可能なプラットフフォームと、動作確認バージョンはそれぞれ以下の通りです。 定義名 (-x 指定) プラットフォーム名 Telnet SSH aireos Cisco AireOS ✅ 8.5.120.0 ✅ 8.5.120.0 allied AlliedTelesis AlliedWare ✅ 1.6.14B02 Not Supported asa Cisco ASA Software ✅ 9.0(4) Not Supported asa (--ha-mode) Cisco ASA Software (HA) ✅ 9.10(1) Not Supported foundry Brocade IronWare ✅ 07.2.02aT7e1 Not Supported ios Cisco IOS, IOS-XE ✅ 15.2(5c)E ✅ 15.2(5c)E nxos Cisco NX-OS ✅ 6.2(14) Not Supported srx JuniperNetworks JunOS Not Supported ✅ 15.1X49-D90.7 ssg JuniperNetworks ScreenOS ✅ 6.3.0r21.0 Not Supported ssg (--ha-mode) JuniperNetworks ScreenOS (HA) ✅ 6.3.0r22.0 Not Supported yamaha YAMAHA Router OS ✅ Rev.8.03.94 Not Supported 実行手順 ログインに利用するユーザ名とパスワードを、環境変数に設定します。 export TELEE_USERNAME=telee export TELEE_PASSWORD=Teleedev! export TELEE_PRIVPASSWORD=Teleedev!! ホスト名を指定してコマンドを実行します。 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" show int descr Load for five secs: 2%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:16:54.302 JST Sat May 8 2021 Interface Status Protocol Description Vl1 admin down down Vl800 up up *** LAB-MGMT *** Gi0/1 up up CLIENT_DEVICE_LONG_DESCR Gi0/2 up up CLIENT_DEVICE Gi0/3 up up CLIENT_DEVICE Gi0/4 up up CLIENT_DEVICE Gi0/5 up up CLIENT_DEVICE Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/8 up up GATEWAY_ROUTER Gi0/9 admin down down Gi0/10 admin down down lab-cat29l-02f99-01> 完了です。 応用例 パイプやリダイレクトにかける 出力結果を別のコマンドで処理出来ます。以下のように実行します。 実行例 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" | grep "Interface\|down" Interface Status Protocol Description Vl1 admin down down Gi0/1 down down CLIENT_DEVICE_LONG_DESCR Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/9 admin down down Gi0/10 admin down down $ telee --hostname lab-cat29l-02f99-01 --command "show run" --enable > telee.log $ head -n 10 telee.log show run Load for five secs: 1%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:21:34.501 JST Sat May 8 2021 Building configuration... Current configuration : 18687 bytes ! ! Last configuration change at 01:30:16 JST Sun Feb 14 2021 ! Cisco IOS 以外を操作する --exec-platform オプションの指定が必要です。 AireOS を操作する場合は、以下のように実行します。 実行例 $ telee -H 192.168.0.250 -C "show sysinfo" -x aireos show sysinfo Manufacturer's Name.............................. Cisco Systems Inc. Product Name..................................... Cisco Controller Product Version.................................. 8.5.120.0 Bootloader Version............................... 1.0.20 Field Recovery Image Version..................... 7.6.101.1 Firmware Version................................. PIC 19.0 OUI File Last Update Time........................ Sun Sep 07 10:44:07 IST 2014 Build Type....................................... DATA + WPS System Name...................................... lab-wlc-01f01-01a System Location.................................. System Contact................................... System ObjectID.................................. 1.3.6.1.4.1.9.1.1279 IP Address....................................... 192.168.0.250 <snip> Cisco ASA を操作する --enable-mode オプションの指定が必要です。 Cisco ASA は、ユーザ権限で terminal pager 0 が実行出来ません。 Cisco ASA を操作する場合は、以下のように実行します。 実行例 $ telee -H lab-asa5505-02f01-01 -C "show version" -x asa --enable-mode show version Cisco Adaptive Security Appliance Software Version 9.0(4) Device Manager Version 7.1(5)100 Compiled on Wed 04-Dec-13 08:33 by builders System image file is "disk0:/asa904-k8.bin" Config file at boot was "startup-config" lab-asa5505-02f01-01 up 70 days 2 hours Hardware: ASA5505, 512 MB RAM, CPU Geode 500 MHz, Internal ATA Compact Flash, 128MB BIOS Flash M50FW016 @ 0xfff00000, 2048KB Encryption hardware device : Cisco ASA-5505 on-board accelerator (revision 0x0) Boot microcode : CN1000-MC-BOOT-2.00 SSL/IKE microcode : CNLite-MC-SSLm-PLUS-2.03 <snip> SSH で接続する --secure-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-cat29l-02f99-01 -C "show run" --enable --secure show run Load for five secs: 8%/0%; one minute: 2%; five minutes: 1% Time source is NTP, 02:25:22.496 JST Fri May 14 2021 Building configuration... Current configuration : 18716 bytes ! ! Last configuration change at 01:46:41 JST Fri May 14 2021 by raciadev ! version 15.2 no service pad service tcp-keepalives-in service timestamps debug datetime msec localtime show-timezone service timestamps log datetime msec localtime show-timezone service password-encryption ! hostname lab-cat29l-02f99-01 <snip> 応答の遅い機器を操作する --timeout でタイムアウト値を調整出来ます。以下のように実行します。 実行例 $ telee -H lab-fs909-02f01-01 -C "show system" -x allied -u manager --timeout 10 show system Switch System Status Date 2021-05-09 Time 01:04:54 Board Bay Board Name ---------------------------------------------------------------------- Base - FS909M ---------------------------------------------------------------------- Memory - DRAM : 32768 kB FLASH : 8192 kB MAC : 00-1A-EB-93-1C-95 ---------------------------------------------------------------------- SysDescription : CentreCOM FS909M Ver 1.6.14 B02 SysContact : SysLocation : LAB SysName : lab-fs909-02f01-01 SysUpTime : 1267989237(146days, 18:11:32) Release Version : 1.6.14 Release built : B02 (Nov 23 2010 at 14:29:56) Flash PROM : Good RAM : Good SW chip : Good <snip> RADIUS Attribute を用いて特権を付与した環境で利用する --default-privilege-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-nx70-02f01-01 -C "show version" -x nxos --default-privilege-mode show version Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html Copyright (c) 2002-2015, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained in this software are owned by other third parties and used and distributed under license. Certain components of this software are licensed under the GNU General Public License (GPL) version 2.0 or the GNU Lesser General Public License (LGPL) Version 2.1. A copy of each such license is available at http://www.opensource.org/licenses/gpl-2.0.php and http://www.opensource.org/licenses/lgpl-2.1.php Software BIOS: version N/A kickstart: version 6.2(14) system: version 6.2(14) BIOS compile time: kickstart image file is: bootflash:///n7000-s1-kickstart.6.2.14.bin <snip>
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

napalm の 6 倍速いリモートコマンド実行ツールを書きました

ネットワーク機器のコマンドをリモート実行するツール「telee」を書きました。 このツールは、機器へのログイン処理とコマンド実行を代理します。 従来の expect スクリプト, NAPALM や Ansible の役割を部分的に担います。 以下は動作例です。 Cisco 社製 OS はもちろん、Juniper, YAMAHA 等、他社製 OS へのログインにも対応しています。 接続プロトコルは telnet もしくは ssh が選択出来ます。その他のプロトコルには対応していません。 実行速度を NAPALM のコマンドラインと比較すると、一般的な用途で 6 - 72 倍高速です。 ※ 測定の詳細は Performance Comparison: telee and napalm をご確認ください。 最新版のバイナリは、リポジトリの Releases page からダウンロード出来ます。 プラットフォームは、Linux, Mac の amd64, arm64 にそれぞれ対応しています。 ネットワークエンジニアの皆様、ぜひお試しください。フィードバックも大歓迎です。 ※ 記事最終更新時点の最新バージョンは v1.7.2 です。 以下、詳細です。 背景 ネットワーク機器の操作には、telnet を利用する場合があります。 しかし telnet は、公開鍵のようなシームレスな認証に対応していません。 機器にログインするには、大半のケースでユーザ・パスワード認証が必要です。 この入力に手間を感じていました。 ネットワーク業界で最も高いシェアを持つ Cisco 社製のスイッチを例に取ります。 このスイッチで設定の一覧を表示するには、以下の 7 ステップが必要になります。 (1) telnet コマンドを実行 (2) ユーザ名を入力 (3) パスワードを入力 (4) enable コマンドを実行 (5) 特権 EXEC パスワードを入力 (6) terminal length 0 コマンドを実行 (7) show running-config コマンドを実行 多いです。数台であれば耐えられますが、台数が増えるにつれて辛みも増していきます。 解決策 この課題は、一般的に以下のような手段で解決します。 (1) TeraTerm マクロ で TTL ファイルを書く (2) expect コマンド を用いたスクリプトを書く (3) Ansible の network_cli module 等を用いて task を書く (4) NAPALM を用いてコードまたは YAML を書く (5) NAPALM: Command Line Tool を利用する (1) - (4) は、いずれも 1 行のコマンドを実行するために複数行の構文が必要です。 また、運用継続に伴ってスクリプトやコードが焼き増された場合、多重メンテが必要になります。 (5) は解決策たりえますが、telnet や SSH と比較すると処理が緩慢で、普段使いには難があります。 豊富な機能を搭載している反面、ワンラインが伸びやすく、簡潔に書きづらい点も課題でした。 これらを回避しつつ、より手軽にコマンドを実行したいという思いで、今回「telee」を書きました。 利用方法 以下は、記事作成時点の README.md (日本語版) です。最新の情報はリポジトリをご参照ください。 基本書式 telee -H HOSTNAME -C COMMAND [options...] コマンドオプション オプション 概要 デフォルト値 環境変数 --hostname(-H) ホスト名または IP アドレスを指定します。 - $TELEE_HOSTNAME --port(-P) ポート番号を指定します。 23 - --command(-C) 実行するコマンドを指定します。 - $TELEE_COMMAND --exec-platform(-x) 接続先の環境名を指定します。※後述参照 ios - --username(-u) ユーザ名を指定します。 admin $TELEE_USERNAME --password(-p) パスワードを指定します。 cisco $TELEE_PASSWORD --priv-password(--pp) 特権モードのパスワードを指定します。 enable $TELEE_PRIVPASSWORD --enable-mode(-e, --ena, --enable) 特権モードの利用時に設定します。 false - --redundant-mode(-r, --redundant) HA 専用のプロンプトを持つ機器への接続時に設定します。 false - --secure-mode(-s, --sec, --secure) SSH での接続時に設定します。--port は 22 に設定されます。 false - --timeout(-t) タイムアウト秒を指定します。 5 - Exec Platform --exec-platform はログインプロンプトの識別に利用しています。 指定を誤った場合、正常にログイン出来ず、コマンドがタイムアウトします。 指定可能なプラットフォームと、動作確認バージョンはそれぞれ以下の通りです。 定義名 (-x 指定) プラットフォーム名 Telnet SSH aireos Cisco AireOS ✅ 8.5.120.0 ✅ 8.5.120.0 allied AlliedTelesis AlliedWare ✅ 1.6.14B02 Not Supported asa Cisco ASA Software ✅ 9.0(4) Not Supported asa (redundant) Cisco ASA Software (HA) ✅ 9.10(1) Not Supported foundry Brocade IronWare ✅ 07.2.02aT7e1 Not Supported ios Cisco IOS, IOS-XE ✅ 15.2(5c)E ✅ 15.2(5c)E nxos Cisco NX-OS ✅ 6.2(14) Not Supported srx JuniperNetworks JunOS Not Supported ✅ 15.1X49-D90.7 ssg JuniperNetworks ScreenOS ✅ 6.3.0r21.0 Not Supported ssg (redundant) JuniperNetworks ScreenOS (HA) ✅ 6.3.0r22.0 Not Supported yamaha YAMAHA Router OS ✅ Rev.8.03.94 Not Supported 実行手順 ログインに利用するユーザ名とパスワードを、環境変数に設定します。 export TELEE_USERNAME=telee export TELEE_PASSWORD=Teleedev! export TELEE_PRIVPASSWORD=Teleedev!! ホスト名を指定してコマンドを実行します。 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" show int descr Load for five secs: 2%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:16:54.302 JST Sat May 8 2021 Interface Status Protocol Description Vl1 admin down down Vl800 up up *** LAB-MGMT *** Gi0/1 up up CLIENT_DEVICE_LONG_DESCR Gi0/2 up up CLIENT_DEVICE Gi0/3 up up CLIENT_DEVICE Gi0/4 up up CLIENT_DEVICE Gi0/5 up up CLIENT_DEVICE Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/8 up up GATEWAY_ROUTER Gi0/9 admin down down Gi0/10 admin down down lab-cat29l-02f99-01> 完了です。 応用例 パイプやリダイレクトにかける 出力結果を別のコマンドで処理出来ます。以下のように実行します。 実行例 $ telee --hostname lab-cat29l-02f99-01 --command "show int descr" | grep "Interface\|down" Interface Status Protocol Description Vl1 admin down down Gi0/1 down down CLIENT_DEVICE_LONG_DESCR Gi0/6 down down CLIENT_DEVICE Gi0/7 down down CLIENT_DEVICE Gi0/9 admin down down Gi0/10 admin down down $ telee --hostname lab-cat29l-02f99-01 --command "show run" --enable > telee.log $ head -n 10 telee.log show run Load for five secs: 1%/0%; one minute: 1%; five minutes: 1% Time source is NTP, 23:21:34.501 JST Sat May 8 2021 Building configuration... Current configuration : 18687 bytes ! ! Last configuration change at 01:30:16 JST Sun Feb 14 2021 ! Cisco IOS 以外を操作する --exec-platform オプションの指定が必要です。 AireOS を操作する場合は、以下のように実行します。 実行例 $ telee -H 192.168.0.250 -C "show sysinfo" -x aireos show sysinfo Manufacturer's Name.............................. Cisco Systems Inc. Product Name..................................... Cisco Controller Product Version.................................. 8.5.120.0 Bootloader Version............................... 1.0.20 Field Recovery Image Version..................... 7.6.101.1 Firmware Version................................. PIC 19.0 OUI File Last Update Time........................ Sun Sep 07 10:44:07 IST 2014 Build Type....................................... DATA + WPS System Name...................................... lab-wlc-01f01-01a System Location.................................. System Contact................................... System ObjectID.................................. 1.3.6.1.4.1.9.1.1279 IP Address....................................... 192.168.0.250 <snip> Cisco ASA を操作する --enable-mode オプションの指定が必要です。 Cisco ASA は、ユーザ権限で terminal pager 0 が実行出来ません。 Cisco ASA を操作する場合は、以下のように実行します。 実行例 $ telee -H lab-asa5505-02f01-01 -C "show version" -x asa --enable-mode show version Cisco Adaptive Security Appliance Software Version 9.0(4) Device Manager Version 7.1(5)100 Compiled on Wed 04-Dec-13 08:33 by builders System image file is "disk0:/asa904-k8.bin" Config file at boot was "startup-config" lab-asa5505-02f01-01 up 70 days 2 hours Hardware: ASA5505, 512 MB RAM, CPU Geode 500 MHz, Internal ATA Compact Flash, 128MB BIOS Flash M50FW016 @ 0xfff00000, 2048KB Encryption hardware device : Cisco ASA-5505 on-board accelerator (revision 0x0) Boot microcode : CN1000-MC-BOOT-2.00 SSL/IKE microcode : CNLite-MC-SSLm-PLUS-2.03 <snip> SSH で接続する --secure-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-cat29l-02f99-01 -C "show run" --enable --secure show run Load for five secs: 8%/0%; one minute: 2%; five minutes: 1% Time source is NTP, 02:25:22.496 JST Fri May 14 2021 Building configuration... Current configuration : 18716 bytes ! ! Last configuration change at 01:46:41 JST Fri May 14 2021 by raciadev ! version 15.2 no service pad service tcp-keepalives-in service timestamps debug datetime msec localtime show-timezone service timestamps log datetime msec localtime show-timezone service password-encryption ! hostname lab-cat29l-02f99-01 <snip> 応答の遅い機器を操作する --timeout でタイムアウト値を調整出来ます。以下のように実行します。 実行例 $ telee -H lab-fs909-02f01-01 -C "show system" -x allied -u manager --timeout 10 show system Switch System Status Date 2021-05-09 Time 01:04:54 Board Bay Board Name ---------------------------------------------------------------------- Base - FS909M ---------------------------------------------------------------------- Memory - DRAM : 32768 kB FLASH : 8192 kB MAC : 00-1A-EB-93-1C-95 ---------------------------------------------------------------------- SysDescription : CentreCOM FS909M Ver 1.6.14 B02 SysContact : SysLocation : LAB SysName : lab-fs909-02f01-01 SysUpTime : 1267989237(146days, 18:11:32) Release Version : 1.6.14 Release built : B02 (Nov 23 2010 at 14:29:56) Flash PROM : Good RAM : Good SW chip : Good <snip> RADIUS Attribute を用いて特権を付与した環境で利用する --default-privilege-mode オプションの指定が必要です。以下のように実行します。 実行例 $ telee -H lab-nx70-02f01-01 -C "show version" -x nxos --default-privilege-mode show version Cisco Nexus Operating System (NX-OS) Software TAC support: http://www.cisco.com/tac Documents: http://www.cisco.com/en/US/products/ps9372/tsd_products_support_series_home.html Copyright (c) 2002-2015, Cisco Systems, Inc. All rights reserved. The copyrights to certain works contained in this software are owned by other third parties and used and distributed under license. Certain components of this software are licensed under the GNU General Public License (GPL) version 2.0 or the GNU Lesser General Public License (LGPL) Version 2.1. A copy of each such license is available at http://www.opensource.org/licenses/gpl-2.0.php and http://www.opensource.org/licenses/lgpl-2.1.php Software BIOS: version N/A kickstart: version 6.2(14) system: version 6.2(14) BIOS compile time: kickstart image file is: bootflash:///n7000-s1-kickstart.6.2.14.bin <snip> まとめ 以上、ネットワーク機器の運用を効率化するコマンドを紹介しました。 ネットワーク機器のコマンド出力をシェル上で直接捌けることには、高い汎用性があります。 一例を挙げると、旧来の Rancid や Ansible を、より単純なシェルスクリプトに置換出来ます。 コマンドとシェルの知識だけ持ってれば良いため、学習コスト・運用コストともに安上がりです。 各々のユースケースで、採用できそうなポイントを是非模索してみてください。 最後までお読み頂きありがとうございました。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む