スイッチの構成をバックアップするか、GLPIに少し自動化を固定します

時々、私たちの仕事では、タイプ、モデル、アドレス、ファームウェア、配線図など、すべてのネットワーク機器を考慮する必要があります。 したがって、いくつかのソフトウェアオプションを検討した結果、選択はGLPIオープンソースプロジェクトに委ねられました。 システムの機能は豊富で、特にこのケースでは、ハードウェアを考慮し、最も重要なのは接続スキーム(どのスイッチのポートが接続されているか)を考慮するために使用されました。 組織の主な活動(インターネットへのアクセスを提供する)のフレームワークでは、スイッチの構成をバックアップする必要性が発生しました(もちろん突然ではありませんが、厳密に計画どおりです)。 そして、GLPIと組み合わせてこれを実装する方法は、この記事になります。



計画を実施するには、機器の住所のリストとメーカーのリストが必要です。もちろん、以前に入力した場合、これらのデータはすべてGLPIデータベースにあります。 ネットワーク接続にはIPアドレスが必要ですが、なぜメーカーを知る必要があるのですか? 事実、ネットワーク機器の各メーカーは、さまざまな理由で、そこに独自の「オリジナル」のアイデアをもたらしているため、腺を管理するチームは異なります。 特定のケースでは、メーカーは2社しかありませんが、リストの拡大を妨げるものは何もありません。

telnet接続を介して構成コピー操作を実行します。これはSNMPを介して実行できますが、この場合、書き込み(コマンド実行)のSNMPはすべてのハードウェアで閉じられます。



実装言語はPERLを選択しました。 なぜそうですか? まあ、そのとき、私はその上で、さらにいくつかのソフトウェア(RDRアセンブラーとパーサー、Webフェイス)を見ていました。したがって、真珠を見ました。 OSはGNU / Linuxです。



コードに取りかかりましょう:



必要なモジュールを接続します:



#!/usr/bin/perl use Net::Telnet (); use IO::File; use Getopt::Long; use DBI;
      
      





スペースを削除するための関数は独立して実装されています。その理由と理由は、もはや覚えていませんが、次のとおりです。



 #     sub trim { my($string)=@_; for ($string) { s/^\s+//; s/\s+$//; } return $string; }
      
      





2回起きないように、スクリプトは古いファイルのアーカイブ、コピー、削除を並行して実行します。 可能であれば、システムコマンドが使用されます。



 #   $date = `/bin/date "+%Y%m%d"`; $date = trim($date); $arch = "tar -czvf /var/srv/backup/conf/conf-".$date.".tgz /var/lib/tftpboot/"; my $result = `$arch`; #      $del = '/bin/find /var/srv/backup/conf/ -ctime +7 -name conf-*.tgz -exec rm {} \; -print > /var/log/switch-conf_backup.log'; my $delResult = `$del`;
      
      





データベースに接続します。



 #   GLPI  my $dsn = 'DBI:mysql:glpi:192.168.123.222'; my $db_user_name = 'user'; my $db_password = 'password'; my ($id, $password); my $dbh = DBI->connect($dsn, $db_user_name, $db_password);
      
      





希望するメーカーのスイッチの必要なアドレスを選択し、それに応じて、必要な手順を「プル」します(以下で説明します)。



 my $sth = $dbh->prepare(qq{SELECT ip FROM glpi_networkequipments WHERE manufacturers_id=1 AND states_id=1}); $sth->execute(); while (my ($ip) = $sth->fetchrow_array()) { # print "$ip\n"; if ($ip eq "" || $ip =~ /^#+/) { #   .  ,  :) } else { #    connectSwitchEdgeCore("$ip"); } } $sth->finish(); #   D-Link   "" my $sth = $dbh->prepare(qq{SELECT ip FROM glpi_networkequipments WHERE manufacturers_id=3 AND states_id=1}); $sth->execute(); while (my ($ip) = $sth->fetchrow_array()) { if ($ip eq "" || $ip =~ /^#+/) { } else { connectSwitchDlink("$ip"); } } $sth->finish(); $dbh->disconnect();
      
      





manufacturer_idstates_idの値(最初はメーカーのコード、2番目は機器の状態(「運用中」、「プロジェクト内」など))が変化する可能性があり、ほとんどの場合、変化することは注目に値します データベースに位置を追加するときに自動的に作成されます。 この場合、製造元「1」はEdgeCore(「3」-D-Link)であり、ステータス「1」は「有効」です。 稼働させます。 ステータス追跡は、さまざまな理由で鉄片と非アクティブに接続しようとする試みを除外するために必要です。



次に、「現在の構成をtftpサーバーにコピーする」というトピックのスクリプトとスイッチ間のダイアログを実装する、ほぼ同一の2つの手順があります。



 # telnet-        tftp  #     EdgeCore sub connectSwitchEdgeCore { $hostname = "$_[0]"; $username = "user"; $passwd = "password"; $date = `/bin/date "+%Y%m%d"`; $str_fn=$hostname; print $str_fn; $tftpserver="20.20.20.20"; $conn = new Net::Telnet ( Timeout=>3, Errmode=>'return', Prompt => '/\#.?$/i'); $conn->open(Host => $hostname); $conn->waitfor('/ame[: ]*$/'); $conn->print($username); $conn->waitfor('/ord[: ]*$/'); $conn->print($passwd); $conn->print("copy running-config tftp"); $conn->waitfor('/ess[: ]*$/'); $conn->print($tftpserver); $conn->waitfor('/ame[: ]*$/'); $conn->print($str_fn); $conn->print("exit"); $conn->print("logout"); } #     D-Link sub connectSwitchDlink { $hostname = "$_[0]"; $username = "user"; $passwd = "password"; $date = `/bin/date "+%Y%m%d"`; $str_fn=$hostname; print "$str_fn\n"; $tftpserver="20.20.20.20"; $conn = new Net::Telnet ( Timeout=>3, Errmode=>'return', Prompt => '/\#.?$/i'); $conn->open(Host => $hostname); $conn->waitfor('/ame[: ]*$/'); $conn->print($username); $conn->waitfor('/ord[: ]*$/'); $conn->print($passwd); $conn->print("upload cfg_toTFTP $tftpserver dest_file $hostname"); $conn->waitfor('/Success/'); $conn->print("logout"); }
      
      





サーバーのアドレスとデータベースに接続するためのパラメーターを別のファイルに入れる方が論理的でしたが、その時の天体の位置のために、そのように残されていました。 印刷コマンドはログへの出力用に残されます。 スクリプトは、cron時間ごとに起動されます。



これが、いかにシンプルで簡単なルーチン操作が自動化されたかです。 従来、ソースコードはこちらから入手できます



PS「管理」と「開発」の間を振り返って、どのスレッドで記事を投稿するかを考え、最終的に最初の選択肢に決着をつけました。



All Articles