9.3. 使用 Ansible 管理容器
Red Hat OpenStack Platform 17.1 使用 tripleo_container_manage
Ansible 角色对容器执行管理操作。您还可以编写自定义 playbook 来执行特定的容器管理操作:
-
收集 heat 生成的容器配置数据。
tripleo_container_manage
角色使用此数据来编配容器部署。 - 启动容器。
- 停止容器。
- 更新容器。
- 删除容器。
- 使用特定配置运行容器。
虽然 director 会自动执行容器管理,但您可能想要自定义容器配置,或者在不重新部署 overcloud 的情况下对容器应用热修复。
此角色仅支持 Podman 容器管理。
9.3.1. tripleo-container-manage 角色默认值和变量
以下摘录显示了 tripleo_container_manage
Ansible 角色的默认值和变量。
# All variables intended for modification should place placed in this file. tripleo_container_manage_hide_sensitive_logs: '{{ hide_sensitive_logs | default(true) }}' tripleo_container_manage_debug: '{{ ((ansible_verbosity | int) >= 2) | bool }}' tripleo_container_manage_clean_orphans: true # All variables within this role should have a prefix of "tripleo_container_manage" tripleo_container_manage_check_puppet_config: false tripleo_container_manage_cli: podman tripleo_container_manage_concurrency: 1 tripleo_container_manage_config: /var/lib/tripleo-config/ tripleo_container_manage_config_id: tripleo tripleo_container_manage_config_overrides: {} tripleo_container_manage_config_patterns: '*.json' # Some containers where Puppet is run, can take up to 10 minutes to finish # in slow environments. tripleo_container_manage_create_retries: 120 # Default delay is 5s so 120 retries makes a timeout of 10 minutes which is # what we have observed a necessary value for nova and neutron db-sync execs. tripleo_container_manage_exec_retries: 120 tripleo_container_manage_healthcheck_disabled: false tripleo_container_manage_log_path: /var/log/containers/stdouts tripleo_container_manage_systemd_teardown: true
9.3.2. tripleo-container-manage molecule 场景
molecule
用于测试 tripleo_container_manage
角色。下面显示了一个 molecule
默认清单:
hosts: all: hosts: instance: ansible_host: localhost ansible_connection: local ansible_distribution: centos8
使用方法
Red Hat OpenStack 17.1 仅支持此角色中的 Podman。Docker 支持采用路线图。
Molecule
Ansible 角色执行以下任务:
-
收集由 TripleO Heat 模板生成的容器配置数据。此数据被用作数据源。如果容器已经由
Molecule
管理,无论其存在状态,配置数据将根据需要重新配置容器。 -
管理
systemd
关闭文件。它创建TripleO Container systemd
服务,在关闭或启动节点时为服务排序是必需的。它还管理netns-placeholder
服务。 删除不需要或需要重新配置的容器。它使用名为
needs_delete ()
的自定义过滤器,其包含一组规则来确定容器是否需要删除。-
如果容器没有由
tripleo_ansible
管理,则容器不会被删除,或者容器config_id
与输入 ID 不匹配。 -
如果容器没有
config_data
,或者容器没有与输入中数据不匹配的config_data
,则会删除容器。请注意,当删除容器时,该角色还会禁用并删除systemd
服务和 healtchecks。
-
如果容器没有由
按照
start_order
容器配置定义的特定顺序创建容器,默认值为 0。-
如果容器是
exec
,则将运行一个execs
的专用 playbook,使用async
,以便可以同时运行多个execs
。 -
否则,会使用
podman_container
来创建容器。如果容器有一个重启策略
,则会配置systemd
服务。如果容器有一个 healthcheck 脚本,则会配置systemd healthcheck
服务。
-
如果容器是
tripleo_container_manage_concurrency
参数默认设置为 1,并且放置值高于 2 可能会公开 Podman 锁定的问题。
playbook 示例:
- name: Manage step_1 containers using tripleo-ansible block: - name: "Manage containers for step 1 with tripleo-ansible" include_role: name: tripleo_container_manage vars: tripleo_container_manage_config: "/var/lib/tripleo-config/container-startup-config/step_1" tripleo_container_manage_config_id: "tripleo_step1"
9.3.3. tripleo_container_manage 角色变量
tripleo_container_manage
Ansible 角色包含以下变量:
名称 | 默认值 | 描述 |
---|---|---|
tripleo_container_manage_check_puppet_config | false |
如果您希望 Ansible 检查 Puppet 容器配置,则使用此变量。Ansible 可使用配置 hash 来识别更新的容器配置。如果容器有一个来自 Puppet 的新配置,请将此变量设置为 |
tripleo_container_manage_cli | podman |
使用此变量设置要用于管理容器的命令行界面。 |
tripleo_container_manage_concurrency | 1 | 使用此变量设置要同时管理的容器数量。 |
tripleo_container_manage_config | /var/lib/tripleo-config/ | 使用此变量设置容器配置目录的路径。 |
tripleo_container_manage_config_id | tripleo |
使用此变量设置具体配置步骤的 ID。例如,将此值设置为 |
tripleo_container_manage_config_patterns | *.json | 使用此变量设置用于标识容器配置目录中配置文件的 bash 正则表达式。 |
tripleo_container_manage_debug | false |
使用此变量启用或禁用调试模式。如果要运行带有特定一次性配置的容器,以调试模式运行 |
tripleo_container_manage_healthcheck_disable | false | 使用此变量启用或禁用健康检查。 |
tripleo_container_manage_log_path | /var/log/containers/stdouts | 使用此变量为容器设置 stdout 日志路径。 |
tripleo_container_manage_systemd_order | false | 使用此变量启用或禁用 Ansible 的 systemd 关闭顺序。 |
tripleo_container_manage_systemd_teardown | true | 使用此变量触发已弃用容器的清理。 |
tripleo_container_manage_config_overrides | {} | 使用此变量覆盖任何容器配置。此变量的值来自一个字典,其中每个键都是容器名称和您要覆盖的参数,如容器镜像或用户。此变量不会将自定义覆盖写入 JSON 容器配置文件,并且任何新的容器部署、更新或升级都会恢复到 JSON 配置文件的内容。 |
tripleo_container_manage_valid_exit_code | [] |
使用此变量检查容器是否返回退出代码。这个值必须是列表,例如 |
9.3.4. tripleo-container-manage healthchecks
在 Red Hat OpenStack 17.1 之前,容器健康检查是由 systemd
计时器实现的,该计时器将运行 podman exec
来确定给定容器是否健康。现在,它使用 Podman
中的原生健康检查接口,这有助于集成和使用。
要检查容器(如 keystone)是否健康,请运行以下命令:
$ sudo podman healthcheck run keystone
返回代码应当为 0
和 "healthy
"。
"Healthcheck": { "Status": "healthy", "FailingStreak": 0, "Log": [ { "Start": "2020-04-14T18:48:57.272180578Z", "End": "2020-04-14T18:48:57.806659104Z", "ExitCode": 0, "Output": "" }, (...) ] }
9.3.5. tripleo-container-manage debug
tripleo_container_manage
Ansible 角色允许您对给定容器执行特定的操作。这可用于:
- 使用特定的一次性配置运行容器。
- 输出容器命令以管理容器生命周期。
- 输出 Ansible 对容器所做的更改。
要管理单个容器,您需要了解两个方面:
- overcloud 部署过程中的步骤是容器部署的。
- 包含容器配置的生成的 JSON 文件的名称。
以下是在第 1 步中
管理 HAproxy
容器的 playbook 示例,可覆盖镜像设置:
- hosts: localhost become: true tasks: - name: Manage step_1 containers using tripleo-ansible block: - name: "Manage HAproxy container at step 1 with tripleo-ansible" include_role: name: tripleo_container_manage vars: tripleo_container_manage_config_patterns: 'haproxy.json' tripleo_container_manage_config: "/var/lib/tripleo-config/container-startup-config/step_1" tripleo_container_manage_config_id: "tripleo_step1" tripleo_container_manage_clean_orphans: false tripleo_container_manage_config_overrides: haproxy: image: quay.io/tripleoRed_Hat_OpenStack_Platform-17.1-Customizing_your_Red_Hat_OpenStack_Platform_deployment.entos9/centos-binary-haproxy:hotfix
如果 Ansible 以检查模式运行
,则不会删除或创建容器,但 playbook 结束时会显示一个命令列表来显示 playbook 的可能结果。这对于调试非常有用。
$ ansible-playbook haproxy.yaml --check
添加 diff 模式
将显示 Ansible 对容器所做的更改。
$ ansible-playbook haproxy.yaml --check --diff
tripleo_container_manage_clean_orphans
参数是可选的。它可以设置为 false 表示孤立的容器(带有特定 config_id
)不会被删除。它可用于管理单个容器,而不影响具有相同 config_id
的其他正在运行的容器。
tripleo_container_manage_config_overrides
参数是可选的,可用于覆盖特定的容器属性,如 image 或 container 用户。参数使用容器名称和要覆盖的参数创建字典。这些参数必须存在,并在 TripleO Heat 模板中定义容器配置。
请注意,字典不会更新 JSON 文件中的覆盖,以便在执行更新或升级时,容器将与 JSON 文件中的配置重新配置。