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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
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
Agentic UI
manfredsteyer
PRO
0
110
AI時代のUIはどこへ行く?その2!
yusukebe
19
6.8k
Spec-Driven Development with AI-Agents: From High-Level Requirements to Working Software
antonarhipov
2
470
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.3k
不変条件と整合性境界—ビジネスが決める設計判断と実現パターン / Invariants and Consistency Boundaries
nrslib
13
3.5k
軽量Java基盤の設計 DIコンテナに頼らない、長期保守と1秒起動の実現 JJUG CCC 2026 Spring
macha64
0
470
ふつうのFeature Flag実践入門
irof
7
3.6k
AIとRubyの静的型付け
ukin0k0
0
550
Skillsは効率化、Agentsは"自分の拡張"——Builder時代のエージェント編成(CC Night 2026)
wemra
1
110
Oxlintのカスタムルールの現況
syumai
6
1k
Hunting Vulnerabilities in Symfony with LLMs
vinceamstoutz
0
310
気づいたらRubyで100作品 ー クリエイティブコーディングが生活の一部になるまで / 100 Ruby Sketches Later: How Creative Coding Became Part of My Life
chobishiba
3
550
Featured
See All Featured
GraphQLとの向き合い方2022年版
quramy
50
15k
How to optimise 3,500 product descriptions for ecommerce in one day using ChatGPT
katarinadahlin
PRO
1
3.6k
Believing is Seeing
oripsolob
1
140
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Designing for humans not robots
tammielis
254
26k
Intergalactic Javascript Robots from Outer Space
tanoku
273
27k
Practical Tips for Bootstrapping Information Extraction Pipelines
honnibal
25
1.9k
A Modern Web Designer's Workflow
chriscoyier
698
190k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
27k
Easily Structure & Communicate Ideas using Wireframe
afnizarnur
194
17k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Speed Design
sergeychernyshev
33
1.8k
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実行結果のレポートをデータベースに格納して運用する トライアルをしてみたい まとめ