【Python】yamlを扱う

スポンサーリンク

はじめに

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

PyYAML

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

GitHub - yaml/pyyaml: Canonical source repository for PyYAML
CanonicalsourcerepositoryforPyYAML.Contributetoyaml/pyyamldevelopmentbycreatinganaccountonGitHub.

インストール

まずは、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

参考

タイトルとURLをコピーしました