使用 Python 加载 CloudFormation YAML
Posted
技术标签:
【中文标题】使用 Python 加载 CloudFormation YAML【英文标题】:Loading CloudFormation YAML using Python 【发布时间】:2017-04-26 14:57:19 【问题描述】:我有一组 YAML
AWS Cloud Formation 模板,我最近从 JSON
转换而来。
使用JSON
时,我能够加载这些模板并使用jinja
对其进行转换,以从中生成一些降价文档。我正在尝试在 python 中对YAML
做同样的事情。
我在使用 YAML
标签的 cloudformation 模板中使用速记函数语法。例如
Properties:
MinSize: !Ref ClusterSize
MaxSize: !Ref ClusterSize
当尝试使用ruamel.yaml
包加载这些标签时,构造函数会失败,因为它无法处理标签,因为它不了解标签。
有没有办法解决这个问题,以便我能够加载 YAML
文档,以便检索/查询输出和资源?
【问题讨论】:
什么是“输出”和“资源”? 【参考方案1】:您误认为ruamel.yaml
无法处理标签。但是当然你必须提供关于如何处理任何未知标签的信息,它无法猜测你想用!Ref
加载什么样的数据:
import ruamel.yaml
yaml_str = """\
Properties:
MinSize: !Ref ClusterSize
MaxSize: !Ref ClusterSize
"""
class Blob(object):
def update(self, value):
self.value = value
def __str__(self):
return str(self.value)
def my_constructor(self, node):
data = Blob()
yield data
value = self.construct_scalar(node)
data.update(value)
ruamel.yaml.SafeLoader.add_constructor(u'!Ref', my_constructor)
data = ruamel.yaml.safe_load(yaml_str)
print('data', data['Properties']['MinSize'])
打印:
ClusterSize
如果您想摆脱许多不同的标签,并且不关心“一切都是字符串”,您也可以这样做:
import ruamel.yaml
yaml_str = """\
Properties:
MinSize: !Ref ClusterSize
MaxSize: !Ref ClusterSize
SizeList:
- !abc 1
- !xyz 3
"""
def general_constructor(loader, tag_suffix, node):
return node.value
ruamel.yaml.SafeLoader.add_multi_constructor(u'!', general_constructor)
data = ruamel.yaml.safe_load(yaml_str)
print(data)
给出:
'Properties': 'SizeList': ['1', '3'], 'MinSize': 'ClusterSize', 'MaxSize': 'ClusterSize'
(请注意,标量 1
和 3
被加载为字符串而不是普通整数)
【讨论】:
感谢 Anthon,我并不是要暗示 ruamel.yaml 无法处理标签 - 我只是不知道这些标签的行为和实现,因为我不知道如何指定他们我无法加载 YAML。它们的标签比 !Ref 更多,有些是接受列表和其他类型 - 有没有办法可以忽略标签,或将它们视为字符串,或者这在更基本的层面上不起作用? 如果一切都可以是一个字符串,那么这相对简单,有点不幸的是,到目前为止,您已经减少了示例 YAML,以至于看起来您只有一个这样的标签并且只有嵌套的字典。我会更新答案。以上是关于使用 Python 加载 CloudFormation YAML的主要内容,如果未能解决你的问题,请参考以下文章
如何在 CloudFormation 中将字符串列表作为参数传递?
使用 Python 将 Pub/Sub 消息加载到 BigQuery