ネットワーク自動化とは ― REST APIとJSON入門
ネットワーク
ネットワーク自動化とは、プログラムに設定作業を任せること
ネットワーク自動化とは、担当者がコマンド画面(CLI)で1台ずつ行っていた設定・確認の作業を、プログラムがAPIやSSHで機器に実行させることです。自動化によく使う手段が、REST API・JSON・構成管理ツールです。
機器が数十台、数百台と増えると、1台ずつの手作業では時間がかかり、設定の誤りも増えます。プログラムに任せれば、同じ設定を全台に同じ手順で入れられます。
自動化の対象は、ネットワーク機器のCLIだけではありません。SDNの記事で説明したコントローラも、自動化ツールがノースバウンドAPIで操作します。REST APIで使うHTTPメソッドの基本は、HTTPとHTTPSの記事で説明しています。
従来型とコントローラ型・自動化で、操作の経路がどう変わるか
従来型の運用では、担当者が機器1台ごとにSSHでログインし、CLIで設定を入力します。機器が増えるほど、同じような入力を繰り返す回数も増えます。入力する人や日によって、細かい書き方が違ってくることもあります。
コントローラ型・自動化の運用では、担当者はAPIを使ってコントローラや自動化ツールに1回だけ指示を出します。各機器への配布は、コントローラや自動化ツールが受け持ちます。同じ指示を複数台へ同じ手順で適用できるので、人によるばらつきを減らせます。
図の自動化ツールの位置には、SDNの記事で説明したSDNコントローラが入ることもあります。拠点の機器をコントローラからまとめて設定する例には、SD-WANもあります。一方、コントローラを置かず、自動化ツールが機器のAPIやSSHへ直接指示する構成もあります。
REST APIの特徴:CRUD操作とHTTPメソッドの対応
REST APIとは、HTTPメソッドとURIを使って、サーバ側のデータや設定を操作する仕組みです。ネットワーク機器やコントローラの多くは、このREST APIで外部からの操作を受け付けます。APIという言葉の意味や、複数のWeb APIを組み合わせるマッシュアップは、APIの記事にまとめています。
データの基本的な操作である作成・読み取り・更新・削除を、英語の頭文字をとってCRUD(Create・Read・Update・Delete)と呼びます。REST APIでは、この4つの操作にHTTPメソッドを対応させます。
| HTTPメソッド | 対応する | 機器の |
|---|---|---|
| GET | Read(読み取り) | インターフェースの一覧や状態を取得する |
| POST | Create(作成) | 新しいVLANなど、新しい設定を作る |
| PUT | Update(更新) | 既存の設定を、丸ごと新しい内容に置き換える |
| PATCH | Update(更新) | 既存の設定の一部だけを書き換える |
| DELETE | Delete(削除) | 不要になったVLANなどの設定を消す |
更新に使うメソッドは2つあります。PUTは設定全体を置き換え、PATCHは一部だけを書き換えます。
どのメソッドでも、操作したい対象はURIで指定します。Webページの読み込みで使うGETやPOSTと同じメソッドですが、ここでは機器の設定そのものが操作の対象になります。
設定を作ったり変えたりするリクエストでは、変更したい内容をJSONの本文として添えます。レスポンスには、処理の成否を示すステータスコードと、結果を示すJSONの本文が入ります。200番台のステータスコードは成功、400番台はリクエスト側の誤り、500番台はサーバ側の処理の失敗を表します。
REST APIには誰でもアクセスできるわけではありません。APIキー・トークン・IDとパスワードなどの認証で、正しい相手からの要求かを確かめます。パスワードを渡さずに、範囲と期限を決めた権限をアプリに渡すトークンの仕組みは、OAuthの記事で説明しています。データの形式には、次に説明するJSONのほか、XMLを使うこともあります。
REST APIのサーバは、前に受けたリクエストの内容を記憶しません。そのため、クライアントは認証の情報などをリクエストのたびに送ります。この性質をステートレスと呼びます。
JSONの読み方:キーと値、配列、入れ子
JSONとは、キーと値の組でデータを表す記述形式です。JavaScript Object Notationの略で、仕様はRFC 8259にまとまっています。REST APIの本文によく使われます。
次の例は、機器のポート(インターフェース)の設定を表すJSONです。行をクリックすると、その行の説明が開きます。
インターフェースの設定を表すJSON
このJSONは、波かっこで始まるオブジェクトです。オブジェクトの中には、キーと値の組が並びます。RFC 8259では、波かっこで囲むこの形をobjectと呼びます。
キーはinterface、値はGigabitEthernet0/1という文字列です。文字列は二重引用符で囲みます。キーは必ず文字列なので、キーにも二重引用符が付きます。
trueやfalseは、真偽値を表します。文字列と違い、引用符は付けません。小文字で書く決まりで、TrueやTRUEは使えません。
値が数値のときも引用符は付けません。文字列の"20"とは別の値として扱われます。
角かっこで囲むと配列になります。配列は、複数の値を順序付きで並べたものです。この例では要素が1つだけですが、カンマで区切れば増やせます。
値にはオブジェクトも使えるので、キーと値の組を入れ子にできます。この行から、入れ子のオブジェクトが始まります。
入れ子のオブジェクトの中にも、同じようにキーと値の組が並びます。ここでは、管理者が有効にしたかどうかを示すadminというキーの値が、文字列upです。組の間をカンマで区切る規則は、入れ子の中でも同じです。
オブジェクトの最後の組にはカンマを付けません。最後の組の後ろにカンマを残すと、JSONとして正しくない書き方になります。
入れ子のオブジェクトを閉じる波かっこです。
全体のオブジェクトを閉じる波かっこです。対応する開きかっこは、1行目にあります。閉じかっこの後には、何も続きません。
行をクリックすると、その行の意味が開きます。
JSONの値には、文字列・数値・真偽値・配列・オブジェクト・nullの6種類があります。このうち配列とオブジェクトは、中にさらに値を入れられます。RFC 8259は入れ子の深さの上限を定めていませんが、受け取る側のプログラムが上限を設けることは認めています。
同じ内容を、XMLという別の記述形式で書くと、次のようになります。
<interface>
<name>GigabitEthernet0/1</name>
<enabled>true</enabled>
<vlan>20</vlan>
<ip_addresses>
<ip_address>192.168.10.1</ip_address>
</ip_addresses>
<status>
<admin>up</admin>
<oper>up</oper>
</status>
</interface>XMLでは、値を開始タグと終了タグで囲みます。配列にあたる部分は、ip_addressタグを要素の数だけ繰り返します。JSONは波かっこ・角かっこ・引用符といった短い記号で同じ構造を表すので、この例のように同じデータでも文字数が少なくなります。
構成管理ツールの役割:Ansible・Puppet・Chef・Terraform
構成管理ツールとは、複数の機器やサーバの設定を、ファイルに書いた定義から一括で反映するツールです。担当者はREST APIを直接呼び出す代わりに、これらのツールへ定義を渡します。クラウドのサーバやネットワークをファイルの定義から作る考え方は、IaCの記事で解説しています。
| ツール | エージェントの | 設定の |
|---|---|---|
| Ansible | 不要。SSHなど既存の接続手段で操作する | YAMLのPlaybookに、実行するタスクを順に書く |
| Puppet | 必要。管理対象にPuppet agentを入れる構成が基本 | 独自のDSLで、あるべき状態を書く |
| Chef | 必要。管理対象にchef-clientを入れる構成が基本 | RubyベースのDSLでレシピ・クックブックを書く |
| Terraform | 不要。外部からAPIで操作する | HCLで、あるべき状態を書く |
AnsibleとTerraformは、エージェントと呼ぶ専用ソフトを管理対象に入れず、APIやSSHで操作します。PuppetとChefは、管理対象にエージェントを入れる構成が基本です。記述方式も、YAML・独自の記述言語(DSL)・Ruby・HCLとツールごとに違います。どのツールを選ぶかは、対象のシステムや組織の運用方針によって変わります。
練習問題(全5問)
正解:同じ
自動化では、
正解:担当者が、
コントローラ型・
正解:PUT
PUTは、
正解:複数の
角かっこは、
正解:SSHなど
Ansibleは、
選んでから「採点する」を押すと、解説つきで答え合わせができます。
関連記事
おすすめの本 PR
ネットワークを初めて学ぶ人向けの入門書です。
![『[改訂新版]3分間ネットワーク基礎講座』の表紙](https://m.media-amazon.com/images/P/4774143731.09.MZZZZZZZ.jpg)
