JSON・YAMLの読み方|ネットワーク自動化で使うデータ形式を理解する

当ページのリンクには広告が含まれています。
ネットワーク上級編 57/全70記事

この記事は、 「ネットワーク上級編|要件定義・設計・クラウド・自動化へ進む」 の第57回です。

第6章では、Python・SSH・Ansible・REST APIなどを使って、 ネットワーク運用を自動化するための基礎を学びます。

NETWORK ADVANCED|AUTOMATION

JSON・YAMLの読み方|ネットワーク自動化で使うデータ形式を理解する

REST APIから取得した情報を見たら波括弧とダブルクォーテーションだらけ。 Ansibleのファイルを開いたら、今度はインデントとハイフンが並んでいる。 JSONとYAMLは、ネットワーク自動化を学ぶうえで避けて通れないデータ形式です。 この回では、プログラマーでなくても必要な情報を読み取れるレベルを目指します。

対象レベル Level 3〜4・上級
想定読了時間 約25分
身につく成果 JSON・YAMLから必要情報を読み取れる
前提知識 REST API・自動化の基礎
演習環境 ブラウザ・テキストエディター

ネットワーク自動化では、 「コマンドを覚える」だけではなく、「データを読む」能力 が必要になります。

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で表現すると

JSON
{
  "hostname": "RTR01",
  "management_ip": "192.168.10.1",
  "status": "up"
}

YAMLで表現すると

YAML
hostname: RTR01
management_ip: 192.168.10.1
status: up

見た目は違いますが、 どちらも表している内容は同じです。

最初は構文を暗記するより、 「項目名と値がセットになっている」 と理解することが重要です。

なぜネットワークエンジニアにJSON・YAMLが必要なのか

CLIだけでネットワーク機器を管理していると、 JSONやYAMLを見る機会はそれほど多くありません。

しかし、自動化やAPIを使い始めると、 設定値や取得結果を 構造化されたデータ として扱う場面が増えます。

1 APIへ要求
機器情報を取得
2 JSON受信
結果を受け取る
3 必要情報抽出
IPや状態を取得
4 YAML読込
設定値を参照
5 自動処理
設定・確認を実行
JSON

APIとのデータ交換

REST APIで機器情報や設定情報を取得したとき、 レスポンスがJSONで返されることがあります。

YAML

自動化ファイル

AnsibleのPlaybookや各種自動化ツールの設定ファイルなどで YAMLを目にする機会があります。

STRUCTURED DATA

機器情報の一元管理

ホスト名、IPアドレス、VLAN、拠点情報などを 構造化して管理できます。

AUTOMATION

プログラムからの利用

Pythonなどから読み込み、 必要な値だけを取り出して処理できます。

JSONの読み方

JSONを読むときは、 すべての記号を一度に理解しようとする必要はありません。

最初は次の4点を確認します。

  1. { } はまとまりを表す
  2. "キー": 値 の組み合わせを探す
  3. [ ] は複数の値が並ぶ配列
  4. 入れ子になっている場合は外側から内側へ読む

基本となる「キー」と「値」

JSON
{
  "hostname": "SW01",
  "ip_address": "192.168.1.10",
  "port_count": 48,
  "enabled": true
}
hostname
値は SW01
ip_address
値は 192.168.1.10
port_count
値は数値の 48
enabled
値は真偽値の true

JSONでよく使う値

種類 意味
文字列 "SW01" 文字として扱う値
数値 48 数値として扱う値
真偽値 true / false 有効・無効などを表す
null null 値が存在しないことを表す
オブジェクト { ... } キーと値のまとまり
配列 [ ... ] 複数の値を並べる

配列を読む

JSON
{
  "vlans": [
    10,
    20,
    30
  ]
}

vlansというキーに対し、 VLAN 10、20、30の3つの値が格納されています。

JSONでは、複数のデータが並んでいる [ ]を見つけたら、 「一覧になっている」と考えると読みやすくなります。

YAMLの読み方

YAMLではJSONのように波括弧を大量に使用せず、 改行とインデントによって階層を表現します。

YAML
hostname: SW01
management_ip: 192.168.1.10
enabled: true

基本形は非常にシンプルです。

キー: 値

インデントで階層を表す

YAML
device:
  hostname: SW01
  management_ip: 192.168.1.10

この例では、deviceの下に hostnamemanagement_ipがあります。

左端の位置を見ることで、 どのデータがどの階層に所属しているか判断できます。

ハイフンはリストを表す

YAML
vlans:
  - 10
  - 20
  - 30

-で始まる行は、 複数の項目を並べたリストとして読むことができます。

複数の機器を表す例

YAML
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で初心者がつまずきやすいのが、 データの中にさらにデータが入る ネストです。

JSON
{
  "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"
      }
    ]
  }
}

一度に全部読もうとすると複雑に見えます。 外側から順番に分解します。

  1. 最上位にdeviceがある
  2. deviceの中にhostnameinterfacesがある
  3. interfacesは配列になっている
  4. 配列には2つのインターフェース情報がある
  5. それぞれにname・ip_address・statusがある
device
機器全体の情報
hostname
R1
interfaces
インターフェース一覧
2つ目のstatus
down

JSONを読むときは、 「欲しいキーを探し、そのキーがどの階層にあるか確認する」 という方法が実務的です。

