我正在努力让我的 Ansible 角色变得可组合和可重用。
我有一个执行多个系列步骤的角色。根据应用于主机的其他角色,其他角色需要在每个步骤运行任务。
我正在使用 PostgreSQL 和 PostgreSQL 扩展管理,但为了简单起见,让我们使用一个 Web 服务器和一些在其上运行的应用程序的示例。
角色webserver
:
该myapp
角色需要能够向 Web 服务器的配置添加一些设置,这些设置必须在创建 Web 服务器的数据库之前应用。它还必须在首次声明网络服务器之前执行一些操作。
该myotherapp
角色还需要在首次运行之前向网络服务器的配置添加一些设置,而不破坏myapp
. 它还必须在网络服务器首次启动后执行一些操作,重新启动它,做更多的工作,然后再次重新启动它。
(这是人为的,但表达了我真实用例的所有需求,而没有深入了解您想了解的有关 PostgreSQL 内部结构的更多信息)。
我想我应该能够为此使用处理程序。只需在每个相关步骤中webserver
触发notify
,以便其他角色可以将这些通知挂起以附加到列表或将密钥添加到用于配置模板的哈希中,触发自己的任务等。拥有一个处理程序,restart_webserver
可以myotherapp
在每次想要发出通知时发出通知重新启动,而不必知道重新启动实际上是如何执行的。ETC。
然而:
如果有通知,则处理程序必须存在。Ansible 不允许可选处理程序。
如果通知有多个处理程序,Ansible 只会选择第一个处理程序并忽略其余所有处理程序。
通知仅在播放部分结束时触发。你不能立即解雇他们。有,meta: flush_handlers
但它会刷新所有处理程序,即使是那些来自其他不相关角色和任务的处理程序,这些角色和任务可能不希望其处理程序提前运行。
附加到列表或向字典添加键是非常困难的。因此,如果不手动将配置与一些 yml 粘合在一起,就很难组合多个相关角色host_vars
。
所以处理程序和通知似乎不是如何做到这一点的。
如何编写可组合的任务和角色?
我想用自行车车轮当锤子吗?难道你不打算以这种方式使用角色吗?看起来很符合角色的概念。
是否应该通过删除 Ansible 的任务/角色/变量/等系统并在 Python 中将其作为 Ansible 模块来编写任何模糊可重用或不完全线性的内容?如果是这样,是否有任何实用的方法来实现此类模块的大部分大脑,例如 Ansible 任务列表、变量 yml 文件等,并且只需在模块中包含控制逻辑,这样模块就不必重新编写实施大量的东西?
“PostgreSQL 胆量”版本:
一名postgres_server
角色。根据需要从发行版软件包或源代码安装 Pg。有很多变量defaults/main.yml
可以被覆盖来控制行为。提供对 PostgreSQL 配置进行模板化的工具,以便为postgresql.conf
. 让调用者覆盖或在前面添加行pg_hba.conf
。initdb 的 PostgreSQL 一旦安装。配置后启动 PostgreSQL。知道如何启动、停止和重新启动postgres_server
(处理程序)。暴露事实以告诉其他角色 PostgreSQL 安装在哪里。
一名bdr_extension
角色。分配到将在 PostgreSQL 中安装bdr扩展的主机。需要查看暴露的事实以postgres_sever
了解如何安装。可以从 git 获取/编译/安装 BDR 或从操作系统包安装。
如果配置文件中有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
启用复制条目。
该角色必须在PostgreSQL 启动后运行一些 SQL 命令。
一名pg_stat_statements
角色。可以pg_stat_statements
从 git 或操作系统包安装扩展。需要查看暴露的事实以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 不熟悉,所以我不确定你提到的各种配置文件的内容,但如果你需要允许多个角色为单个配置文件做出贡献,我已经通过以下两种方式之一完成了这一点,具体取决于配置文件支持什么:
使用包含大量 include 语句的配置文件来包含位于子目录中的其他配置文件。这与 Apache 等重写规则、特定于应用程序的配置指令和虚拟主机配合得很好。
使用assemble 模块从存储在目录中的多个部分配置文件组装配置文件。我使用此方法为 Postfix 构建了一个 master.cf 文件,因为我有一个postfix
角色和另一个角色需要添加到 Postfix master.cf 文件中。因此,我修改了postfix
角色以创建 /etc/postfix/master.d 目录和一个处理程序,该处理程序将该目录中的文件组装成 master.cf 文件。不幸的是,正如您所指出的,由于我无法postfix
从另一个角色调用该角色中的处理程序,因此我必须在我的附加角色中复制该处理程序。它比想法稍差一些,但它有效并且是幂等的。