我正在努力让我的 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 ×1