bashスクリプトを使用したMikrotikデバイスの集中バックアップ

みなさん、こんにちは。ハブに関する最初の出版物で、Mikrotikデバイスのバックアップ用の既製のソリューションを共有したいと思います。



Mikrotikには2種類の構成バックアップがあります。これらはバイナリバックアップと構成エクスポートです。 バイナリバックアップには長所と短所があります。 利点は、バイナリバックアップを復元した後、構成全体(ユーザー、sshキーを持つユーザー用にインポートされたパスワード)が保存されることです。 欠点は、そのようなバックアップを別の種類のデバイスに復元できないことです。



一般に、これは完全バックアップであり、その回復には少し時間がかかり、構成全体が復元されます。 バックアップ方法として構成をエクスポートすると、これらの欠点が部分的に軽減されます。これは、Mikrotik再構築のスクリプトです。 一番下の行は、エクスポート可能なすべての設定が表示されることです。 利点は、そこにエクスポートされたものを見ることができ、感じることができることです。また、欠点は、それがモデル上にもあるという事実を含みます。 しかし、少し少ない。 問題はインターフェイスの数である場合もあれば、別の場合もあります。 また、すべての設定をテキスト(ユーザー、デバイス上のファイル、sshキー)にエクスポートできるわけではありません。



全体として、そして一般に、私が自分自身で学んだように、私自身のために、できれば定期的かつ常に自動的に両方の選択肢を持つことが絶対に必要です。 私はWiki Mikrotikからアイデアを取りました: 1つと 2つ



メールまたはftpによるバックアップの提案されたバージョンは、ここではすべてがメールまたはftpによるものであり、すべてがプレーンテキストであるため、好きではありません。 また、何らかの種類のボックスまたはftpを保持する必要があり、microtics自体が送信するという事実も気に入らない。 バックアップサーバーからすべてを行う方が便利です。



実際、手でsshをバックアップするには、Mikrotikに移動してバックアップを実行し、それを取り出すだけで十分です。 したがって、これは自動化できます。



すでに理解しているように、これらはすべて通常のbashスクリプトの助けを借りて実現されました。その後、少しゴミが入り、静かに動作します。 そこで、興味のある人から何らかのフィードバックを得るために、ここで説明することにしました。



そのため、 スクリプトに直接渡します



スクリプトファイル



スクリプトが機能するためには、実行可能ファイルが使用され、そのパラメーターは構成ファイルを示します。



/usr/local/bin/mbkp /etc/mikrotik_backup/xxx-core01.cfg
      
      





したがって、PATHでの検索を容易にするために、バックアップスクリプトが/ usr / local / bin /ディレクトリに配置され、構成ファイルはFHSに従って/ etc / mikrotik_backup /に保存されます。 ファイルの割り当ては個人的な問題であり、私にとってはより便利です。



実行可能スクリプト



最初のセクションには、スクリプトが実行されないように指定することなく、構成ファイルをチェックするshebangが含まれています。 次に、かなり簡潔なデフォルト変数を示します。これらの一部は、特定のデバイスの構成ファイルでオーバーライドできます。



 #!/bin/bash # mikrotik-backup script # author Tenhi # Initial checks # Config file should be provided and should be readable [[ -z "$1" ]] && echo "ERR: no config file provided" && exit 1 ! [[ -r "$1" ]] && echo "ERR: cannot read $1" && exit 1 # Default variables ( may be overrided in custom config ) #### Connection #################################### TGT_PORT="22" # default ssh-port TGT_USER="bkpuser" # Default backup user IDL="5s" # Default idle time #### Backup variables ############################## BKP_BINPWD="NvLB37zchdor9Y4E8KSpxibWHATfjstnw" # Default password for binary backup 33cr BKP_EXPPWD="hGAEJKptcCznB2v8RaHkoxiSTYNFZ3suW" # Default password for export 33cr ST_RTN="30" # Default retention time #### Storage variables ############################# ST_ROOT="/mnt/bkp_share/mikrotik" # Default storage root
      
      





次は、構成ファイルのソースを作成する行です。



 ####################################################################################################################### # Importing target config where you can override options source $1 #######################################################################################################################
      
      





