Pythonツールを使用したMikroTiksによる一元化された構成コレクション

なぜ





ネットワークノードの数の増加とその構成の複雑さにより、多くの人が疑問を抱くでしょう。そして、鉄片が死んだ場合、すぐに別の仕事に戻すことができますか? 手動で行うことができる場合、忘れてしまったささいなものをどれくらいの時間キャッチしますか?



グーグルのプロセスにより、このベンダー専用のこの種の既製のソリューションは存在しないという理解が得られました。 私はコミュニティで見つかったものが好きではありませんでした-彼らはハードウェア自体にバックアップスクリプトを配置し、スケジュール通りに実行することを提案しました。 本質的にはこれで問題は解決しましたが、数十個の機器がある場合、各コピーのコピーペーストをクリックしても風水ではありません。



幸いなことに、Pythonと空想で役に立つことを書くスキルは少しあります。





ファンタジー





必要なもの-経済を置くTFTPサーバー、nixマシン(winよりも簡単です)、必要なライブラリのセットを搭載したPython。 後で判明したように、TFTPサーバーは破棄できます。FTPが必要です。



時間を試す




私は真っ先に問題を解決しようとしています-通信にtelnetlibを使用しています-それは動作しません。 スイッチで動作するため、奇妙です。 考え直した後、MikroTikのtelnetは虹のすべての色で装飾されていること、つまり特殊文字が散らばっていることを意味し、それらをフィルタリングすることは計画に含まれていないことに気付きました。



試行2




私はparamikoライブラリとそのコンポーネントSSHClientを見ています-これですべてがうまくいきました-接続が通過し、コマンドを実行して結果を得ることができます。



次に、これらの非常に珍しい鉄片から構成がどのように削除されるかを見てみましょう。 ネットワーク機器の一般的なシナリオは、設定をTFTPサーバーに送信できる1つのコマンドの実行です。 MikroTikの場合、このオプションは機能しません。バックアップ構成を作成するために最初に必要なのは、作成することです。



/system backup save [name=]







その後、ファイルは既にどこかでダウンロードできますが、判明したように、これはFTPプロトコルを使用してのみ実行でき、HTTPおよびTFTPではファイルのマージのみが可能です。 重要ではありません。最小限の設定でFTPサーバーをすぐに引き上げます。これは、高く評価されている読者がGoogleで検索するのは難しくありません。



/tool fetch address= mode=ftp dst-path= src-path= user= password= upload=yes







そして、最後に、内部キャリアの空きスペースが枯渇しないように、ゴミをきれいにする必要があります。



/file remove







結果




数時間、ファンタジーはこのスクリプトを生み出しました:



 #!/usr/bin/env python # -*- coding: utf-8 -*- # for SSH from paramiko import SSHClient from paramiko import AutoAddPolicy # for versioning import datetime # for file operations import os # for sleep import time # versioning Version = datetime.date.today() #print "\n" + str(Version) # hosts array IP1, IP2, IP3 hosts = ( "1.2.3.4", "5.6.7.8" , "9.10.11.12") # username users = ( "user1", "user2", "user3") iterUser = iter(users) # userpassword passwords = ( "pass1", "pass2", "pass3" ) iterPassword = iter(passwords) # FTPD IP FtpdIP = "13.14.15.16" # ftp user account ftpUser = "ftpuser" ftpPass = "ftppass" # keep backups for 4 weeks backtime = datetime.timedelta(weeks=-4) sshCli = SSHClient() sshCli.set_missing_host_key_policy(AutoAddPolicy()) print "header done" # loop host adresses for host in hosts: print "\n" + str(host) # iterate through user-password pairs user = iterUser.next() Password = iterPassword.next() # define operations CreateLocalBckp = "system backup save name=" + str(host) + "_" + str(Version) + ".backup" UploadToFtp = "tool fetch address=" + str(FtpdIP) + " mode=ftp dst-path=" + str(host) + "_" + str(Version) + ".backup src-path=" + str(host) + "_" + str(Version)+ ".backup" + " user=" + str(ftpUser) + " password=" + str(ftpPass) + " upload=yes" RemoveLocalBckp = 'file remove "' + str(host) + "_" + str(Version) + ".backup" + '"' # try for not to fail the whole script on one error try: print "connecting.." + str(host) + "@" + str(user) + ":" + str(Password) sshCli.connect(str(host), port=2022, username=str(user), password=str(Password)) print "connected.." # creating local backup print "creating local backup.. /" + CreateLocalBckp sshCli.exec_command(CreateLocalBckp) # sleep after each command because mikrotik can not do it so fast as script executes time.sleep(2) print "local backup created.." # uloading local backup to ftp print "uploading local backup to ftp.. /" + UploadToFtp sshCli.exec_command(UploadToFtp) time.sleep(2) print "backup uploaded to remote location.." # removing local backup time.sleep(2) print "removing local backup.. /" + RemoveLocalBckp sshCli.exec_command(RemoveLocalBckp) time.sleep(2) print "local backup removed.." sshCli.close() # try delete old file (if exists) try: os.remove("/tftp/" + str(host) + "_" + str(Version + backtime) +".cfg") except: print "Error while trying to delete old backup " + "/tftp/" + str(host) + "_" + str(Version + backtime) +".cfg" except: print "Error connecting to host", host
      
      







スクリプトは、IP_YYYY-MM-DD.backupという形式の名前で、月ごとの設定バックアップのセットをFTPサーバーに保存します



PS:3Comスイッチの場合にも同様の作成方法があり、Telnetを介してTFTPに構成をダウンロードします。読者が興味を持っている場合は、間違いなく公開します。



All Articles