JunOSでの自動化:スクリプトの作成

各システム管理者の生活の中で、特定の操作の実行を自動化する必要が生じたり、たとえば、権限の一部を部下に委任しなければならない場合があります。 さらに、これを安全に行うことと、最小限に抑えるためにnakosyachitする能力をお勧めします。 NIXシステムを実行しているサーバーについて話をしているのであれば、このために設計された多数のツールがあります。 しかし、それは必ずしもそれほど幸運ではありません...



かなり簡単な作業は、ジュニアテクニカルパーソンができるだけ簡単にJunOSを実行しているルーターのブラックホールコミュニティをハングさせて削除できるようにすることです。 すべては問題ありませんが、bash + ssh + expectはあまり私には向いていませんでした。perl+ Net :: OpenSSH / Net :: SSH /など。 タスクを考える過程で、IOSでTclを思い出しました。JunOSにも同様の独自の自動化ツールがあり、エレガントで非常に強力で、私にとってはTclよりも便利です。 そして最も驚くべきこと-RuNetのGoogleは何らかの理由でそれらについて言及していませんでした。



さて、少なくとも一般教育については、「ゲームの美しさ」を評価できる量で、このギャップを埋めようとします。 そのため、JunOSには、独自のスクリプトを作成し、次のように通常のコマンドのように使用する組み込み機能があります。



 / *ブラックホールコミュニティをインストールする新しいエントリを作成します* /
 user @ junosbox> op blackhole set 10.0.0.1 


同意します。設定モードに入って手動でルートを作成し、コミュニティをルートに掛けて変更をコミットするよりもはるかに便利です。 スクリプトを使用してこれらのアクションを実行する場合に間違いを犯す可能性ははるかに低くなります。 さらに、スクリプトで必要なすべてのチェックを実行して、オペレーターが余分な操作を実行しないようにすることができます。



この機能はJunOS Automation Tool Kitによって提供されます。これにより、JunOSの標準コンポーネントであるJunOSの組み込みXML機能を使用でき、JunOSを実行しているすべてのデバイスに存在できます。 この主なツールはXSLTスクリプト言語です。 そして、これは悪いニュースであるように思えます-もちろん、それを書くことはBrainfuckよりも便利ですが、それでもいくらか独特です。 しかし、良いニュースがあります。管理者の生活を簡素化するために、ジュニパーネットワークスのスタッフもSLAXサポートを実装しました。 バージョン11より前のJunOSでは、新しいバージョン1.1ではSLAX 1.0がサポートされています。 ドキュメンテーションは、その構文がperlにやや似ていることを述べています。 この声明は私には多少議論の余地があるように思えますが、間違いなく、ある程度の類似性があるため、この点はドキュメントの著者の良心に任せます。



JunOSには、いくつかのクラスのスクリプトがあります。





明らかに、最も人気のあるものはopスクリプトですが、他のものも使用できます。



システムにスクリプトをインストールするには、スクリプトを/ var / db / scriptsディレクトリの適切なサブディレクトリにコピーしてから、 edit system scripts type file filenameコマンドを実行してアクティブにする必要があります。 スクリプトをアクティブにした後、操作モードでユーザーに許可されている他のコマンドのように呼び出すことができます: op filename arguments 。 「?」を押して、アクティブ化されたCLIスクリプトの有効なパラメーターを選択すると便利です。 組み込みのシステムコマンドとまったく同じです。 想定される場合、ヘルプは同じように表示されます:



  user @ junosbox> opブラックホール?
可能な補完:
   <[Enter]>このコマンドを実行します
   <name>引数名
   detail詳細な出力を表示します
   IPアドレスのブラックホールコミュニティを設定します
   | コマンドをパイプする 


もちろん、ユーザーを設定し、スクリプトを実行するために必要な権限をユーザーに付与することは、管理者のタスクです。 しかし、彼女はちょうどよく、十分に文書化されており、誰もが少なくとも一度はそれを知っています。



そのため、ここまではすべてが非常に単純なようです。 ニュアンスは、スクリプトの作成から始まります。ドキュメントの例は、組み込みのコマンドによってそれほど便利に実行されないものを実装するため、いくぶん役に立ちません。 したがって、ドキュメントの作成者が十分に注意を払っていないいくつかの点に注意を引くことができますが、実際には重要です。



  1. JunOSはXMLであることを忘れないでください。 スクリプトを作成するときに最も必要なコマンドはshow configuration ...です。 xmlを表示します 。 これは、新しい構成を構築したり、既存の構成を変更したりするために使用するテンプレートとパラメーターを理解する唯一の方法です。
  2. ドキュメントは常に正しいとは限りません。 したがって、たとえば、SLAX 1.0という名前が付けられています。 JunOSは、<func:function>を使用して実際に関数を宣言しませんでした。これは、インタープリターがその中の「var」、「param」などへのすべての参照を誓ったためです。 同時に、カスタムテンプレートを使用しても同様の結果が得られましたが、ジュニパーネットワークスのドキュメントには何も書かれていません(例を参照)。
  3. 関数では、引数の順序が重要です。 テンプレートでは重要ではありません-ここではその名前が重要です(もう一度例を参照)。
  4. XSLTおよびSLAXでは、変数の再利用は非常に悪いです。変数の値は、一度割り当てられると、一般的なケースでは変更できません。 理論的には、変数の宣言にvarの代わりにmvar(mutable var)を使用してこの問題に対処していますが、状況によっては動作が奇妙になります(割り当てられた値が失われます)。 したがって、ドキュメントには多くの変数があると記載されているため、これは正常であり、この微妙な構文に注意するだけの価値があり、おそらくそれを行う価値があります。


さて、最後に:



例-op / blackhole.slax
バージョン1.0;

 ns junos = "http://xml.juniper.net/junos/*/junos";
 ns xnm = "http://xml.juniper.net/xnm/1.1/xnm";
 ns jcs = "http://xml.juniper.net/junos/commit-scripts/1.0";
 ns ext = "http://xmlsoft.org/XSLT/namespace";
 import "../import/junos.xsl";

 var $ arguments = {
   <引数> {
     <name> "set";
     <description>「IPアドレスのブラックホールコミュニティを設定」;
   }
 }
 param $ set;

マッチ/ {
   <op-script-results> {
     var $ instance = "INSTANCE";
     var $ community = "65535:666";
     if($ set){
       var $ addr = jcs:parse-ip($ set);
       var $ ip = $ addr [1] _ "/ 32";
       var $ connection = jcs:open();
       call set_community($接続、$ ip、$インスタンス、$コミュニティ);
       var $ close-results = jcs:close($ connection);
       if($ close-results){expr jcs:output($ close-results);  }
     }
    その他{
       call_community($コミュニティ);
     }
   }
 }

テンプレートset_community($接続、$ ip、$インスタンス、$コミュニティ){
   var $ configuration = <configuration> {
     <ルーティングインスタンス> {
       <インスタンス> {
         <name> $インスタンス;
         <ルーティングオプション> {
           <static> {
             <ルート> {
               <名前> $ ip;
               <破棄>;
               <community> {<name> $コミュニティ;  }
             }
           }
         }
       }
     }
   }
   var $ commit-options:= {<commit-options> {<log> "setting for blackhole community for" _ $ ip;  }}
   var $ results:= {call jcs:load-configuration($ connection、$ configuration、$ commit-options);  }
   $の結果のコピー;
 }

テンプレートshow_community($コミュニティ){
   var $ command = {<command> "show route community" _ $ community;  }
   var $ results = jcs:invoke($コマンド);
   $の結果のコピー;
 }


参照:






All Articles