ネットワーク自動化での実例

例1:REST APIのレスポンスを読む

APIから次のような情報が返ったとします。

API Response / JSON
{
  "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を読む

YAML / Ansible Playbookイメージ
---
- name: Configure VLAN
  hosts: switches
  gather_facts: false

  tasks:
    - name: Create VLAN 100
      cisco.ios.ios_vlans:
        config:
          - vlan_id: 100
            name: SALES

初めて見ると難しそうですが、 階層ごとに読むと意味を追えます。

name
この処理の説明
hosts
処理対象となるホストグループ
tasks
実行する処理の一覧
vlan_id
作成対象のVLAN IDは100
name: SALES
VLAN名はSALES

例3:機器パラメータをYAMLで管理する

devices.yml
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でよくあるミス

1.JSONのカンマを忘れる
{
  "hostname": "R1"
  "ip_address": "192.168.1.1"
}

JSONでは項目を区切るためのカンマが必要です。

{
  "hostname": "R1",
  "ip_address": "192.168.1.1"
}
2.JSONでシングルクォーテーションを使う
{
  'hostname': 'R1'
}

標準的なJSONでは文字列やキーに ダブルクォーテーションを使用します。

3.JSONの最後に不要なカンマを付ける
{
  "hostname": "R1",
  "ip_address": "192.168.1.1",
}

最後の項目の後ろにカンマを付けると、 JSONとして読み込めないことがあります。

4.YAMLのインデントがずれる
device:
  hostname: R1
   ip_address: 192.168.1.1

hostnameip_addressを 同じ階層にしたい場合は、インデント位置もそろえます。

5.YAMLでタブとスペースを混在させる

YAMLでは空白による階層が重要です。 エディターでタブを入力したつもりが、 他の行と異なるインデントになっているケースには注意します。

6.見た目だけでデータ型を判断する

"100"という文字列と 100という数値は同じではありません。 自動化ではデータ型の違いが処理結果に影響することがあります。

実務ではどうやってJSON・YAMLを読むのか

実務で大きなJSONレスポンスを受け取ったとき、 最初から最後まで一行ずつ読む方法は効率的ではありません。

JSONを読む順序

  1. 何のデータなのか確認する
  2. 欲しい情報のキー名を考える
  3. そのキーを検索する
  4. キーがどのオブジェクト・配列に属しているか確認する
  5. 値とデータ型を確認する

たとえば、 「インターフェースの状態を確認したい」 のであれば、 interfacestatusstateなどの項目を探します。

YAMLを読む順序

  1. 最上位のキーを確認する
  2. インデントを見て階層を確認する
  3. -があればリストとして読む
  4. 変更対象となるキーと値を探す
  5. 前後の階層を確認してから編集する

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 JSONYAML syntax errorfailed to parseunexpected token などの表現を目にすることがあります。

理解度チェック

JSON・YAMLの基本を確認します。 解答を見る前に自分で考えてみてください。

問題1.REST APIのレスポンスでよく使われるデータ形式として適切なものはどれですか。

  1. JPEG
  2. JSON
  3. MP3
  4. PNG
解答を見る
正解:B.JSON

REST APIでは構造化データの交換形式として JSONが使用されるケースが多くあります。

問題2.次のJSONでホスト名の値は何ですか。

{
  "hostname": "RTR01",
  "status": "up"
}
解答を見る
正解:RTR01

問題3.JSONで複数の値をまとめる配列に使用する記号はどれですか。

  1. { }
  2. [ ]
  3. ( )
  4. < >
解答を見る
正解:B.[ ]

問題4.YAMLで階層構造を読むとき、特に重要なものは何ですか。

解答を見る
正解:インデント

YAMLではインデントによって、 どの項目がどの階層に所属するかを表します。

問題5.次のYAMLで定義されているVLAN IDをすべて答えてください。

vlans:
  - 10
  - 20
  - 100
解答を見る
正解:10、20、100

実践演習:APIレスポンスから障害ポートを探す

次のJSONは、ネットワーク機器のAPIから取得した インターフェース情報という想定です。

API Response
{
  "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.機器のホスト名を答える

hostname:
解答を見る
ACCESS-SW01

課題2.管理IPアドレスを答える

management_ip:
解答を見る
10.10.10.21

課題3.downしているインターフェースを特定する

インターフェース名:
description:
解答を見る

インターフェース: GigabitEthernet1/0/3

description: SERVER-01

課題4.同じ内容をYAMLで表現する

JSONの構造を見ながら、 YAMLへ書き換えてみてください。

hostname:
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分程度で説明してください。

JSONは____________________。

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つを意識して読む習慣を付けましょう。

次の記事:Gitによる設定管理

JSONやYAMLなどを使って ネットワーク設定や自動化ファイルを管理するようになると、 次に必要になるのが 「誰が、いつ、何を変更したのか」 を追跡する仕組みです。

次回はGitの基本を学び、 ネットワーク設定ファイルや自動化コードの変更履歴を 管理する方法を解説します。

ネットワーク上級編 57/全70記事

第6章「自動化と可視化」では、 Python、SSH、Ansible、REST API、JSON・YAML、Git、 テレメトリー、AIを使ったログ調査までを順番に学びます。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

コメント

コメントする

目次