その後、構成ファイルとシステムユーティリティをインポートした後に設定するのが適切ないくつかの変数を含むセクションがあります。



 #### Utils ############################################################################################# CMD_FIND=$(which find) CMD_MV=$(which mv) CMD_GZ=$(which gzip) CMD_CHO=$(which chown) CMD_CHM=$(which chmod) CMD_MKD=$(which mkdir)" -p " CMD_RM=$(which rm) CMD_DATE=$(date +%Y%m%d_%H%M) # date in format YYYYMMDD_HHmm CMD_SSL=$(which openssl) CMD_SSH=$(which ssh) CMD_SCP=$(which scp) ######################################################################################################## ST_FULL=$ST_ROOT/$ST_HOSTNAME"/" # full path to .backup (/root_storage/hostname/) ST_ARCH=$ST_FULL"archive/" # full path to archive (/root_storage/hostname/archive) TGT_BKPNAME_BIN=$ST_HOSTNAME"_"$CMD_DATE".backup" TGT_BKPNAME_EXP=$ST_HOSTNAME"_"$CMD_DATE".export" SSH_OPT=" -o ConnectionAttempts=5 -o ConnectTimeout=5s \ -o PasswordAuthentication=no -o PreferredAuthentications=publickey \ -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null \ -o GlobalKnownHostsFile=/dev/null -o CheckHostIP=no " SSH_STR="$CMD_SSH -2 -4 -p $TGT_PORT -l $TGT_USER $TGT_IP $SSH_OPT" SCP_STR="$CMD_SCP -2 -4 -B $SSH_OPT -P $TGT_PORT $TGT_USER@$TGT_IP:/$TGT_BKPNAME_BIN $ST_FULL"
      
      





その後、スクリプト関数の定義、説明を以下に示します。



 #### Defining functions ################################################################################ function fn_check_log { # Function for checking need of creating logfile LOG=$ST_ROOT/"LOG.txt" # log-file location if [[ -r $LOG ]] then return 0 else echo " ################################################ # Logfile for mikrotik backups # The format is: # DATE;STATE;FILENAME # author: Tenhi(adm@tenhi.ru) ################################################ " > $LOG fi } function fn_check_readme { # Function for checking need of creating readme README=$ST_ROOT"/README.txt" # README File if [[ -r $README ]] then return 0 else echo " # === # Here you can find backups for all Mikrotiks # Files located in: # hostname/... # Archived backups are in: # hostname/archive/... # You can get backup info for all jobs in LOG.txt # === " > $README fi } function fn_check_directory { # Function for checking||creating full-path dirs if [[ -d $ST_FULL"archive" && -r $ST_FULL"archive" ]] then return 0 else $CMD_MKD $ST_FULL"archive" $CMD_CHO root:root $ST_FULL $CMD_CHM 755 $ST_FULL fi } function fn_mikrotik_cleanup { # Function for cleaning up target mikrotik $SSH_STR "ip dns cache flush" $SSH_STR "console clear-history" } function fn_mikrotik_fixtime { # Function for setting ntp client $SSH_STR "ip cloud set update-time=no; system ntp client set primary-ntp=0.0.0.0 secondary-ntp=0.0.0.0 enabled=yes server-dns-names=pool.ntp.org" } function fn_backup_binary { # Function for saving binary backup # Changed 20170901 T_BKPSTR="system backup save name=$TGT_BKPNAME_BIN dont-encrypt=no password=$BKP_BINPWD" T_BKPCLN="file remove [find name=$TGT_BKPNAME_BIN]" $SSH_STR $T_BKPSTR # Initializing backup sleep $IDL && $SCP_STR # Copy file to storage sleep $IDL && $SSH_STR $T_BKPCLN # Remove created file on mikrotik } function fn_backup_export { # Function for saving exported config # NOTE: decrypt the file # openssl des3 -d -salt -in encryptedfile.txt -out normalfile.txt EXP_TMP_FILE="/tmp/"$RANDOM".export" sleep $IDL && $SSH_STR export > $EXP_TMP_FILE $CMD_SSL des3 -salt -k $BKP_EXPPWD -in $EXP_TMP_FILE -out $ST_FULL$TGT_BKPNAME_EXP".des3" $CMD_RM $EXP_TMP_FILE } function fn_backup_retention { # Function for rotating old backups $CMD_FIND $ST_FULL -mtime +$ST_RTN -type f -exec $CMD_MV {} $ST_ARCH \; $CMD_FIND $ST_ARCH -type f -exec $CMD_GZ {} \; } function fn_log { # Function for recording results to logfile if [[ -r $ST_FULL$TGT_BKPNAME_BIN ]] then echo $CMD_DATE";okay;"$TGT_BKPNAME_BIN >> $LOG else echo $CMD_DATE";fail;"$TGT_BKPNAME_BIN >> $LOG fi if [[ -r $ST_FULL$TGT_BKPNAME_EXP".des3" ]] then echo $CMD_DATE";okay;"$TGT_BKPNAME_EXP".des3" >> $LOG else echo $CMD_DATE";fail;"$TGT_BKPNAME_EXP".des3" >> $LOG fi }
      
      





