环境¶
环境会影响模板的运行时行为。它提供了一种覆盖资源实现的方法,以及放置服务所需参数的机制。
要完全理解运行时行为,您需要考虑您使用的云上安装了哪些插件。
环境文件格式¶
环境是一个 YAML 文本文件,包含两个主要部分
parameters一个键/值对列表。
resource_registry自定义资源的定义。
它还可以包含其他一些部分
parameter_defaults传递给所有模板资源的默认参数。
encrypted_parameters加密参数列表。
event_sinks将接收堆栈事件的端点列表。
parameter_merge_strategies合并环境文件中的参数和参数默认值的合并策略。
使用 -e 选项的 openstack stack create 命令,可以使用此类文件中定义的环境创建堆栈。
您还可以使用 –parameter 选项的 openstack stack create 命令,将环境参数作为键/值对列表提供。
在以下示例中,环境从 my_env.yaml 文件读取,并使用 –parameter 选项提供额外的参数
$ openstack stack create my_stack -e my_env.yaml --parameter "param1=val1;param2=val2" -t my_tmpl.yaml
环境合并¶
参数及其默认值 (parameter_defaults) 基于环境文件中的合并策略进行合并。
有三种合并策略类型
overwrite覆盖参数,现有参数值将被替换。
merge合并现有参数值和新值。字符串值将被连接,逗号分隔的列表将被扩展,JSON 值将被更新。
deep_mergeJSON 值将被深度合并。对于其他类型(如逗号分隔的列表和字符串)没有用处。如果指定了它们,则会回退到
merge。
您可以为环境文件提供默认合并策略和/或特定参数的合并策略。特定参数的合并策略仅用于该参数。环境文件中的 parameter_merge_strategies 部分的示例
parameter_merge_strategies:
default: merge
param1: overwrite
param2: deep_merge
如果环境中没有提供合并策略,则 overwrite 将成为该环境中所有 parameters 和 parameter_defaults 的默认合并策略。
全局和有效环境¶
堆栈使用的环境是您与堆栈模板一起使用的环境与您的云操作员确定的全局环境的组合。用户环境中的条目优先于全局环境。OpenStack 包含默认全局环境,但您的云操作员可以添加其他环境条目。
云操作员可以通过将环境文件放在 Orchestration 引擎运行的配置目录中来添加到全局环境。配置变量名为 environment_dir,位于 /etc/heat/heat.conf 的 [DEFAULT] 部分。该目录的默认值为 /etc/heat/environment.d。其内容在服务启动时(即读取这些文件的时间)以 shell 传递的任何顺序组合。
openstack stack create my_stack --parameter "some_parm=bla" -t my_tmpl.yaml
全局模板¶
全局模板目录允许将文件预加载到全局环境中。全局模板由您的云操作员确定。用户模板中的条目优先于全局环境。OpenStack 包含默认全局模板,但您的云操作员可以添加其他模板条目。
云操作员可以通过将模板文件放在 Orchestration 引擎运行的配置目录中来添加新的全局模板。配置变量名为 template_dir,位于 /etc/heat/heat.conf 的 [DEFAULT] 部分。该目录的默认值为 /etc/heat/templates。其内容在服务启动时(即读取这些文件的时间)以 shell 传递的任何顺序组合。如果上述示例中的 my_tmpl.yaml 文件已放在 template_dir 中,则其他模板(我们用于创建堆栈)可以使用以下方式包含 my_tmpl.yaml
resourceA:
type: {get_file: "my_tmpl.yaml"}
用法示例¶
定义模板参数的值¶
您可以在环境文件的 parameters 部分定义模板参数的值
parameters:
KeyName: heat_key
InstanceType: m1.micro
ImageId: F18-x86_64-cfntools
为参数定义默认值¶
您可以在环境文件的 parameter_defaults 部分定义所有模板参数的默认值。这些默认值将传递给所有模板资源
parameter_defaults:
KeyName: heat_key
映射资源¶
您可以在环境文件的 resource_registry 部分将一个资源映射到另一个资源。以这种方式提供的资源必须具有标识符,并且必须引用另一个资源的 ID 或现有模板文件的 URL。
以下示例将一个新的 OS::Networking::FloatingIP 资源映射到现有的 OS::Neutron::FloatingIP 资源
resource_registry:
"OS::Networking::FloatingIP": "OS::Neutron::FloatingIP"
您可以使用通配符来映射多个资源,例如将所有 OS::Neutron 资源映射到 OS::Network
resource_registry:
"OS::Network*": "OS::Neutron*"
使用自定义资源覆盖资源¶
要使用自定义资源创建或覆盖资源,请创建一个模板文件来定义此资源,并在环境文件中提供指向模板文件的 URL
resource_registry:
"AWS::EC2::Instance": file:///path/to/my_instance.yaml
支持的 URL 方案是 file、http 和 https。
注意
模板文件扩展名必须是 .yaml 或 .template,否则它不会被视为自定义模板资源。
您可以将自定义资源的使用限制为模板的特定资源
resource_registry:
resources:
my_db_server:
"OS::DBInstance": file:///home/mine/all_my_cool_templates/db.yaml
暂停给定资源上的堆栈创建、更新或删除¶
如果您想在堆栈创建、更新或删除时对其进行调试,或者如果您想分阶段运行它,可以在 resource_registry 的 resources 部分设置 pre-create、pre-update、pre-delete、post-create、post-update 和 post-delete 挂钩。
要设置挂钩,请将 hooks: $hook_name(例如 hooks: pre-update)添加到资源的字典中。您还可以使用列表 (hooks: [pre-create, pre-update]) 来停止多个操作。
您可以将挂钩与其他 resources 属性(如提供程序模板或类型映射)结合使用
resource_registry:
resources:
my_server:
"OS::DBInstance": file:///home/mine/all_my_cool_templates/db.yaml
hooks: pre-create
nested_stack:
nested_resource:
hooks: pre-update
another_resource:
hooks: [pre-create, pre-update]
当 heat 遇到具有挂钩的资源时,它会暂停资源操作,直到挂钩清除。依赖于暂停操作的任何资源也会等待。非依赖资源将并行创建,除非它们有自己的挂钩。
可以使用资源名称中的星号 (*) 执行通配符匹配。例如,以下条目在创建 app_server 和 database_server 时暂停,但不暂停 server 或 app_network
resource_registry:
resources:
"*_server":
hooks: pre-create
通过使用 {unset_hook: $hook_name}(例如 {unset_hook: pre-update})向资源发出信号来清除挂钩。
检索事件¶
默认情况下,事件存储在数据库中,可以通过 API 检索。使用环境,您可以注册一个端点,该端点将接收堆栈产生的事件,这样您就不必轮询 Heat。
您可以使用 event_sinks 属性指定端点
event_sinks:
- type: zaqar-queue
target: myqueue
ttl: 1200
限制对给定资源的更新或替换¶
如果您想在堆栈更新时限制对资源的更新或替换,可以在 resource_registry 的 resources 部分设置 restricted_actions。
要限制更新或替换,请将 restricted_actions: update 或 restricted_actions: replace 添加到资源字典。您还可以使用 [update, replace] 来限制这两个操作。
您可以将受限操作与其他 resources 属性(如提供程序模板或类型映射或挂钩)结合使用
resource_registry:
resources:
my_server:
"OS::DBInstance": file:///home/mine/all_my_cool_templates/db.yaml
restricted_actions: replace
hooks: pre-create
nested_stack:
nested_resource:
restricted_actions: update
another_resource:
restricted_actions: [update, replace]
可以使用资源名称中的星号 (*) 执行通配符匹配。例如,以下条目限制了 app_server 和 database_server 的替换,但不限制 server 或 app_network
resource_registry:
resources:
"*_server":
restricted_actions: replace