CloudFormation 兼容函数

有许多函数可用于帮助您编写 CloudFormation 兼容的模板。虽然大多数 CloudFormation 函数在 HOT 版本 ‘2013-05-23’ 中受支持,但自 Juno 版本以来的 ‘2014-10-16’ 版本中的 HOT 模板仅支持 Fn::Select 这一 CloudFormation 函数。

除了 Ref 之外,所有这些函数都以 Fn:: 开头。

Ref

返回命名参数或资源的值。

参数

name字符串

资源的名称或参数。

用法

{Ref: my_server}

返回 nova 实例 ID。例如,d8093de0-850f-4513-b202-7979de6c0d55

Fn::Base64

这是一个占位符函数,用于将输入字符串转换为 Base64。Heat 中的此函数实际上不执行任何转换。它包含在 CFN 模板中,这些模板将 UserData 转换为 Base64。Heat 仅接受纯文本格式的 UserData。

参数

value字符串

要转换的字符串。

用法

{"Fn::Base64": "convert this string please."}

返回原始输入字符串。

Fn::FindInMap

返回在 Mappings 部分声明的二级映射中的键对应的数值。

参数

map_name字符串

Mappings 部分中声明的包含键和值的映射的逻辑名称。

top_level_key字符串

顶级键名称。其值为键值对列表。

second_level_key字符串

二级键名称,设置为分配给 top_level_key 列表中的键之一。

用法

Mapping:
  MyContacts:
    jone: {phone: 337, email: a@b.com}
    jim: {phone: 908, email: g@b.com}

{"Fn::FindInMap": ["MyContacts", "jim", "phone" ] }

返回 908

Fn::GetAtt

返回模板中资源的属性。

参数

resource字符串

资源的名称。

attribute字符串

属性的名称。

用法

{Fn::GetAtt: [my_server, PublicIp]}

返回 IP 地址,例如 10.0.0.2

Fn::GetAZs

返回给定区域内的可用区。

注意:Heat 中 AZ 和区域尚未完全实现。

参数

region字符串

区域的名称。

用法

{Fn::GetAZs: ""}

返回 nova availability-zone-list 提供列表。

Fn::Join

类似于 python join,它使用给定的分隔符连接字符串列表。

参数

delimiter字符串

用于连接列表的字符串。

list列表

要连接的列表。

用法

{Fn::Join: [",", ["beer", "wine", "more beer"]]}

返回 beer, wine, more beer

Fn::Select

从列表中选择一个项目。

Heat 扩展:从映射中选择一个项目

参数

selector字符串或整数

列表中项目的编号或映射中的项目名称。

collection映射或列表

从中选择项目的集合。

用法

对于列表查找

{ "Fn::Select" : [ "2", [ "apples", "grapes", "mangoes" ] ] }

返回 mangoes

对于映射查找

{ "Fn::Select" : [ "red", {"red": "a", "flu": "b"} ] }

返回 a

Fn::Split

这是 Join 的反向操作。基于分隔符将字符串转换为列表。

参数

delimiter字符串

要拆分的匹配字符串。

string字符串

要拆分的字符串。

用法

{ "Fn::Split" : [ ",", "str1,str2,str3,str4"]}

返回 {["str1", "str2", "str3", "str4"]}

Fn::Replace

查找并替换一个字符串为另一个字符串。

参数

substitutions映射

一个替换映射。

string: 字符串

要在其中进行替换的字符串。

用法

{"Fn::Replace": [
 {'$var1': 'foo', '%var2%': 'bar'},
  '$var1 is %var2%'
]}

返回 "foo is bar"

Fn::ResourceFacade

在编写模板资源时
  • 用户编写一个模板,该模板将为资源(该资源是 facade)填充内容。

  • 当他们编写模板时,他们需要访问 facade 的元数据。

参数

attribute_name字符串

MetadataDeletionPolicyUpdatePolicy 中的一个。

用法

