Ansibleangular色中的callback或挂钩以及可重用的一系列任务

我正在努力使我的Ansibleangular色有一定的可组合性和可重用性。

我有一个angular色执行几个系列的步骤。 根据应用于主机的其他angular色,其他angular色需要在每个步骤运行任务。

我正在使用PostgreSQL和PostgreSQL扩展pipe理,但为了简单起见,我们使用一个Web服务器和一些在其上运行的应用程序的例子。

  • angular色:web服务器
  • angular色:myapp
  • angular色:myotherapp

webserverangular色:

  • 安装networking服务器
  • 模板它的configuration
  • build立它的数据库
  • 启动networking服务器

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_serverbdr_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文件支持:

  1. 使用包含许多include语句的configuration文件来包含位于子目录中的其他configuration文件。 对于重写规则,特定于应用程序的configuration指令和虚拟主机,这适用于Apache等。

  2. 使用汇编模块从存储在目录中的多个部分configuration文件组assembly置文件。 我已经使用这个方法为Postfix构build一个master.cf文件,因为我有一个postfixangular色和另一个需要添加到Postfix master.cf文件的angular色。 所以我修改了postfixangular色来创build一个/etc/postfix/master.d目录和一个处理程序,将该目录中的文件组装成一个master.cf文件。 不幸的是,正如你所指出的,因为我不能从另一个angular色调用postfixangular色的处理程序,所以我必须在我的其他angular色中复制该处理程序。 这比想法稍微less一些,但是起作用,这是幂等的。