はじめに
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 をインストールします。
pip install pyyaml
サンプル yaml ファイル
下記のような yaml ファイル(yaml/deployment1.yaml
)を使って動かしていきます。
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 ファイルの読み込み
safe_load
で yaml ファイルを読み込むことができます。
import yaml
with open("yaml/deployment1.yaml", "r") as f:
yaml_obj = yaml.safe_load(f)
print(yaml_obj)
{'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 ファイルの内容を扱うことができます。
import yaml
with open("yaml/deployment1.yaml", "r") as f:
yaml_obj = yaml.safe_load(f)
for spec in yaml_obj["spec"]:
print(spec)
replicas
selector
template
yaml ファイルに出力
dump
で yaml ファイルに出力することができます。
import yaml
with open("yaml/deployment1.yaml", "r") as f:
yaml_obj = yaml.safe_load(f)
with open("yaml/deployment-export.yaml", "w") as f:
yaml.dump(yaml_obj, f)
Kubernetes のマニフェストからコンテナ名を取得してみる
試しに複数の Kubernetes のマニフェストからコンテナ名を列挙させてみます。
まずは、下記のように複数のマニフェストを用意します。
.
└── yaml
├── deployment1.yaml
├── deployment2.yaml
└── deployment3.yaml
それぞれのファイルの内容は下記の通りです。
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
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp2
spec:
replicas: 3
selector:
matchLabels:
app: myapp2
template:
metadata:
labels:
app: myapp2
spec:
containers:
- name: container1-myapp2
image: busybox
- name: container2-myapp2
image: busybox
- name: container3-myapp2
image: busybox
apiVersion: apps/v1
kind: Deployment
metadata:
name: myapp3
spec:
replicas: 3
selector:
matchLabels:
app: myapp3
template:
metadata:
labels:
app: myapp3
spec:
containers:
- name: container1-myapp3
image: busybox
- name: container2-myapp3
image: busybox
- name: container3-myapp3
image: busybox
下記のようにファイルをループさせることで、全てのマニフェストのコンテナ名を取得できます。
import glob
import yaml
files = glob.glob("./yaml/*.yaml")
for file in files:
with open(file) as f:
yaml_obj = yaml.safe_load(f)
for container in yaml_obj["spec"]["template"]["spec"]["containers"]:
print(container["name"])
container1-myapp1
container2-myapp1
container3-myapp1
container1-myapp2
container2-myapp2
container3-myapp2
container1-myapp3
container2-myapp3
container3-myapp3