{'Fn::ResourceFacade': 'Metadata'}
{'Fn::ResourceFacade': 'DeletionPolicy'}
{'Fn::ResourceFacade': 'UpdatePolicy'}

示例

这是一个顶级模板 top.yaml

resources:
  my_server:
    type: OS::Nova::Server
    metadata:
      key: value
      some: more stuff

这是一个资源模板 my_actual_server.yaml

resources:
  _actual_server_:
    type: OS::Nova::Server
    metadata: {'Fn::ResourceFacade': Metadata}

环境变量文件 env.yaml

resource_registry:
  resources:
    my_server:
      "OS::Nova::Server": my_actual_server.yaml

使用方法

$ openstack stack create -t top.yaml -e env.yaml mystack

发生的情况是 top.yaml 中的元数据(键:值,更多内容:更多内容)通过 Fn::ResourceFacade 函数传递到资源模板中。

Fn::MemberListToMap

将 AWS 风格的成员列表转换为映射。

参数

键名称:字符串

键的名称(通常为“Name”或“Key”)。

值名称:字符串

值的名称(通常为“Value”)。

列表:字符串列表

要转换的字符串。

用法

{'Fn::MemberListToMap': ['Name', 'Value', ['.member.0.Name=key',
                                           '.member.0.Value=door',
                                           '.member.1.Name=colour',
                                           '.member.1.Value=green']]}

返回 {'key': 'door', 'colour': 'green'}

Fn::Equals

比较两个值是否相等。如果两个值相等则返回 true,否则返回 false。

参数

value1

要比较的任何类型的数值。

value2

要比较的任何类型的数值。

用法

{'Fn::Equals': [{'Ref': 'env_type'}, 'prod']}

如果参数 ‘env_type’ 等于 ‘prod’,则返回 true,否则返回 false。

Fn::If

如果指定的条件评估为 true,则返回一个值;如果指定的条件评估为 false,则返回另一个值。

参数

condition_name

Conditions 部分中的条件的引用。

value_if_true

如果指定的条件评估为 true,则返回的值。

value_if_false

如果指定的条件评估为 false,则返回的值。

用法

{'Fn::If': ['create_prod', 'value_true', 'value_false']}

如果条件 ‘create_prod’ 评估为 true,则返回 ‘value_true’,否则返回 ‘value_false’。

Fn::Not

充当 NOT 运算符。

Fn::Not 函数的语法是

{'Fn::Not': [condition]}

如果条件评估为 false,则返回 true,或者如果条件评估为 true,则返回 false。

参数

condition

可以定义在此函数中的条件,例如 Fn::Equals,该条件评估为 true 或 false,我们也可以将布尔值设置为条件。

用法

{'Fn::Not': [{'Fn::Equals': [{'Ref': env_type'}, 'prod']}]}

如果参数 ‘env_type’ 等于 ‘prod’,则返回 false,否则返回 true。

Fn::And

充当 AND 运算符以评估所有指定的条件。如果所有指定的条件评估为 true,则返回 true;如果任何一个条件评估为 false,则返回 false。

参数

condition

例如 Fn::Equals 的条件,评估为 true 或 false。

用法

{'Fn::And': [{'Fn::Equals': [{'Ref': env_type}, 'prod']},
             {'Fn::Not': [{'Fn::Equals': [{'Ref': zone}, 'beijing']}]}]

如果参数 ‘env_type’ 等于 ‘prod’ 并且参数 ‘zone’ 不等于 ‘beijing’,则返回 true,否则返回 false。

Fn::Or

充当 OR 运算符以评估所有指定的条件。如果任何一个指定的条件评估为 true,则返回 true;如果所有条件都评估为 false,则返回 false。

参数

condition

例如 Fn::Equals 的条件,评估为 true 或 false。

用法

{'Fn::Or': [{'Fn::Equals': [{'Ref': zone}, 'shanghai']},
            {'Fn::Equals': [{'Ref': zone}, 'beijing']}]}

如果参数 ‘zone’ 等于 ‘shanghai’ 或 ‘beijing’,则返回 true,否则返回 false。