PythonでFortigateのconfigをバックアップするスクリプトを作る

目次

はじめに

Python で Fortigate の config をバックアップするスクリプトを書いてみました。
Netmiko や argparse のモジュールを使ってます。

処理の概要

処理内容は以下のような2段階の動き。

  1. バックアップ先にあるファイルを、ファイル名に「_yymmddhhmm」を付けて old フォルダに移動する
  2. 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発で終わるのであると便利かも。
設定変更するスクリプトを作って、呼び出すのもありかと。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次