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
【やさしく解説 設計編 #0】DDDのコード、読めるのに分からない人へ
panda728
PRO
2
270
フィードバックで育てるAI開発
kotaminato
1
120
なぜ関数型プログラミングで「型」と「証明」が語られるのか #fp_matsuri
kajitack
3
980
AI 輔助遺留系統現代化的經驗分享
jame2408
1
1.2k
The Past, Present, and Future of Enterprise Java
ivargrimstad
0
290
ビデオ通話が繋がる0.2秒で何が起きているのか
supurazako
2
150
使用 Meilisearch 建立新聞搜尋工具
johnroyer
0
150
Prismを使った型安全な暗号化_関数型まつり2026
_fhhmm
0
140
えっ!!コードを読まずに開発を!?
hananouchi
0
220
Built Our Own Background Agent at LayerX #aidevex_findy
layerx
PRO
0
130
Claude Opus 4.6以後の受託開発エンジニアの変化(Claude Code開発ノウハウ大公開スペシャルbyクラスメソッド)
iidatakuma
1
800
アルゴリズムは何を圧縮しているのか ─ Haskell から育った「圧縮代数」というメンタルモデル
naoya
16
3.5k
Featured
See All Featured
AI in Enterprises - Java and Open Source to the Rescue
ivargrimstad
0
1.4k
SEOcharity - Dark patterns in SEO and UX: How to avoid them and build a more ethical web
sarafernandez
0
220
Discover your Explorer Soul
emna__ayadi
2
1.2k
Between Models and Reality
mayunak
4
380
Kristin Tynski - Automating Marketing Tasks With AI
techseoconnect
PRO
0
290
svc-hook: hooking system calls on ARM64 by binary rewriting
retrage
2
350
The AI Revolution Will Not Be Monopolized: How open-source beats economies of scale, even for LLMs
inesmontani
PRO
3
3.6k
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Building Flexible Design Systems
yeseniaperezcruz
330
40k
Technical Leadership for Architectural Decision Making
baasie
3
440
A designer walks into a library…
pauljervisheath
211
24k
Mobile First: as difficult as doing things right
swwweet
225
10k
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実行結果のレポートをデータベースに格納して運用する トライアルをしてみたい まとめ