我正在努力使我的Ansibleangular色有一定的可组合性和可重用性。
我有一个angular色执行几个系列的步骤。 根据应用于主机的其他angular色,其他angular色需要在每个步骤运行任务。
我正在使用PostgreSQL和PostgreSQL扩展pipe理,但为了简单起见,我们使用一个Web服务器和一些在其上运行的应用程序的例子。
webserverangular色:
myappangular色需要能够添加一些设置到web 服务器的数据库创build之前必须应用的configuration。 它还必须在Web服务器首次发布之前执行一些操作。
myotherappangular色还需要在首次运行之前将一些设置添加到Web服务器的configuration中,而不需要从myapp取消设置。 在Web服务器首次启动之后,它还必须执行一些操作,重新启动它,做更多的工作,然后重新启动它。
(这是人为devise的,但expression了我真正的用例的所有需求,而不会更多地介绍PostgreSQL内部的知识)。
我以为我应该能够使用这个处理程序。 webserver只是在每个相关的步骤都会触发notify ,所以其他angular色可以挂钩这些通知以追加到列表中,或者将密钥添加到用于configuration模板的散列中,激发他们自己的任务等。拥有一个可以通过myotherapp每次通知的myotherapp处理程序想要重新启动,而不必知道如何重新启动实际执行。 等等
然而:
如果有通知,处理程序必须存在。 Ansible不允许可选的处理程序。
如果有多个通知处理程序,Ansible只会select第一个处理程序,而忽略所有其他处理程序。
通知仅在游戏部分结束时触发。 你不能马上开火 有meta: flush_handlers但它刷新所有的处理程序,甚至是其他不相关的angular色和任务,可能不会期望他们的处理程序提前运行的处理程序。
追加到列表中,或者将密钥添加到字典中是非常困难的。 所以很难host_vars多个相关的angular色,而不需要手动将configuration与一些host_vars yml粘合在一起。
所以处理程序和通知似乎不是如何做到这一点。
一个人如何写出合理的任务和angular色?
我想用自行车轮子作为锤子吗? 你只是不打算以这种方式使用angular色? 这似乎与angular色的概念是一致的。
如果把Ansible的tasks / roles / vars / etc这个系统放在Python里面作为一个Ansible模块来编写,那么可以重复使用或者不完全是线性的呢? 如果是这样,是否有实际的方法来实现Ansible任务列表,variablesyml文件等模块的大部分大脑,并在模块中只有控制逻辑,所以模块不必重新编译,实施吨的东西?
“PostgreSQL胆量”版本:
postgres_serverangular色。 根据需要从发行版软件包或源代码安装Pg。 在defaults/main.yml中有许多variables可以被覆盖来控制行为。 提供工具来模拟PostgreSQLconfiguration,为postgresql.conf提供参数。 让调用者覆盖或预先添加到pg_hba.conf行。 initdb的PostgreSQL一旦安装。 一旦configuration就启动PostgreSQL。 知道如何启动,停止并重新启动postgres_server (处理程序)。 公开事实来告诉安装PostgreSQL的其他angular色。
一个bdr_extensionangular色。 分配给在PostgreSQL中安装bdr扩展的主机。 需要查看postgres_sever暴露的事实来了解如何安装。 可以从git中获取/编译/安装BDR或者从OS包安装。
如果bdr位于configuration的shared_preload_libraries中,PostgreSQL 将无法成功启动 。 所以postgres_server启动服务器的时间必须延迟,直到安装完毕,如果启用了这个扩展。
一个bdr_nodeangular色。 取决于postgres_server和bdr_extension 。 知道允许BDR在PostgreSQL上运行所需的PostgreSQLconfiguration选项,例如max_wal_senders = 20 。 当postgres_server生成configuration时,需要能够确保PostgreSQLconfiguration选项shared_preload_libraries在逗号分隔的值列表中包含postgres_server 。 覆盖pg_hba.conf中的默认pg_hba.conf模板以启用复制条目。
这个angular色必须在 PostgreSQL启动后运行一些SQL命令。
一个pg_stat_statementsangular色。 可以从git或OS包安装pg_stat_statements扩展。 需要查看postgres_sever暴露的事实来了解如何安装。 需要能够附加一些扩展特定的行到postgresql.conf 。 需要能够将'pg_stat_statements'附加到PostgreSQL服务器configuration中的shared_preload_libraries设置中。
如果shared_preload_libraries位于configuration的pg_stat_statements中,则PostgreSQL 无法成功启动 。 所以postgres_server启动服务器的时间必须延迟,直到安装完毕,如果启用了这个扩展。
所以BDR节点是PostgreSQL服务器,并且具有BDR扩展和pg_stat_statements扩展以及其他扩展。
我希望能够在postgres_serverangular色中公开处理程序,并根据需要从其他angular色中调用它们来调用postgres_serverangular色中的相应活动,例如重新启动数据库服务器,但似乎并没有这样devise。
我是否将Ansibleangular色看作是实际build模angular色 ,从而完全倒退?
我不熟悉PostgreSQL,所以我不确定你提到的各种configuration文件的内容,但是如果你需要允许多个angular色贡献一个configuration文件,我已经用两种方法之一来完成关于什么configuration文件支持:
使用包含许多include语句的configuration文件来包含位于子目录中的其他configuration文件。 对于重写规则,特定于应用程序的configuration指令和虚拟主机,这适用于Apache等。
使用汇编模块从存储在目录中的多个部分configuration文件组assembly置文件。 我已经使用这个方法为Postfix构build一个master.cf文件,因为我有一个postfixangular色和另一个需要添加到Postfix master.cf文件的angular色。 所以我修改了postfixangular色来创build一个/etc/postfix/master.d目录和一个处理程序,将该目录中的文件组装成一个master.cf文件。 不幸的是,正如你所指出的,因为我不能从另一个angular色调用postfixangular色的处理程序,所以我必须在我的其他angular色中复制该处理程序。 这比想法稍微less一些,但是起作用,这是幂等的。