【Python】yamlを扱う
2023.04.25
2024.03.24
プログラミング
Python
はじめに
Python で Yaml ファイルを扱える PyYAML についてざっと紹介します。
PyYAML
PyYAML は、Python で YAML ファイルを扱えるライブラリです。
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
参考
Share
関連記事
【Typescript】Next.js + MDXでブログ開発
2024.03.30
【Typescript】Reactでテキストをコピーするボタンを実装する
2023.07.30
Cobraを使ってさっと簡単なCLIを作ってみる
2024.01.26