多环境¶
警告
对多个 Kayobe 环境的支持被认为是实验性的:其设计在未来版本中可能会发生变化,且不设弃用期。
有时,从单个 Kayobe 配置支持部署多个环境会很有用。最常见的情况是为了支持部署管道,例如传统的开发、测试、预生产和生产组合。自 Wallaby 版本以来,可以在单个 Kayobe 配置中包含多个环境,每个环境都提供自己的 Ansible inventory 和变量。本节将介绍如何使用 Kayobe 进行多环境部署。
定义 Kayobe 环境¶
默认情况下,Kayobe 配置目录包含一个环境,该环境由位于 $KAYOBE_CONFIG_PATH/inventory 的 Ansible inventory、额外的变量文件($KAYOBE_CONFIG_PATH/*.yml)、自定义 Ansible playbook 和 hook 以及 Kolla 配置表示。
通过 $KAYOBE_CONFIG_PATH/environments 目录支持多环境,每个子目录代表一个不同的环境。每个环境都包含自己的 Ansible inventory、额外的变量文件、hook 和 Kolla 配置。以下布局显示了单个 Kayobe 配置中名为 staging 和 production 的两个环境。
$KAYOBE_CONFIG_PATH/
└── environments/
├── production/
│ ├── hooks/
│ │ └── overcloud-service-deploy/
│ │ └── pre.d/
│ │ └── 1-prep-stuff.yml
│ ├── inventory/
│ │ ├── groups
│ │ ├── group_vars/
│ │ ├── hosts
│ │ ├── host_vars/
│ │ └── overcloud
│ ├── kolla/
│ │ ├── config/
│ │ ├── globals.yml
│ │ └── passwords.yml
│ ├── network-allocation.yml
│ ├── networks.yml
│ └── overcloud.yml
└── staging/
├── inventory/
│ ├── groups
│ ├── group_vars/
│ ├── hosts
│ ├── host_vars/
│ └── overcloud
├── kolla/
│ ├── config/
│ ├── globals.yml
│ └── passwords.yml
├── network-allocation.yml
├── networks.yml
└── overcloud.yml
命名¶
环境名称 kayobe 保留供内部使用。名称应为有效的目录名,否则没有其他限制。
Ansible Inventories¶
每个环境都可以包含自己的 inventory,它会覆盖在共享 inventory 中进行的任何变量声明。通常,共享 inventory 可用于定义组和组变量,而主机和主机变量将在环境 inventory 中设置。以下布局(忽略非 inventory 文件)显示了多个 inventory 的示例。
$KAYOBE_CONFIG_PATH/
├── environments/
│ ├── production/
│ │ ├── inventory/
│ │ │ ├── hosts
│ │ │ ├── host_vars/
│ │ │ └── overcloud
│ └── staging/
│ ├── inventory/
│ │ ├── hosts
│ │ ├── host_vars/
│ │ └── overcloud
└── inventory/
├── groups
└── group_vars/
自定义 Kolla Ansible inventories¶
Kayobe 具有一个 功能,可将附加 inventory 传递给 Kolla Ansible。使用多个环境时,这些会作为附加 inventory 传递给 Ansible。排序方式是,kayobe 配置的基础层中的 inventory 会覆盖内部 kayobe inventory,而环境中的 inventory 会覆盖基础层中的 inventory。
ansible-playbook -i <internal kayobe inventory> -i <inventory from base layer> -i <inventory from environment>
有关更多详细信息,请参阅 自定义 Kolla Inventory。
Kolla 配置¶
在 Wallaby 版本中,Kolla 配置在每个环境中是独立的。Xena 版本支持合并以下文件子集的特定于环境和共享的配置文件内容:
kolla/config/bifrost/bifrost.ymlkolla/config/bifrost/dib.ymlkolla/config/bifrost/servers.ymlkolla/globals.ymlkolla/kolla-build.confkolla/repos.yml或kolla/repos.yaml
Antelope 版本扩展了此列表,增加了对合并 Kolla Ansible 自定义服务配置的支持。此行为通过两个变量进行配置:
kolla_openstack_custom_config_include_globs:指定在模板化 Kolla 配置时要考虑的文件。Kayobe 默认值使用kolla_openstack_custom_config_include_globs_default设置。可以使用以下方式设置可选的附加 glob 列表:kolla_openstack_custom_config_include_globs_extra。这些与kolla_openstack_custom_config_include_globs_default结合,生成kolla_openstack_custom_config_include_globs。每个列表项是一个字典,包含以下键:enabled:布尔值,确定是否使用此规则。设置为false可禁用规则。glob:字符串 glob,匹配kolla/config目录中的相对路径。
此类规则的示例:
enabled: '{{ kolla_enable_aodh | bool }}' glob: aodh/**
kolla_openstack_custom_config_rules:一组规则,指定生成特定文件时使用的策略。Kayobe 默认值使用kolla_openstack_custom_config_rules_default设置。可以使用以下方式设置可选的附加规则列表:kolla_openstack_custom_config_rules_extra。这些与kolla_openstack_custom_config_rules_default结合,生成kolla_openstack_custom_config_rules。每个列表项的格式如下:glob:匹配此规则所应用的文件的 glob(相对于搜索路径)。priority:规则按递增优先级顺序处理,第一个匹配的规则生效。strategy:如何处理匹配的文件。可以是copy、concat、template、merge_configs、merge_yaml之一。params:可选的附加参数列表,传递给执行策略的模块。
此类规则的示例:
glob: a/path/test.yml strategy: merge_yaml priority: 1000 params: extend_lists: true
Kayobe 默认回退到使用 template 策略,优先级为 65535。要覆盖此行为,请配置优先级较低的规则,例如:
glob: horizon/themes/** strategy: copy priority: 1000
可以使用 kolla_openstack_custom_config_ini_merge_strategy_default 配置默认的 INI 合并策略。为向后兼容,其默认值为 concat。另一种策略是 merge_configs,它会合并两个 INI 文件,以便环境中设置的值优先于共享文件中设置的值。使用 merge_configs 策略的注意事项是,文件必须模板化为有效的 INI。这主要是使用原始 Jinja 标签时的一个问题,例如:
[defaults] {% raw %} {% if inventory_hostname in 'compute' %} foo=bar {% else %} foo=baz {% endif %} {% endraw %}
在 Kayobe 进行第一轮模板化后,原始标签会被剥离。这会留下:
[defaults] {% if inventory_hostname in 'compute' %} foo=bar {% else %} foo=baz {% endif %}
由于 Jinja if 语句,这无效(因为 Jinja if 语句),并且无法合并。在大多数情况下,模板化可以重构:
[defaults] {% raw %} foo={{ 'bar' if inventory_hostname in 'compute' else 'baz' }} {% endraw %}
或者,您可以使用 Kolla 主机或组变量。
禁用默认规则¶
有一些便捷变量可以禁用 kolla_openstack_custom_config_rules_default 中的一部分规则:
kolla_openstack_custom_config_rules_default_remove:允许您通过匹配 glob 来删除规则。kolla_openstack_custom_config_rules_default_remove: - "**/*.ini"
kolla_openstack_custom_config_merge_configs_enabled:为匹配 INI 文件启用规则。默认值为true。kolla_openstack_custom_config_merge_yaml_enabled:为匹配 YAML 文件启用规则。默认值为true。
这些允许您更轻松地与上游默认设置保持同步。如果您对 kolla_openstack_custom_config_rules 进行了覆盖,并且该覆盖复制了 kolla_openstack_custom_config_rules_default 的大部分内容,那么您将需要使其与上游 kayobe 默认设置保持同步。
搜索路径¶
在合并配置文件时,将“搜索”以下位置以查找具有相同相对路径的文件:
<environment-path>/kolla/config<shared-files-path>/kolla/config<kolla-openstack-role-path>/templates/kolla/config
并非所有策略在生成 kolla 配置时都使用所有文件。例如,copy 策略会在搜索每个路径时找到第一个文件。
有一个功能标志:kolla_openstack_custom_config_environment_merging_enabled,可以将其设置为 false,以阻止 Kayobe 在合并配置时搜索共享文件路径。这是为了复制旧的行为,即环境 Kolla 自定义服务配置不会与基础层合并。我们仍然在 kolla-openstack 角色的内部模板中与 Kayobe 的默认值合并文件。
管理独立的环境文件¶
对于每个环境中独立的文件,即不支持合并特定于环境和共享的配置文件内容的文件,可以使用一些技术来避免重复。
例如,可以使用符号链接来共享通用变量定义。建议避免在环境之间共享凭据,方法是使每个 Kolla passwords.yml 文件唯一。
自定义 Ansible Playbooks¶
位于 $KAYOBE_CONFIG_PATH/ansible 下的 自定义 Ansible playbooks、角色和 requirements 文件目前在所有环境之间共享。
Hooks¶
在 Caracal 16.0.0 版本发布之前,hooks 在所有环境之间共享。自 Caracal 版本以来,可以按环境定义 hook。Hooks 会从所有环境和基础配置中收集。当存在同名 hook 时,环境的 hook 具有优先权并会**替换**其他 hook。执行顺序遵循正常规则,无论每个 hook 定义在哪里。
例如,基础配置定义了以下 hook:
$KAYOBE_CONFIG_PATH/hooks/overcloud-service-deploy/pre.d/1-base.yml$KAYOBE_CONFIG_PATH/hooks/overcloud-service-deploy/pre.d/2-both.yml
环境定义了以下 hook:
$KAYOBE_CONFIG_PATH/environments/env/hooks/overcloud-service-deploy/pre.d/2-both.yml$KAYOBE_CONFIG_PATH/environments/env/hooks/overcloud-service-deploy/pre.d/3-env.yml
以下 hook 将按所示顺序执行:
$KAYOBE_CONFIG_PATH/hooks/overcloud-service-deploy/pre.d/1-base.yml$KAYOBE_CONFIG_PATH/environments/env/hooks/overcloud-service-deploy/pre.d/2-both.yml$KAYOBE_CONFIG_PATH/environments/env/hooks/overcloud-service-deploy/pre.d/3-env.yml
Ansible 配置¶
位于 $KAYOBE_CONFIG_PATH/ansible.cfg 或 $KAYOBE_CONFIG_PATH/kolla/ansible.cfg 的 Ansible 配置目前在所有环境之间共享。
动态变量定义¶
在多个环境共享的文件中定义变量可能很有益,但仍然可以根据环境将变量设置为不同的值。在 Ansible 中,可以通过 kayobe_environment 变量检索正在使用的 Kayobe 环境。例如,$KAYOBE_CONFIG_PATH/networks.yml 中的一些变量可以如下共享:
$KAYOBE_CONFIG_PATH/networks.yml¶external_net_fqdn: "{{ kayobe_environment }}-api.example.com"
这将为预生产环境的外部 FQDN 配置为 staging-api.example.com,而生产环境的外部 FQDN 将是 production-api.example.com。
环境依赖¶
警告
这是一项实验性功能,在设计定稿之前仍可能发生变化。
自 Antelope 14.0.0 版本以来,可以通过在环境子目录中找到的 .kayobe-environment 文件中声明依赖项来将多个环境分层叠加。例如:
$KAYOBE_CONFIG_PATH/environments/environment-C/.kayobe-environment¶dependencies:
- environment-B
$KAYOBE_CONFIG_PATH/environments/environment-B/.kayobe-environment¶dependencies:
- environment-A
Kayobe 使用依赖解析器将这些环境排序为线性链。任何依赖循环都会导致错误。使用上面的示例,链将解析为:
C -> B -> A
其中 C 是具有最高优先级的环境。在运行任何 playbook 时,Kayobe 将确保按照此链匹配的顺序包含 inventory 和 extra-vars。
Mixin 环境¶
环境依赖项可用于设计可跨多个环境共享的可重用配置片段。例如:
$KAYOBE_CONFIG_PATH/environments/environment-A/.kayobe-environment¶dependencies:
- environment-mixin-1
- environment-mixin-2
- environment-mixin-3
在这种情况下,每个环境依赖项都可以提供一个或多个功能所需的配置。Mixin 环境不必定义它们之间的任何依赖关系,但是 Kayobe 将执行拓扑排序来确定合适的优先级。应注意确保没有显式排序的环境不会修改相同的变量。
最终考虑¶
虽然让预生产环境在功能上尽可能接近生产环境是可取的,但这并非总是可能,因为资源限制和其他因素。测试和开发环境可以进一步偏离,可能只提供生产环境中可用功能的一部分,并且环境截然不同。在这些情况下,显然有必要在许多文件中使用特定于环境的配置。我们无法在此涵盖所有情况,但希望我们已经提供了一套可用的技术。
使用 Kayobe 环境¶
一旦定义了环境,就可以通过 $KAYOBE_ENVIRONMENT 环境变量或 --environment 命令行参数指示 Kayobe 来管理它们。
(kayobe) $ kayobe control host bootstrap --environment staging
(kayobe) $ export KAYOBE_ENVIRONMENT=staging
(kayobe) $ kayobe control host bootstrap
kayobe-config 中的 kayobe-env 环境文件也可以接受 --environment 参数,该参数会导出 KAYOBE_ENVIRONMENT 环境变量。
(kayobe) $ source kayobe-env --environment staging
(kayobe) $ kayobe control host bootstrap
最后,可以在 $KAYOBE_CONFIG_ROOT/.environment 下指定一个环境名称,如果未使用 --environment 参数,kayobe-env 脚本将使用它。当为每个环境使用不同的分支时,这尤其有用。
(kayobe) $ echo "staging" > .environment
(kayobe) $ source kayobe-env
(kayobe) $ kayobe control host bootstrap
警告
使用 kayobe-env 文件时,Kolla Ansible 源代码和 Python 虚拟环境的位置对所有环境都保持不变。当使用同一控制主机管理具有不同 Kolla Ansible 版本的多个环境时,请将 Kayobe 配置克隆到不同的位置,以免 Kolla Ansible 源代码存储库和 Python 虚拟环境发生冲突。生成的 Kolla Ansible 配置也是共享的:Kayobe 会将活动环境的名称存储在 $KOLLA_CONFIG_PATH/.environment 下,并在检测到冲突时发出警告。
迁移到 Kayobe 环境¶
已经管理多个环境的 Kayobe 用户将已经拥有多个 Kayobe 配置,无论是在单独的存储库中还是在同一存储库的不同分支中。Kayobe 提供 kayobe environment create 命令来帮助迁移到具有多个环境的通用存储库和分支。例如,以下命令将基于现有 Kayobe 配置创建两个新环境用于生产和预生产。
(kayobe) $ kayobe environment create --source-config-path ~/kayobe-config-prod/etc/kayobe \
--environment production
(kayobe) $ kayobe environment create --source-config-path ~/kayobe-config-staging/etc/kayobe \
--environment staging
此命令会递归地将现有配置下的文件和目录(如果存在 environments 目录,则排除该目录)复制到新环境中。共享配置的合并必须手动完成。