すべての機能は署名されていますが、少し説明します。 fn_check_log fn_check_readme関数は、LOG.TXTおよびREADME.TXTファイルの初期コンテンツをチェックして作成します



fn_check_directoryは、構成ファイルのST_HOSTNAME = ""ディレクティブで記述したデバイス用のディレクトリが作成されているかどうかを確認します



fn_mikrotik_cleanupは、コンソール内のDNSキャッシュとコマンド履歴をクリーンアップして、バックアップやセキュリティの目的でドラッグされないようにします。



fn_mikrotik_fixtimeは 、時刻を更新するためにntpサーバーを強制的にインストールするオプションのものです。 この機能では、継続的に実行したい場合は、必要なものを何でも作成できます。 必要がない場合は、この機能を使用することもできません。



fn_backup_binaryおよびfn_backup_exportは、それぞれバイナリバックアップおよびエクスポートバックアップを実行します。 さらに、平文ではなく、opensslを使用して暗号化されたエクスポートファイルが作成されることに注意してください。 (したがって、システムにopensslが必要です)



fn_backup_retentionは 、ST_RTN日より古いバックアップをパックします。ST_RTN日は、標準(30日)を使用しない場合に構成ファイルで指定します。 関数はそれらをアーカイブフォルダーに配置します



スクリプトの最後にあるfn_logは、バックアップステータスに関するエントリをLOG.TXTファイルに作成します



デバイス構成ファイル



構成ファイルに関して、最小構成は次のとおりです。



 # Target device address (ip or DNS) TGT_IP="nmr01.loc.lan" # Also will be used to form backupname like $ST_HOSTNAME_YYYYMMDD-HHmm.backup|export ST_HOSTNAME="loc-nmr01"
      
      





他のディレクティブ構成ファイルは詳細に説明されており、オプションです。つまり、デフォルト値があります。



 # Example config for mikrotik-backup script # author Tenhi (adm@tenhi.ru) # Required parameters are uncommented. Optional are commented # You can easly uncomment some of them to override defaults #### Connection #################################### # Target device address (ip or DNS) TGT_IP="" # Target device ssh port # TGT_PORT="22" # Target ssh user # TGT_USER="backupser" # Idle for avoiding ban (or something else) # IDL="1s" #### Backup variables ############################## # Password for binary backup ( default is in main script and there are no chance to do it without password :) ) # BKP_BINPWD="" # Password for export ( default is in main script ) # BKP_EXPPWD="" #### Storage variables ############################# # root backup location # ST_ROOT="/mnt/backup" # will be used to create dir $ST_ROOT/$ST_HOSTNAME # Also will be used to form backupname like $ST_HOSTNAME_YYYYMMDD-HHmm.backup|export ST_HOSTNAME="" # backup retention to archive files older $ST_RTN days to $ST_ROOT/$ST_HOSTNAME/archive/ # ST_RTN="30" #### Logging ####################################### # LOG default location # LOG=$ST_ROOT/$ST_HOSTNAME/"LOG.txt"
      
      





クロン



実行をいたずらしたい場合は、cronタスクの例を使用できます。

 # Mikrotik backup script mbkp # Config: MCFG="/etc/mikrotik_backup" MBKP="/usr/local/bin/mbkp" MLOG="/var/log/mikrotik_backup/log" # Tasks: 00 03 * * * $MBKP $MCFG"/xxx-core01.cfg" >>$MLOG 2>>$MLOG # XXX DC New core router node1
      
      





したがって、スケジューラでcronを使用することについてすぐに、私のソリューションをコピーして使用できますが、少し説明します。 当然、すべてのパスが存在し、ファイルが読み取り可能であり、実行するスクリプトである必要があります。 クラウンで変数を使用することは禁止されておらず、50を超えるクラウンの問題がある場合は、読みやすさがわずかに向上します。



All Articles