ガチャつくブログ

IT系のお勉強のために、やってみたことをアウトプットしていきます。

MENU

Pythonでガチャつく - ネットワーク機器にSSH -

f:id:tmt-tty:20200204230418p:plain

はじめに

ども、とみた(@_tamitom)です。

 

今回はPythonでガチャついてみたいと思います。

Pythonができる訳では無いのですが、、日経ネットワークの特集で『Pythonを使ってネットワーク自動運用』というインフラエンジニアが食い付く特集があったので、食い付いて見ました(笑)

 

時代はコード化&自動化なんですよね。

これを気に本気でPythonマスターになりたいと思いました。

 

今回は、Pythonを使って、ネットワーク機器(Cisco)にSSHでログインして、簡単なコマンドを実行する所までやってみたいと思います。

 

ガチャつき方

Pythonが実行できる環境が必要です。WindowsでもMacでも構いません。

操作対象となるネットワーク機器も必要です。

 

まずはじめにPingコマンドをPythonを介して実行してみたいと思います。

複数宛先に対してPingを1回実行し、応答があればOK、応答がなければNGを返す様にします。

destinations.txtというファイルを準備して、IPアドレスを複数行記載しておきます。

ping.py

import subprocess

#Ping結果のリターンコード取得
def is_reached(dest):
  p = subprocess.run(["ping", dest, "-t", "1"],
                      stdout=subprocess.PIPE)
  return p.returncode == 0

#宛先をファイルから読み込んで実行
with open('destinations.txt', 'r') as f:
  for line in f:
    dest = line.strip()
    print(dest)
    print("OK" if is_reached(dest) else "NG")

 

続いて、netmikoというライブラリを使用して、ネットワーク機器にログインして、showコマンドを叩いてから切断してみます。

 

netmiko_ssh.py

from netmiko import ConnectHandler

#接続設定
my_device = {
    'device_type': 'cisco_ios',
    'host':   'IPアドレス',
    'username': 'ユーザー名',
    'password': 'パスワード',
    'port' : 22,
    'secret': 'enableパスワード',
}

#接続
net_connect = ConnectHandler(**my_device)
net_connect.enable()

#コマンド実行
output = net_connect.send_command('sh ip int b')
print(output)

#切断
net_connect.disconnect()

 

続いて、特定のポートの状態を取得してから、ポートをshutして、再度ポートの状態を取得してから切断してみます。

 

netmiko_shut.py

from netmiko import ConnectHandler

#接続情報 my_device = { 'device_type': 'cisco_ios', 'host': 'IPアドレス', 'username': 'ユーザー名', 'password': 'パスワード', 'port' : 22, 'secret': 'enableパスワード', } #接続 net_connect = ConnectHandler(**my_device) net_connect.enable() #コマンド実行_ポートステータス確認 output = net_connect.send_command("sh int インターフェイス名 status") print(output) #コマンド実行_ポートステータス変更 command = ["interface インターフェイス名", "shutdown"] net_connect.send_config_set(command) #コマンド実行_ポートステータス確認 output = net_connect.send_command("sh int インターフェイス名 status") print(output) #切断 net_connect.disconnect()

 

最後に、設定変更前後のログをcsvに吐き出す設定をして、ポートをno shutします。

csvに吐き出すにはTextFSMというライブラリとntc-templatesというテンプレートが必要です。

 

netmiko_log_noshut.py

from netmiko import ConnectHandler
import pandas as pd

#接続情報
my_device = {
    'device_type': 'cisco_ios',
    'host':   'IPアドレス',
    'username': 'ユーザー名',
    'password': 'パスワード',
    'port' : 22,
    'secret': 'enableパスワード',
}

#log設定
def csv_log(f):
    output = net_connect.send_command("sh int status", use_textfsm=True)
    df = pd.DataFrame(output)
    df.to_csv(f, index=False)
    print("output "+f)

#接続
net_connect = ConnectHandler(**my_device)
net_connect.enable()

#事前ログ取得
csv_log("before.csv")

#コマンド実行_ポートステータス変更
command = ["interface インターフェイス名", "no shutdown"]
net_connect.send_config_set(command)

#事後ログ取得
csv_log("after.csv")

#切断
net_connect.disconnect() 

これいいですね。

TeraTermなどからエディタにコピペする手間が省けます。

 

まとめ

プログラミングを始めると、いつもHello Worldで終わってしまうんですが、※Pythonはprint("Hello World") Pythonの様にライブラリが豊富で、自分の得意分野にも利用できるライブラリがあると、そこから始めよう!という気になって良いなと思いました。

 

機械学習にも興味はあるので、これを気にPythonを勉強していきたいと思います。

目指せPythonマスター!!