我正在尝试为Kubernetes创建我的Role YAML文件,并且我遇到了所需的YAML的特定部分:
rules:
- apiGroups: [""] # "" indicates the core API group
resources: ["pods"]
verbs: ["get", "watch", "list"]
我试图将它添加为字典,然后在-apiGroups行中添加一个带有字典的列表,但这会导致规则的其余参数出现问题。即使我指定default_flow_style=False
,当我使用yaml.dump时,我也遇到了[]出现的问题
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"]
但我得到[]分开,没有 - 为api集团。这是我的结果:
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"
您可以通过普通参数向PyYAML的dump()
提供您尝试做的事情,这使您只能使用default_flow_style
进行非常的过程控制
True
:一切都是流式(JSON之类的)False
:一切都是块式的None
:叶子集合是流动样式,其余是块样式您引用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
(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']
:
yaml.indent(mapping=2, sequence=2, offset=0)
请注意,除了块/流样式外,还会保留原始和注释中的单/双引号。您的缩进已经与默认值匹配,因此不是明确设置(#!/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)
)。
规则实际上是一组地图,因此您需要将其更改为如下所示:
qazxswpoi
如果你想明确使用[]数组表示法,你需要使用类似ruamel.yml的东西 - 老实说,它真的不值得。这是有效的YAML