使用 Python3 为 Kubernetes 创建 YAML
Creating YAML for Kubernetes with Python3
我正在尝试为 Kubernetes 创建我的角色 YAML 文件,但我遇到了所需 YAML 的这个特定部分:
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
我试图将它添加为字典,然后是一个列表,其中包含用于 -apiGroups 行的字典,但这会导致规则的其余参数出现问题。当我使用 yaml.dump 时,即使我指定 default_flow_style=False
,我也遇到了 [] 出现的问题
def create_role_yml(role_filename, team_name, group_user):
"""
https://kubernetes.io/docs/reference/
access-authn-authz/rbac/#role-and-clusterrole
"""
yml_file_kubernetes_data = dict(
apiVersion='rbac.authorization.k8s.io/v1',
kind='Role',
metadata=dict(
namespace=team_name,
name=group_user,
),
rules={
[{'apiGroups':""}],
'resourses': '[pods]',
'verbs':'[get, watch, list]'}
)
with open(role_filename, 'w') as outfile:
yaml.dump(yml_file_kubernetes_data, outfile,
default_flow_style=False)
我想打开 YAML,它看起来与 Kubernetes 参考 YAML 完全一样:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
但我将 [ ] 分开,而没有 - 对于 apiGroup。这是我的结果:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
apiGroups:
- "" # "" indicates the core API group
resources:
- "pods"
verbs:
-"get"
-"watch"
-"list"
规则实际上是一组地图,因此您需要将其更改为如下所示:
#!/usr/bin/env python
import yaml
yml_file_kubernetes_data = dict(
apiVersion='rbac.authorization.k8s.io/v1',
kind='Role',
metadata=dict(
namespace='something',
name='group',
),
rules=[
{
'apiGroups': '',
'resources': [ 'pods' ],
'verbs': [ 'get', 'watch', 'list' ],
}
],
)
with open('rbac.yml', 'w') as outfile:
yaml.dump(yml_file_kubernetes_data, outfile,
default_flow_style=False)
如果你想明确地使用 [] 数组符号,你需要使用类似 ruamel.yml 的东西——老实说,这真的不值得。这是有效的 YAML
你尝试做的事情用你可以交给 PyYAML 的正常参数是不可能的 dump()
,
使用 default_flow_style
只给你非常好的路线控制
True
:一切都是流式的(JSON喜欢)
False
: 一切都是块状
None
: leaf collections 为flow style,其余为block style
您引用的 YAML 具有两个块样式叶集合:值
对于键 metadata
,以及流样式叶集合:
键 verbs
的值。如果不破解代表,你就不能
在 PyYAML 中实现这一点。
以您的特定形式生成 YAML 的更简单方法是
使用知道如何的解析器读取-修改-写入您期望的 YAML
保持格式。你可以用 ruamel.yaml
来做到这一点
专门为保存这些东西而开发的(免责声明:我
我是那个包的作者)。
如果你的输入文件是input.yaml
:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace:
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", 'list']
(metadata
下的单个条目是故意的,但您可以同时指定两者,或者 none 如果
你分配而不是更新)
以及以下程序:
import sys
from pathlib import Path
import ruamel.yaml
yaml_str = """\
"""
in_file = Path("input.yaml")
out_file = Path("output.yaml")
team_name = "default"
group_user = "pod-reader"
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(in_file)
data["metadata"].update(dict(namespace=team_name, name=group_user))
yaml.dump(data, out_file)
给出 output.yaml
:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", 'list']
请注意,除了 block/flow 样式外,还有 single/double 引号
来自原始和评论被保留。你的缩进
已经匹配默认值,因此未明确设置 (yaml.indent(mapping=2, sequence=2, offset=0)
)。
我正在尝试为 Kubernetes 创建我的角色 YAML 文件,但我遇到了所需 YAML 的这个特定部分:
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
我试图将它添加为字典,然后是一个列表,其中包含用于 -apiGroups 行的字典,但这会导致规则的其余参数出现问题。当我使用 yaml.dump 时,即使我指定 default_flow_style=False
def create_role_yml(role_filename, team_name, group_user):
"""
https://kubernetes.io/docs/reference/
access-authn-authz/rbac/#role-and-clusterrole
"""
yml_file_kubernetes_data = dict(
apiVersion='rbac.authorization.k8s.io/v1',
kind='Role',
metadata=dict(
namespace=team_name,
name=group_user,
),
rules={
[{'apiGroups':""}],
'resourses': '[pods]',
'verbs':'[get, watch, list]'}
)
with open(role_filename, 'w') as outfile:
yaml.dump(yml_file_kubernetes_data, outfile,
default_flow_style=False)
我想打开 YAML,它看起来与 Kubernetes 参考 YAML 完全一样:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
但我将 [ ] 分开,而没有 - 对于 apiGroup。这是我的结果:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
apiGroups:
- "" # "" indicates the core API group
resources:
- "pods"
verbs:
-"get"
-"watch"
-"list"
规则实际上是一组地图,因此您需要将其更改为如下所示:
#!/usr/bin/env python
import yaml
yml_file_kubernetes_data = dict(
apiVersion='rbac.authorization.k8s.io/v1',
kind='Role',
metadata=dict(
namespace='something',
name='group',
),
rules=[
{
'apiGroups': '',
'resources': [ 'pods' ],
'verbs': [ 'get', 'watch', 'list' ],
}
],
)
with open('rbac.yml', 'w') as outfile:
yaml.dump(yml_file_kubernetes_data, outfile,
default_flow_style=False)
如果你想明确地使用 [] 数组符号,你需要使用类似 ruamel.yml 的东西——老实说,这真的不值得。这是有效的 YAML
你尝试做的事情用你可以交给 PyYAML 的正常参数是不可能的 dump()
,
使用 default_flow_style
True
:一切都是流式的(JSON喜欢)False
: 一切都是块状None
: leaf collections 为flow style,其余为block style
您引用的 YAML 具有两个块样式叶集合:值
对于键 metadata
,以及流样式叶集合:
键 verbs
的值。如果不破解代表,你就不能
在 PyYAML 中实现这一点。
以您的特定形式生成 YAML 的更简单方法是
使用知道如何的解析器读取-修改-写入您期望的 YAML
保持格式。你可以用 ruamel.yaml
来做到这一点
专门为保存这些东西而开发的(免责声明:我
我是那个包的作者)。
如果你的输入文件是input.yaml
:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace:
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", 'list']
(metadata
下的单个条目是故意的,但您可以同时指定两者,或者 none 如果
你分配而不是更新)
以及以下程序:
import sys
from pathlib import Path
import ruamel.yaml
yaml_str = """\
"""
in_file = Path("input.yaml")
out_file = Path("output.yaml")
team_name = "default"
group_user = "pod-reader"
yaml = ruamel.yaml.YAML()
yaml.preserve_quotes = True
data = yaml.load(in_file)
data["metadata"].update(dict(namespace=team_name, name=group_user))
yaml.dump(data, out_file)
给出 output.yaml
:
kind: Role
apiVersion: rbac.authorization.k8s.io/v1
metadata:
namespace: default
name: pod-reader
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", 'list']
请注意,除了 block/flow 样式外,还有 single/double 引号
来自原始和评论被保留。你的缩进
已经匹配默认值,因此未明确设置 (yaml.indent(mapping=2, sequence=2, offset=0)
)。