Heat/YAMLTemplates
- Launchpad 条目: HeatSpec:yaml-templates
- 创建于: 2012年11月29日
- 贡献者: SteveBaker
范围
CloudFormation 模板语法基于 JSON。这对于手动维护的模板来说存在一些缺点,最显著的是
- 缺乏对块(多行)字符串的支持
- 缺乏注释语法(对于记录模板和注释掉禁用的部分很有用)。
为了避免 Heat 被这个设计决策所阻碍,提出了一种新的模板格式,它将与现有的 CloudFormation 格式一起支持。
这种格式将基于 YAML 语法。这种新格式的初始版本将是一个 YAML 文档,它解析为与当前 CloudFormation 格式相同的文档结构。未来的格式更改很可能侧重于使手动编写模板更容易。
用户故事
Alice 评估了 Heat 以满足她的编排需求,并决定不使用它,因为她不想以 JSON 格式维护她的模板。
Bob 想要在模板中添加许多注释来记录他所采用的方法。
Carlos 必须调试模板中的一个问题,因此他想要暂时注释掉一些资源。
实现概述
当 Heat 解析模板时,如果第一个字符是 {,它会假定格式是 JSON,否则它会尝试将其解析为 YAML。模板可以显式声明它符合初始 YAML 语法,方法是在顶部包含此属性
#!highlight yaml HeatTemplateFormatVersion: '2012-12-12'
如果 HeatTemplateFormatVersion 从模板中省略,解析将假定该模板符合该 Heat 实例所知的最新格式。
依赖项
需要 PyYAML 进行解析。
使用示例
以下是一些新格式的示例。
这是一个空文件
#!highlight yaml
这等效于这个骨架模板
#!highlight yaml
HeatTemplateFormatVersion: '2012-12-12'
Parameters: {}
Mappings: {}
Resources: {}
Outputs: {}
这是一个 JSON 参数片段
#!highlight js
"Parameters" : {
"KeyName" : {
"Description" : "Name of an existing EC2 KeyPair to enable SSH access to the instances",
"Type" : "String"
},
"InstanceType" : {
"Description" : "WebServer EC2 instance type",
"Type" : "String",
"Default" : "m1.large",
"AllowedValues" : [ "t1.micro", "m1.small", "m1.large", "m1.xlarge", "m2.xlarge", "m2.2xlarge", "m2.4xlarge", "c1.medium", "c1.xlarge", "cc1.4xlarge" ],
"ConstraintDescription" : "must be a valid EC2 instance type."
}
以及 YAML 语法中的等效表示形式,包括内联注释
#!highlight yaml
Parameters:
KeyName:
Description: Name of an existing EC2 KeyPair to enable SSH access to the instances
Type: String
InstanceType:
Description: WebServer EC2 instance type
Type: String
Default: m1.large
# there is an assumption that the Nova instance supports the following instance types
AllowedValues: [t1.micro, m1.small, m1.large, m1.xlarge, m2.xlarge,
m2.2xlarge, m2.4xlarge, c1.medium, c1.xlarge, cc1.4xlarge]
ConstraintDescription: must be a valid EC2 instance type.
通常使用 Fn::Join 作为缺乏多行块的解决方法,因此以下
#!highlight js
"UserData" : { "Fn::Base64" : { "Fn::Join" : ["", [
"#!/bin/bash -v\n",
"/opt/aws/bin/cfn-init\n",
"# Setup MySQL root password and create a user\n",
"mysqladmin -u root password '", { "Ref" : "DBRootPassword" }, "'\n",
"cat << EOF | mysql -u root --password='", { "Ref" : "DBRootPassword" }, "'\n",
"CREATE DATABASE ", { "Ref" : "DBName" }, ";\n",
"GRANT ALL PRIVILEGES ON ", { "Ref" : "DBName" }, ".* TO \"", { "Ref" : "DBUsername" }, "\"@\"localhost\"\n",
"IDENTIFIED BY \"", { "Ref" : "DBPassword" }, "\";\n",
"FLUSH PRIVILEGES;\n",
"EXIT\n",
"EOF\n",
"sed --in-place --e s/database_name_here/", { "Ref" : "DBName" }, "/ --e s/username_here/", { "Ref" : "DBUsername" }, "/ --e s/password_here/", { "Ref" : "DBPassword" }, "/ /usr/share/wordpress/wp-config.php\n"
]]}}
可以使用 YAML 的任何块或带引号的标量样式重新组合,例如
#!highlight yaml
UserData:
Fn::Base64:
Fn::Join:
- ''
- - |-
#!/bin/bash -v
/opt/aws/bin/cfn-init
# Setup MySQL root password and create a user
mysqladmin -u root password '
- {Ref: DBRootPassword}
- |-
'
cat << EOF | mysql -u root --password='
- {Ref: DBRootPassword}
- |-
'
CREATE DATABASE
- {Ref: DBName}
- |-
;
GRANT ALL PRIVILEGES ON
- {Ref: DBName}
- .* TO "
- {Ref: DBUsername}
- |-
"@"localhost"
IDENTIFIED BY "
- {Ref: DBPassword}
- |-
";
FLUSH PRIVILEGES;
EXIT
EOF
sed --in-place --e s/database_name_here/
- {Ref: DBName}
- / --e s/username_here/
- {Ref: DBUsername}
- / --e s/password_here/
- {Ref: DBPassword}
- |
/ /usr/share/wordpress/wp-config.php
测试用例
模板 WordPress_Single_Instance.template 和 WordPress_Single_Instance.yaml 在单元测试中被验证为解析为等效的 Heat 堆栈。
其他测试包括使用转换工具将现有的 JSON 模板转换为 YAML,然后解析两者并验证它们是否产生相同的 python 字典结构。