自定义 Ansible Playbooks

Kayobe 支持运行位于 kayobe 项目之外的自定义 Ansible playbooks。这提供了一种灵活的机制来定制控制平面。可以访问 kayobe 变量,确保无需重复配置。

Kayobe 自定义 Playbook API

显式允许用户运行具有访问 kayobe 变量权限的自定义 playbooks,将变量命名空间和清单提升为接口。这引发了关于此接口稳定性和其提供的保证的问题。

以下准则适用于自定义 playbook API

  • 仅支持 kayobe 配置文件下 etc/kayobe 中定义的变量。

  • 支持 etc/kayobe/inventory/groups 中定义的组。

  • 对受支持变量(重命名、模式更改、默认值更改或删除)或受支持组(重命名或删除)的任何更改都将遵循一个发布周期的弃用期。

  • Kayobe 的内部角色可能无法使用。

请注意,这些是准则,在适当的情况下可能会做出例外。

运行自定义 Ansible Playbooks

运行一个或多个自定义 ansible playbooks

(kayobe) $ kayobe playbook run <playbook>[ <playbook>...]

默认情况下,playbooks 无法访问 Kayobe playbook 组变量、filter 插件和 test 插件,因为这些插件相对于当前 playbook 的目录。可以通过从 Kayobe 配置创建到 Kayobe 仓库的符号链接来解决此问题。

将自定义 Playbooks 与配置一起打包

kayobe 项目鼓励其用户使用版本控制来管理云的配置,基于 kayobe-config 仓库。将自定义 Ansible playbooks 存储在此仓库中非常有意义,kayobe 也为此提供了特殊支持。

建议将自定义 playbooks 存储在 $KAYOBE_CONFIG_PATH/ansible/ 中。从 Zed 13.0.0 版本开始,也可以使用以下子目录,并且这些目录将可用于所有 Kayobe playbook 执行。

  • roles

  • collections

  • action_plugins

  • filter_plugins

  • test_plugins

请注意,从 Zed 13.0.0 版本开始,不再需要创建符号链接来使用 Kayobe 的角色、collections 或插件。现有的符号链接可以删除。

Ansible Galaxy

Ansible Galaxy 提供了一种共享 Ansible 角色和 collections 的方式。Kayobe 配置可以提供一个 Galaxy requirements 文件,该文件定义了要从 Galaxy 安装的角色和 collections。然后,这些角色和 collections 可以被自定义 playbooks 使用。

可以在 $KAYOBE_CONFIG_PATH/ansible/requirements.yml 中定义 Galaxy 依赖项。这些角色和 collections 将在引导 Ansible 控制主机时安装在 $KAYOBE_CONFIG_PATH/ansible/roles/$KAYOBE_CONFIG_PATH/ansible/collections

(kayobe) $ kayobe control host bootstrap

并在升级 Ansible 控制主机时更新

(kayobe) $ kayobe control host upgrade

示例:roles

以下示例将 foo.yml playbook 添加到一组 kayobe 配置中。该 playbook 使用 Galaxy 角色 bar.baz

这是 kayobe 配置仓库结构

etc/kayobe/
    ansible/
        foo.yml
        requirements.yml
        roles/
    bifrost.yml
...

这是 playbook,ansible/foo.yml

---
- hosts: controllers
  roles:
    - name: bar.baz

这是 Galaxy requirements 文件,ansible/requirements.yml

---
roles:
  - bar.baz

我们应该首先安装 Galaxy 角色依赖项,以下载 bar.baz 角色

(kayobe) $ kayobe control host bootstrap

然后,要运行 foo.yml playbook

(kayobe) $ kayobe playbook run $KAYOBE_CONFIG_PATH/ansible/foo.yml

示例:collections

以下示例将 foo.yml playbook 添加到一组 kayobe 配置中。该 playbook 使用 Galaxy collection 中的角色 bar.baz.qux

这是 kayobe 配置仓库结构

etc/kayobe/
    ansible/
        collections/
        foo.yml
        requirements.yml
    bifrost.yml
...

这是 playbook,ansible/foo.yml

