設定ファイルの読み込み
デバイス上の設定ファイルの読み込みは、ネットワーク内の多くのデバイスに共通する設定ファイルの部分を読み込むのに役立ちます。
ファイルやターミナルから設定を読み込む場合の例
ジュニパー・ネットワークス・デバイスの設定データを含むファイルを作成し、そのファイルをローカル・デバイスにコピーすれば、そのファイルを CLI に読み込むことができます。ファイルを読み込んだ後、それをコミットしてデバイス上で設定を有効にするか、CLIを使用して設定を対話的に編集し、後にその設定をコミットすることができます。
また、ターミナルで入力しながらコンフィギュレーションを作成し、そのコンフィギュレーションを読み込むことも可能です。ターミナルからコンフィギュレーションを読み込むと、コンフィギュレーションの既存の部分を切り取って、別の場所に貼り付ける場合に便利です。
デバイスに配置されている既存のコンフィギュレーション・ファイルを読み込むには、コンフィギュレーload
ション・モード・コマンドを使用します:
[edit] user@host# load (factory-default | merge | override | patch | replace | set | update) filename <relative> <json>
ターミナルからコンフィグレーションを読み込むには、次のバージョンのコンフィギュload
レーション・モード・コマンドを使用します。Ctrl-dを押すと入力が終了します。
[edit] user@host# load (factory-default | merge | override | patch | replace | set | update) terminal <relative> <json>
コンフィギュレーション全体を置き換えるには、任意の階層でoverride
オプションを指定します。load override
という操作は、現在の候補コンフィギュレーションを読み込んでいるファイルに完全に置き換えます。したがって、完全なコンフィギュレーションを保存した場合は、このオプションを使用します。
override
というオペレーションは、現在の候補コンフィギュレーションを破棄し、そのコンフィギュレーションfilename または端末で入力したコンフィギュレーションを読み込みます。この override
というオプションを使用して設定をコミットすると、すべてのシステム・プロセスが設定を再解析します。
コンフィギュレーションの一部を置き換えるには、replace
というオプションを指定します。このload replace
という操作は、読み込んだファイルに追加したreplace:
というタグを探します。そして、この操作は、タグの後に指定されたもので、候補となるコンフィギュレーションのこれらの部分を置き換えます。これは、変更される内容をより正確に制御したい場合に有効です。この操作を行うには、端末で入力するファイルや設定にreplace:
というタグを含める必要があります。ソフトウェアは、というタreplace:
グを検索します。同じ名前の既存のステートメントがあれば削除し、受信した設定と置き換えます。同じ名前のステートメントが存在しない場合、このreplace
という操作は、replace:
というタグでマークされたステートメントをコンフィギュレーションに追加します。
override
またはのmerge
操作で、タreplace:
グを含むファイルやタイプテキストを指定した場合、タreplace:
グは無視されます。このシナリオの場合、override
またはmerge
の操作が優先され、実行されます。
replace
という操作を行う場合、merge
指定したファイルにタreplace:
グがない場合は、replace
操作として実行されます。また、入力したテキストにreplace:
というタグがない場合は、replace
という操作もmerge
という操作として実行されます。この情報は、自動化されたスクリプトを実行していて、スクリプトがmerge
という操作あるいはreplace
という操作のどちらを実行する必要があるかを事前に知ることができない場合に便利かもしれません。スクリプトはどちらの場合にも対応できるようなreplace
という操作を行うことができます。
このload merge
という操作は、保存されたファイルまたは端末のコンフィギュレーションを既存の候補コンフィギュレーションにマージするものです。この情報は、新しいコンフィギュレーション・セクションを追加する場合に便利です。例えば、これまでBGPのコンフィギュレーションがなかった階[edit protocols]
層レベルにBGPのコンフィギュレーションを追加する場合を考えてみましょう。このload merge
という操作を利用して、受信したコンフィギュレーションを既存の候補コンフィギュレーションと結合することができます。既存のコンフィギュレーションと受信コンフィギュレーションに矛盾するステートメントがある場合、受信コンフィギュレーションのステートメントが既存のコンフィギュレーションのステートメントを上書きします。
コンフィギュレーションの変更があった部分のみを置き換えるには、任意の階層でupdate
オプションを指定します。このというload update
操作は、候補コンフィギュレーションと新しいコンフィギュレーションのデータを比較します。この操作は、候補となるコンフィギュレーションのうち、新しいコンフィギュレーションと異なる部分のみを変更します。この操作は、例えば、既存のBGPのコンフィギュレーションがあり、読み込むファイルが何らかの形でそれを変更する場合に使用されます。
override
、update
、およびmerge
というオプションは、JavaScript Object Notation (JSON) 形式のコンフィギュレーション・データの読み込みに対応しています。JSON形式を使用してコンフィギュレーション・データを読み込む場合、コマンドでjson
というオプションを指定する必要があります。順序指定されていないリストエントリ、つまり、リストキーが必ずしもリストエントリの最初の要素ではない場合のリストエントリが含まれるJSON設定データを読み込むには、順序指定されていないリストエントリでJSON設定データを読み込むを参照してください。
パッチ・ファイルでコンフィギュレーションの一部を変更する場合は、patch
というオプションを指定します。このload patch
という操作は、コンフィギュレーションの変更を含むファイルまたは端末入力を読み込みます。まず、すでにコンフィギュレーションが変更されているデバイスにおいて、2つのコンフィギュレーションの差分を出力するというコマshow | compare
ンドを入力します。そして、その差分を別のデバイスで読み込むことができます。このload patch
というコマンドの利点は、ターゲット・デバイスに読み込む前に、異なる階層レベルのスニペットをテキスト・ファイルにコピーする手間を省くことができる点です。これは、複数のデバイスを同じオプションで設定する場合に、時間を節約するのに有効かもしれません。例えば、ルータ1でルーティング・ポリシーを設定し、ルータ2、ルータ3、およびルータ4にポリシーのコンフィギュレーションを複製する場合を考えます。load patch
という操作が可能です。
この例では、まず、show | compare
というコマンドを実行します。
例:
user@router1# show | compare rollback 3 [edit protocols ospf] + export default-static; - export static-default [edit policy-options] + policy-statement default-static { + from protocol static; + then accept; + }
この例に引き続き、show | compare
コマンドの出力をクリップボードにコピーし、階層レベルを含むことを確認します。ルータ2、ルータ3、およびルータ4では、load patch terminal
を入力し、出力を貼り付けます。その後、Enterキーを押し、Ctrl-dキーを押して操作を終了します。パッチ入力で既存のステートメントと異なる値が指定された場合、パッチ入力は既存のステートメントを上書きします。
完全な階層レベルを指定せず、replace
、set
、update
、またはmerge
というオプションを使用する場合は、relative
というオプションを指定します。このオプションは、コンフィギュレーション階層内の現在の編集ポイントから相対的に受信したコンフィギュレーションを読み込みます。
例:
[edit system]
user@host# show static-host-mapping
bob sysid 987.654.321ab
[edit system]
user@host# load replace terminal relative
[Type ^D at a new line to end input]
replace: static-host-mapping {
bob sysid 0123.456.789bc;
}
load complete
[edit system]
user@host# show static-host-mapping
bob sysid 0123.456.789bc;
set
というコンフィギュレーション・モード・コマンドを含むコンフィギュレーションを読み込むには、set
というオプションを指定します。このオプションは、ファイルまたはターミナルから保存されたコンフィギュレーション・インストラクションを一行ずつ実行します。インストラクションには、 set
、edit
、exit
、およびtop
といった任意のコンフィギュレーション・モード・コマンドを含めることができます。
他のネットワーク・システムからローカル・ルータにコンフィギュレーション・ファイルをコピーするには、CLI Explorerで説明されているように、SSHとTelnetユーティリティを使用できます。
Common Criteria環境で作業している場合、という属secret
性が変更されるたびに(例えば、パスワードの変更やRADIUS共有シークレットの変更など)システム・ログ・メッセージが作成されます。これらの変更は、以下のコンフィギュレーションの読み込み操作時においてログに記録されます:
load merge load replace load override load update
ジュニパーネットワークスのデバイスでの文字エンコードの仕組み
Junos OSの設定データや運用コマンドの出力には、7 ビットの ASCII 文字セットの範囲外である非 ASCII 文字が含まれている場合があります。操作データや設定データを特定の形式で表示する場合や、特定のセッション内で表示する場合、ソフトウェアはこれらの文字をエスケープおよびエンコードします。このソフトウェアは、同等の UTF-8 10 進文字参照を使用して、文字をエスケープまたはエンコードします。
CLI は、テキスト、セット、または JSON 形式で作成された設定データ内の非 ASCII 文字を表示しようとします。また、CLI は、テキスト形式で作成されるコマンド出力に、これらの文字を表示しようとします。例外的なケースでは、CLI は代わりに UTF-8 10 進文字参照を表示します。(例外として、XML 形式の設定データおよび XML または JSON 形式のコマンド出力があります)NETCONF および Junos XML プロトコルのセッションで、非 ASCII 文字を含む設定データやコマンド出力を要求すると、同様の結果になります。この場合、サーバーはすべての形式について、それらの文字に相当する UTF-8 10 進文字参照を返します。
例えば、ラテン語の小文字「n」にチルダ(ñ)を加えた以下のようなユーザーアカウントがデバイスに設定されているとします。
[edit] user@host# set system login user mariap class super-user uid 2007 full-name "Maria Peña"
結果の設定をテキスト形式で表示すると、CLI は対応する文字を印刷します。
[edit] user@host# show system login user mariap full-name "Maria Peña"; uid 2007; class super-user;
ñ
結果の設定を CLI で XML 形式で表示すると、ñ 文字は同等の UTF-8 10進文字参照にマッピングされます。NETCONF や Junos XML プロトコルのセッションで、任意の形式で設定を表示しても同じ結果になります。
[edit] user@host# show system login user mariap | display xml <rpc-reply xmlns:junos="http://xml.juniper.net/junos/17.2R1/junos"> <configuration junos:changed-seconds="1494033077" junos:changed-localtime="2017-05-05 18:11:17 PDT"> <system> <login> <user> <name>mariap</name> <full-name>Maria Peña</full-name> <uid>2007</uid> <class>super-user</class> </user> </login> </system> </configuration> <cli> <banner>[edit]</banner> </cli> </rpc-reply>
設定データをデバイスにロードする際に、同等の UTF-8 10 進文字参照を使って、非 ASCII 文字をロードすることができます。
ステートメントと識別子の指定について
このトピックでは、CLIのコンテナー・ステートメントとリーフ・ステートメントについて詳しく説明し、ASCIIコンフィギュレーション・ファイルを作成する際にどのように指定しなければならないかを説明します。このトピックでは、入力したデータが正しい形式であることを確認するために、CLIがどのようにタイプ・チェックを行うかについても説明します。
ステートメントの指定
ステートメントは、中括弧({ })で囲むか、囲まないかの2通りの方法で表示されます:
-
ステートメント名と識別子、および中括弧で囲まれた1つまたは複数の下位レベルのステートメント:
statement-name1 identifier-name { statement-name2; additional-statements; }
-
ステートメント名、識別子、および単一の識別子:
statement-name identifier-name1 identifier-name2;
statement-nameはステートメントの名前です。identifier-nameは、ステートメントのインスタンスを一意に識別するための名前またはその他の文字列です。識別子は、コンフィギュレーションで複数回指定できるステートメントに使用します。
ステートメントを指定する場合、ステートメント階層によって、ステートメント名、識別子名、またはその両方を指定する必要があります。
識別子を指定する方法は、次のいずれかです:
-
identifier-name—identifier-nameはステートメント内でステートメントを複数回指定できる場合にステートメントを一意に識別するために使用されるキーワードです。
-
identifier-name value—identifier-nameはキーワードであり、valueは必須オプション変数です。
-
identifier-name [value1 value2 value3
...]
—identifier-nameは複数の値を受け入れるキーワードです。括弧は、一連の値を指定する場合には必要です;しかしながら、1つの値のみを指定する場合には省略可能となります。
次の例は、コンフィギュレーションでステートメントと識別子がどのように指定されるかを示しています:
protocol { # Top-level statement (statement-name). ospf { # Statement under "protocol" (statement-name). area 0.0.0.0 { # OSPF area "0.0.0.0" (statement-name identifier-name), interface so-0/0/0 { # which contains an interface named "so-0/0/0." hello-interval 25; # Identifier and value (identifier-name value). priority 2; # Identifier and value (identifier-name value). disable; # Flag identifier (identifier-name). } interface so-0/0/1; # Another instance of "interface," named so-0/0/1, } # this instance contains no data, so no braces } # are displayed. } policy-options { # Top-level statement (statement-name). term term1 { # Statement under "policy-options" # (statement-name value). from { # Statement under "term" (statement-name). route-filter 10.0.0.0/8 orlonger reject; # One identifier ("route-filter") with route-filter 127.0.0.0/8 orlonger reject; # multiple values. route-filter 128.0.0.0/16 orlonger reject; route-filter 149.20.64.0/24 orlonger reject; route-filter 172.16.0.0/12 orlonger reject; route-filter 191.255.0.0/16 orlonger reject; } then { # Statement under "term" (statement-name). next term; # Identifier (identifier-name). } } }
ASCIIのコンフィギュレーション・ファイルを作成する際には、ステートメントと識別子を指定します。各ステートメントには優先されたスタイルがあり、CLIはコンフィギュレーション・モードというコマshow
ンドに応答してコンフィギュレーションを表示する際に、そのスタイルを使用します。ステートメントと識別子の指定方法は、次のいずれかです:
-
ステートメントに続いて、識別子が表示されます:
statement-name identifier-name [...] identifier-name value [...];
-
ステートメントの後に中括弧で囲まれた識別子が続きます:
statement-name { identifier-name; [...] identifier-name value; [...] }
-
繰り返しのある識別子の場合、すべてのステートメントに一組の中括弧を使用することができます:
statement-name { identifier-name value1; identifier-name value2; }
CLIタイプ・チェックの実行
識別子と値を指定すると、CLIは入力されたデータが正しい形式であることを確認するために、タイプ・チェックを行います。例えば、IPアドレスを指定する必要があるステートメントでは、CLIは有効なフォーマットにおいてアドレスを入力することを要求します。そうでない場合は、エラー・メッセージで何を入力する必要があるかが示されます。CLIがチェックするデータ・タイプを一覧にします。CLIのコンフィギュレーション入力のタイプを以下に示します:
データ・タイプ |
フォーマット |
例 |
---|---|---|
物理インターフェイス名([ |
|
Correct: Incorrect: |
フル・インターフェース名 |
|
Correct: Incorrect: |
完全または短縮されたインターフェース名([ |
|
Correct: |
IPアドレス |
|
Correct: Sample translations:
|
IPアドレス(宛先プレフィックス)およびプレフィックス長 |
|
Correct: Sample translations:
|
国際標準化機構(ISO)のアドレス |
|
Correct: Sample translations:
|
OSPFエリア識別子(ID) |
|
Correct: Sample translations:
|
ファイルからのコンフィグレーションの読み込みについて
次の例は、ファイルから設定を読み込むプロセスを示しています。
コンフィギュレーション・ファイルのアップロード
ローカル・システムでコンフィギュレーション・ファイルを作成し、そのファイルをデバイスにコピーしてから、CLIに読み込ませることができます。コンフィギュレーション・ファイルの読み込みが完了したら、コミットしてデバイス上でコンフィギュレーションを有効にすることができます。また、CLIを使用して対話的にコンフィギュレーションを編集し、後でコミットすることも可能です。
ローカル・システムからコンフィギュレーション・ファイルをアップロードするには:
コンフィギュレーションをコミットする前に、コンフィギュレーション・ステップの結果を表示するには、ユーザー・プロンプトでshow
というコマンドを入力します。
これらの変更をアクティブなコンフィギュレーションにコミットするには、ユーザー・プロンプトでcommit
というコマンドを入力します。また、CLIを使用して対話的にコンフィギュレーションを編集し、後でコミットすることも可能です。
順序指定されていないリストエントリでJSON設定データを読み込む
Junosスキーマはリストとして特定の構成オブジェクトを定義します。JSON設定データでは、リストインスタンスは、名前および配列ペアとしてエンコードされ、配列要素はJSONオブジェクトです。通常、JSONエンコードリストエントリーのメンバーの順序は任意です。これはJSONオブジェクトが基本的に順序指定のないメンバーの集合体だからです。しかし、Junosスキーマでは、リストキーがリストエントリ内で他の兄弟の前にあり、スキーマで指定されている順序で表示される必要があります。
例えば、[edit system login]
階層レベルのuser
オブジェクトは、name
が各ユーザーを一意に識別するリストキーであるリストです。
list user { key name; description "Username"; uses login-user-object; }
次のサンプル設定データでは、リストキー(name
)は各ユーザーの最初の要素です。デフォルトでは、JSON設定データを読み込む際、Junosデバイスはリストキーがリストエントリー内で他の兄弟の前にあり、スキーマで指定された順序で表示される必要があります。
{ "configuration" : { "system" : { "login" : { "user" : [ { "name" : "operator", "class" : "operator", "uid" : 3001 }, { "name" : "security-admin", "class" : "super-user", "uid" : 3002 } ] } } } }
Junosデバイスでは、順序指定のないリストエントリ、つまりリストキーが必ずしも最初の要素でないリストエントリーを含む、JSON設定データを読み込むのに2つのオプションを提供しています。
-
request system convert-json-configuration
操作モードコマンドを使用し、デバイスにデータを読み込む前に、順序指定リストエントリーでJSON設定データを生成します。 -
[edit system configuration input format json]
階層レベルでreorder-list-keys
のステートメントを設定します。ステートメントを設定後、順序指定のないリストエントリでJSON設定データを読み込むことができます。デバイスは読み込み操作中にJunosスキーマで要求されるようにリストキーの順序指定を再度行います。
reorder-list-keys
ステートメントを設定する際、設定サイズおよびリストの数によって読み込み操作が設定を解析するのにかなり多くの時間がかかる場合があります。このように、大きな設定や多くのリストのある設定を行う場合には、reorder-list-keys
ステートメントではなく、request system convert-json-configuration
コマンドを使用することを推奨します。
例えば、user-data.json
ファイルが次のJSON設定を含んでいると考えてください。設定を読み込もうとすると、リストキーname
がそのリストエントリの最初の要素ではないため、デバイスはadmin2
の読み込みエラーを生成します。
user@host> file show /var/tmp/user-data.json { "configuration" : { "system" : { "login" : { "user" : [ { "name" : "admin1", "class" : "super-user", "uid" : 3003 }, { "class" : "super-user", "name" : "admin2", "uid" : 3004 } ] } } } }
入力に前のファイルでrequest system convert-json-configuration
コマンドを使用する場合、コマンドはJunosデバイスが読み込み操作中に解析可能なJSON設定データで指定された出力ファイルを生成します。
user@host> request system convert-json-configuration /var/tmp/user-data.json output-filename user-data-ordered.json user@host> file show user-data-ordered.json { "configuration":{ "system":{ "login":{ "user":[ { "name":"admin1", "class":"super-user", "uid":3003 }, { "name":"admin2", "class":"super-user", "uid":3004 } ] } } } }
あるいは、reorder-list-keys
構成ステートメントを設定することもできます。
user@host# set system configuration input format json reorder-list-keys user@host# commit
ステートメントを設定後、順序指定のないリストエントリで元のJSON設定ファイルを読み込むことが可能です。この場合、設定を解析する際にデバイスがリストエントリを処理します。
user@host# load merge json /var/tmp/user-data.json load complete