Slide 1

Slide 1 text

約1,000台のNW機器から ログを取得してみた

Slide 2

Slide 2 text

Profile Name 呉 理沙 Career ・2015 富士通に入社 ・2015~2017 営業(通信事業者担当) ・2018~ Network Automation Engineer 趣味 ・ 海外の囲碁大会に参加すること ・ SUITS(海外ドラマ), 新作ポケモンにハマり中。

Slide 3

Slide 3 text

・背景: ある機器の電源をon/offしたら、設定保存がされてない事が判明! ☞日本全国に設置された約1,000台の機器を調査する事に。 ☞そうだ、Ansibleを使おう。 ・Playbookで実行されるタスク: ☞そもそも疎通できるかどうか確認 ☞差分確認のためのコマンドを実行して出力の有無を確認 作業背景

Slide 4

Slide 4 text

自動化の障壁 エクセルで管理(セル結合) された機器のインベントリ情報 Ansibleまでの道のりが長い現場がたくさん・・・

Slide 5

Slide 5 text

本日のテーマ ログイン情報管理表 (人間用) Inventory file Playbook PC用 Ansible実行結果の CSVデータ (PC用) 分析結果出力 (人用) 人間用からPC用へ、PC用から人間用へ 壁1:セル結合されたエクセル 壁2:telnet接続 踏み台経由での接続 壁3:実行結果の分析 + Linux のExpect

Slide 6

Slide 6 text

退屈な事はPythonにやらせよう! 壁1:セル結合されたインベントリ情報 Inventory File セル結合された インベントリ情報 CSV化 マクロを利用 ※マクロ以外のやり方絶賛募集中!※

Slide 7

Slide 7 text

Idea 1. NetmikoやPyATSを使う ・Netmiko ☞多段ログイン機能はあるが、SSH前提でモジュールが作られているため 難しい ・PyATS ☞Telnetでも多重接続可能。しかし弊社製NW機器なのでOSタイプとして 指定できない 壁2:Telnet & 踏み台

Slide 8

Slide 8 text

壁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から実行されるコマンド)

Slide 9

Slide 9 text

壁2:Telnet & 踏み台 ◆expectモジュールのAnsibleドキュメントより引用 “expectモジュールはシンプルな使い方を想定して作られている。 複雑な事をしたいときはshellモジュールかscriptモジュールを使ってね。“ Shellモジュールでのexpect使い方例 ・踏み台経由での使い方は複雑 ・NW機器は種類によってプロンプトが異なる ・プロンプトの条件分岐をPlaybookで書き切るのは大変 Ansibleモジュールだけでexpectの実現は厳しそう。

Slide 10

Slide 10 text

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 & 踏み台

Slide 11

Slide 11 text

壁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レポートを作成した

Slide 12

Slide 12 text

壁3:実行結果の分析 ~レポート~ 生成したCSVレポートをJupyter Notebookで分析 ☞「何が・何に」失敗したのか即時把握が可能 ☞作業現場でしかできない失敗原因分析に取り掛かれる ※レポート確認に時間を取られずに済み、確認作業にリソースを回せる ・インベントリグループごとにNGだった機器数 を分析 ☞その場で原因調査が可能 ・差分ありのホストを表示したり ☞その場でどんな差分があるのか確認できる/分析作業が楽

Slide 13

Slide 13 text

仕上げ: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を実行できるようにした

Slide 14

Slide 14 text

おまけ:こんなこともできるよ ◆インベントリ情報 ☞グラフ出力でどの拠点のホストが 多いか一目でわかる

Slide 15

Slide 15 text

1, 「Ansibleまでの道のり」を解決しておくとオートメーションの世界がグっと広がる! 2, Telnetでも諦めなければ道は開ける!! ※最初からSSHを使いましょう。 3, 多数の機器をAnsibleで扱う場合、実行結果は何らかのデータ型で まとめておくと便利(json, csv等) ☞理想: 今回作成したAnsible実行結果のレポートをデータベースに格納して運用する トライアルをしてみたい まとめ