跳转到: 导航, 搜索

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.templateWordPress_Single_Instance.yaml 在单元测试中被验证为解析为等效的 Heat 堆栈。

其他测试包括使用转换工具将现有的 JSON 模板转换为 YAML,然后解析两者并验证它们是否产生相同的 python 字典结构。