---
- hosts: controllers
  roles:
    - name: bar.baz.qux

这是 Galaxy requirements 文件,ansible/requirements.yml

---
collections:
  - bar.baz

我们应该首先安装 Galaxy 依赖项,以下载 bar.baz collection

(kayobe) $ kayobe control host bootstrap

然后,要运行 foo.yml playbook

(kayobe) $ kayobe playbook run $KAYOBE_CONFIG_PATH/ansible/foo.yml

Hooks

警告

Hooks 是一个实验性功能,设计可能会在未来更改。如果设计发生任何更改,您可能需要更新您的配置。当设计稳定后,此警告将被删除。

Hooks 允许您在 kayobe 命令执行的特定点自动执行自定义 playbooks。运行 hook 的点称为 target。请参阅 可用目标列表

通过在 $KAYOBE_CONFIG_PATH/hooks 下的相应目录中创建到现有 playbook 的符号链接来创建 Hooks。Kayobe 将在 hooks 目录中搜索与 <command>.<target>.d 匹配的子目录,其中 command 是 kayobe 命令的名称,任何空格都替换为破折号,而 target 是命令的受支持目标之一。

例如,使用命令

(kayobe) $ kayobe control host bootstrap

kayobe 将搜索路径

  • $KAYOBE_CONFIG_PATH/hooks/control-host-bootstrap/pre.d

  • $KAYOBE_CONFIG_PATH/hooks/control-host-bootstrap/post.d

pre.d 目录下的任何 playbooks 将在 kayobe 执行自己的 playbooks 之前运行,而 post.d 下的任何 playbooks 将在 kayobe 执行之后运行。您可以通过在符号链接前缀上添加序列号来影响 playbooks 的顺序。序列号必须用破折号与 hook 名称分隔。序列号较小的 playbooks 在序列号较大的 playbooks 之前运行。任何并列关系都通过字母顺序解决。

例如,要运行 playbook foo.ymlkayobe overcloud host configure 之后,您可以执行以下操作

(kayobe) $ mkdir -p ${KAYOBE_CONFIG_PATH}/hooks/overcloud-host-configure/post.d
(kayobe) $ cd ${KAYOBE_CONFIG_PATH}/hooks/overcloud-host-configure/post.d
(kayobe) $ ln -s ../../../ansible/foo.yml 10-foo.yml

playbook foo.yml 的序列号为 10

可以使用 --skip-hooks 禁用 hook 执行。--skip-hooks all 将完全停止 hook 执行。--skip-hooks <pattern> 将跳过与 <pattern> 匹配的 playbooks。

例如,如果存在以下 playbooks

  • $KAYOBE_CONFIG_PATH/hooks/control-host-bootstrap/pre.d/example1.yml

  • $KAYOBE_CONFIG_PATH/hooks/control-host-bootstrap/pre.d/example2.yml

  • $KAYOBE_CONFIG_PATH/hooks/control-host-bootstrap/post.d/example1.yml

并使用以下命令

(kayobe) $ kayobe control host bootstrap --skip-hooks example1

只有 $KAYOBE_CONFIG_PATH/hooks/control-host-bootstrap/pre.d/example2.yml 将被执行。

此示例假定术语 example1 不出现在 $KAYOBE_CONFIG_PATH 中。如果出现,所有 hook 都会被跳过。

故障处理

如果任何 playbook 的退出状态(包括内置 playbook 和自定义 hook)为非零,kayobe 将不会运行任何后续的 hook 或内置 kayobe playbooks。Ansible 提供了几种方法来防止任务产生失败。请参阅 Ansible 文档 以获取更多详细信息。以下示例显示了如何使用 ignore_errors 选项来防止任务导致 playbook 报告失败

---
- name: Failure example
  hosts: localhost
  tasks:
    - name: Deliberately fail
      fail:
      ignore_errors: true

Deliberately fail 任务中发生故障不会阻止后续任务、hook 和 playbooks 运行。

Targets

以下目标适用于所有命令

所有命令

目标 (Target)

描述

pre

在 kayobe 命令开始执行之前运行

post

在 kayobe 命令完成执行后运行