Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
1,000台のNW機器からログを取得してみた
Search
mahoutukaisali
November 20, 2019
Programming
3.6k
4
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
1,000台のNW機器からログを取得してみた
Ansible NW部
mahoutukaisali
November 20, 2019
Other Decks in Programming
See All in Programming
Dataformのリポジトリを立ち上げるときにまずやること / dataform-day0-2026
snhryt
0
170
Strategic Design in the Frontend: Moduliths & Micro Frontends @DDDEurope
manfredsteyer
PRO
0
110
並列実装の現場、2ヶ月間実務でAIを使い倒したAIもPCも私も限界が近い
ming_ayami
0
130
例外の正しい扱い方 そのエラー try-catchして大丈夫?
jinwatanabe
0
260
決定論的オーケストレーションの設計と実装 / Design and Implementation of Deterministic Orchestration
nrslib
4
1.4k
代数的データ型って何が嬉しいの? #frontend_phpcon_do
kajitack
8
3.7k
Signal Forms: Details & Live Coding @enterJS 2026 in Mannheim
manfredsteyer
PRO
0
160
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
590
1B+ /day規模のログを管理する技術
broadleaf
0
100
気圧・高度・GPSを記録&可視化するアプリ「Koudo」を作った話
hjmkth
1
310
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
140
Claspは野良GASの夢をみるか
takter00
0
200
Featured
See All Featured
So, you think you're a good person
axbom
PRO
2
2.1k
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.9k
The Illustrated Children's Guide to Kubernetes
chrisshort
51
52k
HTML-Aware ERB: The Path to Reactive Rendering @ RubyCon 2026, Rimini, Italy
marcoroth
1
210
KATA
mclloyd
PRO
35
15k
Large-scale JavaScript Application Architecture
addyosmani
515
110k
A Guide to Academic Writing Using Generative AI - A Workshop
ks91
PRO
1
330
Accessibility Awareness
sabderemane
1
140
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
270
RailsConf & Balkan Ruby 2019: The Past, Present, and Future of Rails at GitHub
eileencodes
141
35k
Helping Users Find Their Own Way: Creating Modern Search Experiences
danielanewman
31
3.2k
Designing for Performance
lara
611
70k
Transcript
約1,000台のNW機器から ログを取得してみた
Profile Name 呉 理沙 Career ・2015 富士通に入社 ・2015~2017 営業(通信事業者担当) ・2018~
Network Automation Engineer 趣味 ・ 海外の囲碁大会に参加すること ・ SUITS(海外ドラマ), 新作ポケモンにハマり中。
・背景: ある機器の電源をon/offしたら、設定保存がされてない事が判明! ☞日本全国に設置された約1,000台の機器を調査する事に。 ☞そうだ、Ansibleを使おう。 ・Playbookで実行されるタスク: ☞そもそも疎通できるかどうか確認 ☞差分確認のためのコマンドを実行して出力の有無を確認 作業背景
自動化の障壁 エクセルで管理(セル結合) された機器のインベントリ情報 Ansibleまでの道のりが長い現場がたくさん・・・
本日のテーマ ログイン情報管理表 (人間用) Inventory file Playbook PC用 Ansible実行結果の CSVデータ (PC用)
分析結果出力 (人用) 人間用からPC用へ、PC用から人間用へ 壁1:セル結合されたエクセル 壁2:telnet接続 踏み台経由での接続 壁3:実行結果の分析 + Linux のExpect
退屈な事はPythonにやらせよう! 壁1:セル結合されたインベントリ情報 Inventory File セル結合された インベントリ情報 CSV化 マクロを利用 ※マクロ以外のやり方絶賛募集中!※
Idea 1. NetmikoやPyATSを使う ・Netmiko ☞多段ログイン機能はあるが、SSH前提でモジュールが作られているため 難しい ・PyATS ☞Telnetでも多重接続可能。しかし弊社製NW機器なのでOSタイプとして 指定できない 壁2:Telnet
& 踏み台
壁2:Telnet & 踏み台 Idea 2. Ansibleのexpectモジュールを使う --- - expect: command:
telnet X.X.X.X response: Login: username Password: password Ansibleサーバ 踏み台機器 ターゲット機器 Telnet Telnet telnet X.X.X.X User ID Password show run Playbook show run CLI(ansibleから実行されるコマンド) CLI(ansibleから実行されるコマンド)
壁2:Telnet & 踏み台 ◆expectモジュールのAnsibleドキュメントより引用 “expectモジュールはシンプルな使い方を想定して作られている。 複雑な事をしたいときはshellモジュールかscriptモジュールを使ってね。“ Shellモジュールでのexpect使い方例 ・踏み台経由での使い方は複雑 ・NW機器は種類によってプロンプトが異なる ・プロンプトの条件分岐をPlaybookで書き切るのは大変
Ansibleモジュールだけでexpectの実現は厳しそう。
Idea 3. 自前でexpectスクリプトを書いてPlaybookで呼び出した JUMP_HOST: X.X.X.X JUMP_User: telnet_user JUMP_Password: password インベントリ変数に踏み台ホストの
ログイン情報の変数を定義 ※group_vars/host/vars.yml - name: run expect delegate_to: localhost command: "{{ EXPECT_SCRIPT_PATH + ' ' + JUMP_HOST + ' ' + JUMP_USERNAME + ' ' + JUMP_PASSWORD + ' ' + JUMP_ENABLE + ' ' + ansible_host + ' ' + ansible_user + ' ' + ansible_password + ' ' + ansible_become_pass + ' ' + CMD_LIST|join(' ') }}" vars: CMD_LIST: - 'show¥ diff¥ run¥ start' expectスクリプトを呼び出すプレイブック 壁2:Telnet & 踏み台
壁3:実行後結果の分析 - block: - telnet: commands: show diff run start
delegate_to: localhost register: r - set_fact: _stdout: “{{ r.stdout }}” _diff: “{ % if stdout %}差分あり{% else %}差分無し{% endif %}” _result: “{{ ‘NG’ if r.failed else ‘OK’ }}” rescue: - set_fact: _result: ‘NG’ host, address, result, 差分 {% for host in ansible_play_hosts -%} {% set inventory=host %} {% set address=hostvars[host][‘ansible_host ’] %} {% set result=hostvars[host][‘_result’] %} {% set diff=hostvars[host][‘_diff’] %} {{ inventory }},{{ address }},{{ result }}, {{ diff }} {% endfor %} ・何も出力が無ければ差分が無いので、その結果を格納する変数を定義 ・コマンドの実行の成否を確認するための変数も用意 ・使用モジュール: block, set_fact, telnet host address 疎通結果 差分 host1 1.1.1.1 OK 差分あ り host2 2.2.2.2 NG - host3 3.3.3.3 OK 差分無 し ・ ・ ・ レポート(CSVファイル) ・1,000台分の実行ログを辿るのは無理 ☞インベントリグループごとに、疎通可否/差分の有無の結果をまとめたCSVレポートを作成した
壁3:実行結果の分析 ~レポート~ 生成したCSVレポートをJupyter Notebookで分析 ☞「何が・何に」失敗したのか即時把握が可能 ☞作業現場でしかできない失敗原因分析に取り掛かれる ※レポート確認に時間を取られずに済み、確認作業にリソースを回せる ・インベントリグループごとにNGだった機器数 を分析 ☞その場で原因調査が可能
・差分ありのホストを表示したり ☞その場でどんな差分があるのか確認できる/分析作業が楽
仕上げ:NG/差分ありだった機器はどうする? host address result 差分 host1 1.1.1.1 OK 差分あ り
host2 2.2.2.2 NG - host3 3.3.3.3 OK 差分無 し レポート(CSVファイル) ・ ・ ・ Inventory File ・Task1:NGホストだけを読み取ったInventory Fileを生成し後日、 正しい情報で再確認できるようにした ・Task2:差分ありホストだけを読み取ったInventory Fileを作成し後日、 設定保存できていないホストだけにcopyコマンドを実行する Playbookを実行できるようにした
おまけ:こんなこともできるよ ◆インベントリ情報 ☞グラフ出力でどの拠点のホストが 多いか一目でわかる
1, 「Ansibleまでの道のり」を解決しておくとオートメーションの世界がグっと広がる! 2, Telnetでも諦めなければ道は開ける!! ※最初からSSHを使いましょう。 3, 多数の機器をAnsibleで扱う場合、実行結果は何らかのデータ型で まとめておくと便利(json, csv等) ☞理想:
今回作成したAnsible実行結果のレポートをデータベースに格納して運用する トライアルをしてみたい まとめ