这是一个非常简单的代码片段,摘自我的“ kafka”角色:
- import_role:
name: java
notify:
- restart kafka
- restart zookeeper
基本上,我想安装运行“ java”角色的Java,并且当该角色执行了更改(例如Java已更新)时,然后重新启动“ kafka”和“ zookeeper”服务。事实证明,Ansible不会引发任何错误,也不会运行“通知”字段中指定的这些处理程序。
要解决此问题,我有什么选择?
P.S。 Java是手动安装的,而不是从存储库安装的。
答案 0 :(得分:0)
我在回答自己的问题。
问题
我一共有3个角色:
kafka
-安装 kafka 和 zookeeper 应用,配置,启用/启动服务等。ssl
-将证书复制到服务器特定的目录,仅此而已。更改证书后,我需要重新启动仅 kafka服务。java
-安装Java就是这样。更新Java后,我需要重新启动 b kafka和zookeeper服务。然后打算只运行kafka
角色,并在ssl
角色中包括其他java
和kafka
角色。像这样:
- import_role:
name: java
notify:
- restart kafka
- restart zookeeper
- import_role:
name: ssl
notify:
- restart kafka
我一直期望上面的代码能工作,因为为什么不呢? Ansible对此没有引发任何错误,但是默默地没有运行任何处理程序...
注意:ssl
和java
都是可重用角色,其他几个角色/剧本也使用过。
解决方法
我已将kafka
角色的处理程序更改为:
- name: restart kafka
service:
name: kafka
state: restarted
when: "'kafka_all' in group_names"
listen:
- restart SSL dependent services
- restart java dependent services
- restart kafka & zookeeper services
- name: restart zookeeper
service:
name: zookeeper
state: restarted
when: "'kafka_all' in group_names"
listen:
- restart java dependent services
- restart kafka & zookeeper services
然后在kafka
角色任务中更改代码,如下所示:
- import_role:
name: java
- import_role:
name: ssl
在java
和ssl
角色任务中,我都相应地添加了处理程序。像这样ssl
角色:
- name: upload SSL files
copy:
src: <hidden>
dest: <hidden>
notify: restart SSL dependent services
上面的所有代码可能还没有任何意义,但请熟悉以下要点:
kafka
的角色担任import
,而不是其他include
的角色。这意味着导入的角色(kafka
和ssl
)能够“看到” kafka
角色的处理程序。 Upstream note。listen
。这意味着任务可以调用指定的“侦听器”,并且它将自动调用所有侦听处理程序。如果没有绑定到侦听器的处理程序,它将不会运行任何东西(这是预期的行为)。when: "'kafka_all' in group_names"
只是因为我将kafka安装任务存储在任务文件install.yml
中,并在其中指定了notify: restart kafka & zookeeper services
,而问题是-我想安装我希望将Kafka用作服务的服务器上的Kafka以及只希望具有Kafka CLI工具的服务器上的Kafka(因此不启动任何服务)。这样的服务器不会成为kafka_all
的一部分,最终这些处理程序将不会执行。