我正在努力使我的 Ansible 角色变得可组合和可重复使用。
我有一个角色执行一系列步骤。根据应用于主机的其他角色,其他角色需要在每个步骤运行任务。
我正在使用 PostgreSQL 和 PostgreSQL 扩展管理,但为了简单起见,让我们使用一个 Web 服务器和在其上运行的一些应用程序的示例。
- 角色:网络服务器
- 角色:myapp
- 角色:myotherapp
角色webserver
:
- 安装网络服务器
- 模板及其配置
- 建立数据库
- 启动网络服务器
该myapp
角色需要能够向 Web 服务器的配置中添加一些设置,必须在创建网络服务器的数据库之前应用. 它还必须在首次启动 Web 服务器之前执行一些操作。
角色myotherapp
还需要在首次运行之前向 Web 服务器的配置中添加一些设置,而不会破坏来自的设置myapp
。它还必须在 Web 服务器首次启动后执行一些操作,重新启动它,执行一些其他工作,然后再次重新启动它。
(这是设计的,但表达了我的实际用例的所有需求,而无需深入了解您想知道的 PostgreSQL 内部细节)。
我认为我应该能够为此使用处理程序。webserver
只需notify
在每个相关步骤触发,这样其他角色就可以将这些通知挂接到列表中或将密钥添加到用于配置模板的哈希中,触发自己的任务等。有一个restart_webserver
处理程序myotherapp
可以在每次想要发出重新启动时通知,而不必知道该重新启动实际上是如何执行的。等等。
然而:
如果有通知,处理程序必须存在。Ansible 不允许可选处理程序。
如果一个通知有多个处理程序,Ansible 只会选择第一个并忽略所有其余的处理程序。
通知仅在播放部分结束时触发。您无法立即触发它们。有,
meta: flush_handlers
但它会刷新全部处理程序,甚至来自其他不相关角色和任务的处理程序可能并不期望其处理程序提前运行。这非常困难附加到列表中,或者添加键到字典中。因此,如果不手动将配置与一些 yml 粘合在一起,就很难组合多个相关角色
host_vars
。
因此处理程序和通知似乎不知道如何做到这一点。
如何编写可组合的任务和角色?
我是不是想用自行车车轮当锤子?你难道不应该这样使用角色吗?这似乎与角色。
是否应该通过放弃 Ansible 的任务/角色/变量/等系统并将其作为 Ansible 模块在 Python 中执行来编写任何模糊可重用或不太完全线性的东西? 如果是这样,是否有任何实用的方法来实现此类模块的大部分核心,如 Ansible 任务列表、变量 yml 文件等,并且只在模块中拥有控制逻辑,这样模块就不必重新实现大量的东西?
“PostgreSQL 内部”版本:
角色
postgres_server
。根据需要从发行版包或源代码安装 Pg。其中有许多变量defaults/main.yml
,可以覆盖它们以控制行为。提供模板化 PostgreSQL 配置的功能,以便为 提供参数postgresql.conf
。允许调用者覆盖或在pg_hba.conf
.initdb 的 PostgreSQL 安装后添加行。配置完成后启动 PostgreSQL。知道如何启动、停止和重新启动postgres_server
(处理程序)。公开事实以告知其他角色 PostgreSQL 的安装位置。角色
bdr_extension
。分配给主机,其中保安局扩展将安装在 PostgreSQL 中。需要查看公开的事实以postgres_sever
了解如何安装。可以从 git 获取/编译/安装 BDR 或从 OS 包安装。PostgreSQL无法成功启动如果
bdr
在配置中shared_preload_libraries
。那么postgres_server
如果启用了此扩展,则必须延迟服务器的启动,直到安装完毕。一个
bdr_node
角色。取决于postgres_server
和bdr_extension
。了解允许 BDR 在 PostgreSQL 上运行所需的 PostgreSQL 配置选项,例如max_wal_senders = 20
。需要能够确保在生成配置时,PostgreSQL 配置选项在其逗号分隔的值列表中。覆盖中的默认shared_preload_libraries
模板bdr
以启用复制条目。postgres_server
pg_hba.conf
postgres_server
此角色必须运行一些 SQL 命令后PostgreSQL 已启动。
角色
pg_stat_statements
。可以pg_stat_statements
从 git 或 OS 包安装扩展。需要查看公开的事实以postgres_sever
了解如何安装。需要能够将一些特定于扩展的行附加到postgresql.conf
。需要能够附加'pg_stat_statements'
到shared_preload_libraries
PostgreSQL 服务器配置中的设置。PostgreSQL无法成功启动如果
shared_preload_libraries
在配置中pg_stat_statements
。那么postgres_server
如果启用了此扩展,则必须延迟服务器的启动,直到安装完毕。
因此,BDR 节点是一个 PostgreSQL 服务器,并且具有 BDR 扩展和 pg_stat_statements 扩展以及其他扩展。
我预期的能够公开postgres_server
角色中的处理程序,并根据需要从其他角色调用它们以调用postgres_server
角色中的适当活动,例如数据库服务器重新启动,但它似乎根本不是这样设计的。
我是不是完全搞错了,把 Ansible 角色看作是实际建模角色?
答案1
我不熟悉 PostgreSQL,所以我不确定您提到的各种配置文件的内容,但如果您需要允许多个角色对单个配置文件做出贡献,我已通过以下两种方式之一完成了此操作,具体取决于配置文件支持的内容:
使用包含大量包含语句的配置文件来包含位于子目录中的其他配置文件。这对于 Apache 之类的程序来说效果很好,可用于重写规则、特定于应用程序的配置指令和虚拟主机。
使用以下方法将存储在目录中的多个部分配置文件组装成配置文件:组装模块。我使用此方法为 Postfix 构建了一个 master.cf 文件,因为我有一个
postfix
角色和另一个需要添加到 Postfix master.cf 文件中的角色。因此,我修改了该postfix
角色以创建一个 /etc/postfix/master.d 目录和一个处理程序,该处理程序将该目录中的文件组装成一个 master.cf 文件。不幸的是,正如您所指出的,由于我无法postfix
从另一个角色调用该角色中的处理程序,因此我不得不在我的附加角色中复制该处理程序。它比 idea 略少,但它有效并且是幂等的。