目次
はじめに
Python で Fortigate の config をバックアップするスクリプトを書いてみました。
Netmiko や argparse のモジュールを使ってます。
処理の概要
処理内容は以下のような2段階の動き。
- バックアップ先にあるファイルを、ファイル名に「_yymmddhhmm」を付けて old フォルダに移動する
- Fortigate に接続して config をバックアップ先に保存
利用する際は以下のパラメータを変更する必要がある。
- password
- host
- username
- sys_srcf
- sys_cpf
実行方法
実行する際は -s の後にホスト名や IP を指定する必要がある。
# fortigate の名前が fw1 だった場合
fortigate_conf_bak.py -s fw1
コード
コードは以下。
実行した環境はPython 3.9系。
from netmiko import Netmiko
import sys, os, shutil, datetime, time, argparse
# 引数を解析する
parser.add_argument('-s', '--server', help='接続先サーバ指定')
args = parser.parse_args()
password = 'hogehoge' #パスワード定義
now1 = datetime.datetime.now()
now2 = "{0:%Y%m%d%H%M}".format(now1) #バックアップ時のファイル用のタイムスタンプ取得
#Fortigate コネクションパラメータ
def connect_set(server_name, password):
if server_name == 'fw01': #fortigate 1
fw_set = {
'host' : 'fw01', #ホスト名
'username' : 'admin', #ログインユーザ
'password' : password, #パスワード
'device_type' : 'fortinet', #デバイスタイプ定義
'timeout': 60
}
elif server_name == 'fw02': #fortigate 1
fw_set = {
'host' : 'fw02',
'username' : 'admin',
'password' : password,
'device_type' : 'fortinet',
'timeout': 60
}
else:
print('指定されたサーバが不明です')
sys.exit()
return(fw_set)
#Fortigate 接続処理
def conect_device(fw_set, server_name):
print(f"{'#'*20} Connecting to {server_name} {'#'*20}")
net_connect = Netmiko(**fw_set) #接続処理
print(f"{'#'*20} Connected to {server_name} {'#'*20}")
print()
return(net_connect)
#バックアップ処理
def backup_conf(server_name):
sys_srcf = 'C:/conf/' #config 保存先
sys_cpf = 'C:/conf/old/' #過去分保存用フォルダ
target_file1 = f"{server_name}-config"
target_path1 = sys_srcf + target_file1 #ターゲットファイル定義
cp_path1 = sys_cpf + target_file1 + '_' + now2 #コピー先定義(元のファイル名_日時)
#最新ファイルを OLD移動
logger.debug("File Backup Start")
isfile = os.path.isfile(target_path1)
if isfile: #ファイル有無
shutil.copyfile(target_path1, cp_path1) #old にバックアップ
logger.debug("File Backup Finish")
return(target_path1)
#Fortigate Config 保存
def save_conf(net_connect, server_name):
target_path1 = backup_conf(server_name) # バックアップ処理
print()
print(f"{'#'*20} Starting Save full-configuration {'#'*20}")
output = net_connect.send_command('show full-configuration', delay_factor=5) #config 表示
f = open(target_path1, 'w', encoding='utf-8') #ファイルオープン
f.write(output) #ファイルに書き込み
f.close()
print(f"{'#'*20} Complete Save full-configuration {'#'*20}")
return()
if __name__ == '__main__':
fw_set = connect_set(args.server, password) #Fortigate コネクションパラメータ
net_connect = conect_device(fw_set, args.server) #Fortigate 接続処理
save_conf(net_connect, args.server) #Fortigate Config 保存
sys.exit()
まとめ
汚い書き方は多めに見てください。
fortigate の config を定期バックアップしたり、設定変更前に1発で終わるのであると便利かも。
設定変更するスクリプトを作って、呼び出すのもありかと。
コメント