多环境

警告

对多个 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 配置中名为 stagingproduction 的两个环境。

$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

共享额外变量文件

Kayobe 配置目录中的所有额外变量文件($KAYOBE_CONFIG_PATH/*.yml)都在所有环境之间共享。每个环境都可以通过环境特定的额外变量文件($KAYOBE_CONFIG_PATH/environments/<environment>/*.yml)覆盖这些额外变量。

这意味着共享额外变量文件中的所有配置都必须适用于所有环境。在配置因环境而异的地方,请将配置移至每个环境下的额外变量文件。

例如,要为 dns.yml 中的变量添加环境特定的 DNS 配置,请在 $KAYOBE_CONFIG_PATH/environments/<environment>/dns.yml 中设置这些变量。

$KAYOBE_CONFIG_PATH/
├── dns.yml
└── environments/
    ├── production/
    │   ├── dns.yml
    └── staging/
        └── dns.yml

网络配置

网络是通常特定于环境的配置领域。需要考虑两个主要的全局配置文件:networks.ymlnetwork-allocation.yml

将此配置中环境特定的部分移至环境特定的额外变量文件。

  • networks.yml -> $KAYOBE_CONFIG_PATH/environments/<environment>/networks.yml

  • network-allocation.yml -> $KAYOBE_CONFIG_PATH/environments/<environment>/network-allocation.yml

其他可能因环境而异的网络配置包括:

  • DNS(dns.yml

  • 网络接口名称,可通过环境 inventory 中的组变量设置

其他配置

通常需要在每个环境中自定义 overcloud_group_hosts_map。这可以通过 Control Plane Service Placement 中介绍的 overcloud.yml 文件完成。

使用裸金属计算节点时,串行控制台功能的 TCP 端口分配通常特定于环境(console-allocation.yml)。此文件由 Kayobe 自动管理,类似于 network-allocation.yml 文件。

Kolla 配置

在 Wallaby 版本中,Kolla 配置在每个环境中是独立的。Xena 版本支持合并以下文件子集的特定于环境和共享的配置文件内容:

  • kolla/config/bifrost/bifrost.yml

  • kolla/config/bifrost/dib.yml

  • kolla/config/bifrost/servers.yml

  • kolla/globals.yml

  • kolla/kolla-build.conf

  • kolla/repos.ymlkolla/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:如何处理匹配的文件。可以是 copyconcattemplatemerge_configsmerge_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 目录,则排除该目录)复制到新环境中。共享配置的合并必须手动完成。