この記事は、 「ネットワーク上級編|要件定義・設計・クラウド・自動化へ進む」 の第57回です。
第6章では、Python・SSH・Ansible・REST APIなどを使って、 ネットワーク運用を自動化するための基礎を学びます。
JSON・YAMLの読み方|ネットワーク自動化で使うデータ形式を理解する
REST APIから取得した情報を見たら波括弧とダブルクォーテーションだらけ。 Ansibleのファイルを開いたら、今度はインデントとハイフンが並んでいる。 JSONとYAMLは、ネットワーク自動化を学ぶうえで避けて通れないデータ形式です。 この回では、プログラマーでなくても必要な情報を読み取れるレベルを目指します。
ネットワーク自動化では、 「コマンドを覚える」だけではなく、「データを読む」能力 が必要になります。
REST APIではJSON、Ansibleなどの自動化ツールではYAMLを目にすることが多く、 これらの階層構造を理解できるようになると、 APIレスポンスや自動化ファイルが急に読みやすくなります。
この記事を読み終えるとできること
- JSONとYAMLの役割を説明できる
- キーと値を見分けられる
- オブジェクト・配列・リストを読み取れる
- ネストされた階層構造を追える
- JSONとYAMLの違いを説明できる
- APIレスポンスから必要情報を探せる
- Ansibleで使われるYAMLを読める
- よくある構文ミスを見つけられる
JSON・YAMLとは何か
JSONとYAMLは、データの項目・値・階層構造を 人間とプログラムの双方が扱える形で表現するためのデータ形式です。
たとえば、ネットワーク機器の情報として次の3項目を扱うとします。
- ホスト名:RTR01
- 管理IPアドレス:192.168.10.1
- 状態:up
人間が文章で書けば、 「RTR01の管理IPアドレスは192.168.10.1で、状態はupです」 と表現できます。
しかし、自動化プログラムでは、 どこがホスト名で、どこがIPアドレスなのか を明確に区別できなければなりません。
JSONで表現すると
{
"hostname": "RTR01",
"management_ip": "192.168.10.1",
"status": "up"
}
YAMLで表現すると
hostname: RTR01
management_ip: 192.168.10.1
status: up
見た目は違いますが、 どちらも表している内容は同じです。
最初は構文を暗記するより、 「項目名と値がセットになっている」 と理解することが重要です。
なぜネットワークエンジニアにJSON・YAMLが必要なのか
CLIだけでネットワーク機器を管理していると、 JSONやYAMLを見る機会はそれほど多くありません。
しかし、自動化やAPIを使い始めると、 設定値や取得結果を 構造化されたデータ として扱う場面が増えます。
機器情報を取得
結果を受け取る
IPや状態を取得
設定値を参照
設定・確認を実行
APIとのデータ交換
REST APIで機器情報や設定情報を取得したとき、 レスポンスがJSONで返されることがあります。
自動化ファイル
AnsibleのPlaybookや各種自動化ツールの設定ファイルなどで YAMLを目にする機会があります。
機器情報の一元管理
ホスト名、IPアドレス、VLAN、拠点情報などを 構造化して管理できます。
プログラムからの利用
Pythonなどから読み込み、 必要な値だけを取り出して処理できます。
JSONの読み方
JSONを読むときは、 すべての記号を一度に理解しようとする必要はありません。
最初は次の4点を確認します。
{ }はまとまりを表す"キー": 値の組み合わせを探す[ ]は複数の値が並ぶ配列- 入れ子になっている場合は外側から内側へ読む
基本となる「キー」と「値」
{
"hostname": "SW01",
"ip_address": "192.168.1.10",
"port_count": 48,
"enabled": true
}
SW01192.168.1.1048trueJSONでよく使う値
| 種類 | 例 | 意味 |
|---|---|---|
| 文字列 | "SW01" |
文字として扱う値 |
| 数値 | 48 |
数値として扱う値 |
| 真偽値 | true / false |
有効・無効などを表す |
| null | null |
値が存在しないことを表す |
| オブジェクト | { ... } |
キーと値のまとまり |
| 配列 | [ ... ] |
複数の値を並べる |
配列を読む
{
"vlans": [
10,
20,
30
]
}
vlansというキーに対し、
VLAN 10、20、30の3つの値が格納されています。
JSONでは、複数のデータが並んでいる
[ ]を見つけたら、
「一覧になっている」と考えると読みやすくなります。
YAMLの読み方
YAMLではJSONのように波括弧を大量に使用せず、 改行とインデントによって階層を表現します。
hostname: SW01
management_ip: 192.168.1.10
enabled: true
基本形は非常にシンプルです。
キー: 値
インデントで階層を表す
device:
hostname: SW01
management_ip: 192.168.1.10
この例では、deviceの下に
hostnameとmanagement_ipがあります。
左端の位置を見ることで、 どのデータがどの階層に所属しているか判断できます。
ハイフンはリストを表す
vlans:
- 10
- 20
- 30
-で始まる行は、
複数の項目を並べたリストとして読むことができます。
複数の機器を表す例
devices:
- hostname: SW01
ip_address: 192.168.1.10
- hostname: SW02
ip_address: 192.168.1.11
devicesの下に、
SW01とSW02という2台分のデータがあります。
YAMLを読むときの最重要ポイントは 「同じインデント=同じ階層」 という考え方です。
JSONとYAMLの違い
| 比較項目 | JSON | YAML |
|---|---|---|
| 主な特徴 | 記号を使って構造を明確に表す | インデント中心で簡潔に表す |
| キー | 通常ダブルクォーテーションで囲む | 多くの場合そのまま記述できる |
| オブジェクト・マッピング | { } |
インデント |
| 配列・シーケンス | [ ] |
- |
| コメント | 標準JSONにはコメント構文なし | #でコメントを記述できる |
| ネットワークでの例 | REST APIの要求・応答データ | Ansibleなどの設定・定義ファイル |
同じデータを比較する
JSON
{
"hostname": "R1",
"interfaces": [
"GigabitEthernet0/0",
"GigabitEthernet0/1"
]
}
YAML
hostname: R1
interfaces:
- GigabitEthernet0/0
- GigabitEthernet0/1
表現方法は違いますが、 どちらも「R1には2つのインターフェースがある」 という同じ構造を表しています。
ネストされたデータの読み方
JSONやYAMLで初心者がつまずきやすいのが、 データの中にさらにデータが入る ネストです。
{
"device": {
"hostname": "R1",
"interfaces": [
{
"name": "GigabitEthernet0/0",
"ip_address": "192.168.10.1",
"status": "up"
},
{
"name": "GigabitEthernet0/1",
"ip_address": "192.168.20.1",
"status": "down"
}
]
}
}
一度に全部読もうとすると複雑に見えます。 外側から順番に分解します。
- 最上位に
deviceがある deviceの中にhostnameとinterfacesがあるinterfacesは配列になっている- 配列には2つのインターフェース情報がある
- それぞれにname・ip_address・statusがある
JSONを読むときは、 「欲しいキーを探し、そのキーがどの階層にあるか確認する」 という方法が実務的です。
ネットワーク自動化での実例
例1:REST APIのレスポンスを読む
APIから次のような情報が返ったとします。
{
"hostname": "CORE-SW01",
"management_ip": "10.0.0.10",
"interfaces": [
{
"name": "GigabitEthernet1/0/1",
"status": "up"
},
{
"name": "GigabitEthernet1/0/2",
"status": "down"
}
]
}
「downしているインターフェースを確認したい」 という目的であれば、すべてを読む必要はありません。
interfacesを探し、その中にある
statusを順番に確認します。
GigabitEthernet1/0/2 の status が down であることを読み取れます。
例2:Ansibleで使うYAMLを読む
---
- name: Configure VLAN
hosts: switches
gather_facts: false
tasks:
- name: Create VLAN 100
cisco.ios.ios_vlans:
config:
- vlan_id: 100
name: SALES
初めて見ると難しそうですが、 階層ごとに読むと意味を追えます。
例3:機器パラメータをYAMLで管理する
devices:
- hostname: CORE-SW01
management_ip: 10.0.0.10
site: tokyo
- hostname: CORE-SW02
management_ip: 10.0.0.11
site: tokyo
このようにネットワーク機器のパラメータを 構造化して管理しておけば、 PythonやAnsibleから読み込んで処理することもできます。
JSON・YAMLでよくあるミス
{
"hostname": "R1"
"ip_address": "192.168.1.1"
}
JSONでは項目を区切るためのカンマが必要です。
{
"hostname": "R1",
"ip_address": "192.168.1.1"
}
{
'hostname': 'R1'
}
標準的なJSONでは文字列やキーに ダブルクォーテーションを使用します。
{
"hostname": "R1",
"ip_address": "192.168.1.1",
}
最後の項目の後ろにカンマを付けると、 JSONとして読み込めないことがあります。
device:
hostname: R1
ip_address: 192.168.1.1
hostnameとip_addressを
同じ階層にしたい場合は、インデント位置もそろえます。
YAMLでは空白による階層が重要です。 エディターでタブを入力したつもりが、 他の行と異なるインデントになっているケースには注意します。
"100"という文字列と
100という数値は同じではありません。
自動化ではデータ型の違いが処理結果に影響することがあります。
実務ではどうやってJSON・YAMLを読むのか
実務で大きなJSONレスポンスを受け取ったとき、 最初から最後まで一行ずつ読む方法は効率的ではありません。
JSONを読む順序
- 何のデータなのか確認する
- 欲しい情報のキー名を考える
- そのキーを検索する
- キーがどのオブジェクト・配列に属しているか確認する
- 値とデータ型を確認する
たとえば、
「インターフェースの状態を確認したい」
のであれば、
interface、status、
stateなどの項目を探します。
YAMLを読む順序
- 最上位のキーを確認する
- インデントを見て階層を確認する
-があればリストとして読む- 変更対象となるキーと値を探す
- 前後の階層を確認してから編集する
YAMLでは値だけを見て変更すると、 同じ名前のキーが別の階層にも存在している場合があります。 必ず親となる階層まで確認してから編集 します。
顧客・上司へJSON・YAMLをどう説明するか
技術に詳しくない相手へ、 「JSONとYAMLを使います」とだけ説明しても、 自動化によって何が良くなるのかは伝わりません。
技術者向けの説明
REST APIから取得した機器情報はJSONとして受け取り、 プログラムから必要な項目を抽出します。 また、自動化で使用するパラメータはYAMLとして管理し、 機器ごとの差分をデータとして扱います。
顧客・管理者向けの説明
機器情報や設定値を決まった形式で管理することで、 人が機器ごとに値を転記する作業を減らし、 自動処理しやすい状態にします。 これにより、設定作業の標準化や入力ミスの削減につなげます。
重要なのは、 JSONやYAMLという技術名そのものではなく、 「データを構造化することで何が改善されるか」 を説明することです。
JSON・YAMLでよく見る英語表現
| 英語 | 意味 | 実務でのイメージ |
|---|---|---|
| key | キー・項目名 | hostnameなど |
| value | 値 | SW01など |
| object | オブジェクト | JSONの{ }で表すまとまり |
| array | 配列 | 複数の値を並べたもの |
| mapping | キーと値の対応 | YAMLのkey: value |
| sequence | 順序付きの項目 | YAMLの-で表すリスト |
| nested | 入れ子になった | データの中にさらにデータがある状態 |
| parse | 解析する | JSONなどをプログラムで読み取る |
| serialize | データ形式へ変換する | データをJSONなどとして出力する |
エラー調査では invalid JSON、 YAML syntax error、 failed to parse、 unexpected token などの表現を目にすることがあります。
理解度チェック
JSON・YAMLの基本を確認します。 解答を見る前に自分で考えてみてください。
問題1.REST APIのレスポンスでよく使われるデータ形式として適切なものはどれですか。
- JPEG
- JSON
- MP3
- PNG
解答を見る
REST APIでは構造化データの交換形式として JSONが使用されるケースが多くあります。
問題2.次のJSONでホスト名の値は何ですか。
{
"hostname": "RTR01",
"status": "up"
}
解答を見る
問題3.JSONで複数の値をまとめる配列に使用する記号はどれですか。
- { }
- [ ]
- ( )
- < >
解答を見る
問題4.YAMLで階層構造を読むとき、特に重要なものは何ですか。
解答を見る
YAMLではインデントによって、 どの項目がどの階層に所属するかを表します。
問題5.次のYAMLで定義されているVLAN IDをすべて答えてください。
vlans:
- 10
- 20
- 100
解答を見る
実践演習:APIレスポンスから障害ポートを探す
次のJSONは、ネットワーク機器のAPIから取得した インターフェース情報という想定です。
{
"hostname": "ACCESS-SW01",
"management_ip": "10.10.10.21",
"interfaces": [
{
"name": "GigabitEthernet1/0/1",
"description": "PC-01",
"status": "up"
},
{
"name": "GigabitEthernet1/0/2",
"description": "AP-01",
"status": "up"
},
{
"name": "GigabitEthernet1/0/3",
"description": "SERVER-01",
"status": "down"
}
]
}
課題1.機器のホスト名を答える
解答を見る
課題2.管理IPアドレスを答える
解答を見る
課題3.downしているインターフェースを特定する
description:
解答を見る
インターフェース: GigabitEthernet1/0/3
description: SERVER-01
課題4.同じ内容をYAMLで表現する
JSONの構造を見ながら、 YAMLへ書き換えてみてください。
management_ip:
interfaces:
解答例を見る
hostname: ACCESS-SW01
management_ip: 10.10.10.21
interfaces:
- name: GigabitEthernet1/0/1
description: PC-01
status: up
- name: GigabitEthernet1/0/2
description: AP-01
status: up
- name: GigabitEthernet1/0/3
description: SERVER-01
status: down
課題5.調査結果を文章で報告する
APIから取得した情報をもとに、 調査結果を上司へ報告する文章を作成してください。
確認結果:
対象インターフェース:
次の確認事項:
回答例を見る
ACCESS-SW01のインターフェース状態をAPIで確認しました。 GigabitEthernet1/0/1および1/0/2はupですが、 SERVER-01が接続されているGigabitEthernet1/0/3は downとなっています。
次の確認として、SERVER-01の稼働状態、 ケーブル接続、対向側リンク状態、 スイッチポート設定を確認します。
自分の言葉で説明する課題
後輩から 「JSONとYAMLは何が違うんですか?」 と聞かれました。 1分程度で説明してください。
YAMLは____________________。
ネットワーク自動化では____________________。
説明例を見る
JSONとYAMLは、どちらも項目と値を構造化して表現するための データ形式です。
JSONは波括弧や角括弧などを使って構造を表し、 REST APIのデータ交換などでよく見かけます。
YAMLはインデントやハイフンを使って階層やリストを表し、 Ansibleなどの自動化ファイルでよく使われます。 どちらも、キー・値・階層という考え方を理解すると 読みやすくなります。
まとめ
- JSONとYAMLは構造化されたデータを表現するための形式
- 基本は「キー」と「値」の組み合わせとして読む
- JSONでは
{ }がオブジェクト、[ ]が配列 - JSONでは文字列をダブルクォーテーションで表す
- YAMLではインデントによって階層を表す
- YAMLでは
-を使ってリストを表せる - REST APIではJSONを目にする機会が多い
- AnsibleなどではYAMLを目にする機会が多い
- 大きなデータは全部読むのではなく、必要なキーを探して階層を追う
- 自動化では値だけでなくデータ型にも注意する
JSONやYAMLを「書ける」ことより先に、 構造を見て必要な情報を正確に読み取れることが重要です。
REST API、Python、Ansibleを使ったネットワーク自動化では、 CLI出力ではなく構造化されたデータを扱う場面が増えます。 キー・値・配列・階層の4つを意識して読む習慣を付けましょう。
第6章「自動化と可視化」では、 Python、SSH、Ansible、REST API、JSON・YAML、Git、 テレメトリー、AIを使ったログ調査までを順番に学びます。

コメント