【Python】yamlを扱う

2023.04.25
2024.03.24
プログラミング
Python

はじめに

Python で Yaml ファイルを扱える PyYAML についてざっと紹介します。

PyYAML

PyYAML は、Python で YAML ファイルを扱えるライブラリです。

GitHub - yaml/pyyaml: Canonical source repository for PyYAML

GitHub - yaml/pyyaml: Canonical source repository for PyYAML

Canonical source repository for PyYAML. Contribute to yaml/pyyaml development by creating an account on GitHub.

インストール

まずは、pipで PyYAML をインストールします。

1pip install pyyaml

サンプル yaml ファイル

下記のような yaml ファイル(yaml/deployment1.yaml)を使って動かしていきます。

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp1
5spec:
6  replicas: 3
7  selector:
8    matchLabels:
9      app: myapp1
10  template:
11    metadata:
12      labels:
13        app: myapp1
14    spec:
15      containers:
16        - name: container1-myapp1
17          image: busybox
18        - name: container2-myapp1
19          image: busybox
20        - name: container3-myapp1
21          image: busybox

yaml ファイルの読み込み

safe_loadで yaml ファイルを読み込むことができます。

1import yaml
2
3with open("yaml/deployment1.yaml", "r") as f:
4    yaml_obj = yaml.safe_load(f)
5
6print(yaml_obj)
1{'apiVersion': 'apps/v1', 'kind': 'Deployment', 'metadata': {'name': 'myapp1'}, 'spec': {'replicas': 3, 'selector': {'matchLabels': {'app': 'myapp1'}}, 'template': {'metadata': {'labels': {'app': 'myapp1'}}, 'spec': {'containers': [{'name': 'container1-myapp1', 'image': 'busybox'}, {'name': 'container2-myapp1', 'image': 'busybox'}, {'name': 'container3-myapp1', 'image': 'busybox'}]}}}}

読み込んだ yaml ファイルを確認

下記のように読み込んだ yaml ファイルの内容を扱うことができます。

1import yaml
2
3with open("yaml/deployment1.yaml", "r") as f:
4    yaml_obj = yaml.safe_load(f)
5
6for spec in yaml_obj["spec"]:
7    print(spec)
1replicas
2selector
3template

yaml ファイルに出力

dumpで yaml ファイルに出力することができます。

1import yaml
2
3with open("yaml/deployment1.yaml", "r") as f:
4    yaml_obj = yaml.safe_load(f)
5
6with open("yaml/deployment-export.yaml", "w") as f:
7    yaml.dump(yaml_obj, f)

Kubernetes のマニフェストからコンテナ名を取得してみる

試しに複数の Kubernetes のマニフェストからコンテナ名を列挙させてみます。

まずは、下記のように複数のマニフェストを用意します。

1.
2└── yaml
3    ├── deployment1.yaml
4    ├── deployment2.yaml
5    └── deployment3.yaml

それぞれのファイルの内容は下記の通りです。

1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp1
5spec:
6  replicas: 3
7  selector:
8    matchLabels:
9      app: myapp1
10  template:
11    metadata:
12      labels:
13        app: myapp1
14    spec:
15      containers:
16        - name: container1-myapp1
17          image: busybox
18        - name: container2-myapp1
19          image: busybox
20        - name: container3-myapp1
21          image: busybox
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp2
5spec:
6  replicas: 3
7  selector:
8    matchLabels:
9      app: myapp2
10  template:
11    metadata:
12      labels:
13        app: myapp2
14    spec:
15      containers:
16        - name: container1-myapp2
17          image: busybox
18        - name: container2-myapp2
19          image: busybox
20        - name: container3-myapp2
21          image: busybox
1apiVersion: apps/v1
2kind: Deployment
3metadata:
4  name: myapp3
5spec:
6  replicas: 3
7  selector:
8    matchLabels:
9      app: myapp3
10  template:
11    metadata:
12      labels:
13        app: myapp3
14    spec:
15      containers:
16        - name: container1-myapp3
17          image: busybox
18        - name: container2-myapp3
19          image: busybox
20        - name: container3-myapp3
21          image: busybox

下記のようにファイルをループさせることで、全てのマニフェストのコンテナ名を取得できます。

1import glob
2import yaml
3
4files = glob.glob("./yaml/*.yaml")
5for file in files:
6    with open(file) as f:
7        yaml_obj = yaml.safe_load(f)
8    for container in yaml_obj["spec"]["template"]["spec"]["containers"]:
9        print(container["name"])
1container1-myapp1
2container2-myapp1
3container3-myapp1
4container1-myapp2
5container2-myapp2
6container3-myapp2
7container1-myapp3
8container2-myapp3
9container3-myapp3

参考

Support

\ この記事が役に立ったと思ったら、サポートお願いします! /

buy me a coffee
Share

Profile

author

Masa

都内のIT企業で働くエンジニア
自分が学んだことをブログでわかりやすく発信していきながらスキルアップを目指していきます!

buy me a coffee