处理 Ansible 的 import_tasks/import_role 和 "notify" 的最佳方法是什么?

What is the best way to deal with Ansible's import_tasks/import_role and "notify"?

这是从我的“kafka”角色中提取的一个非常简单的代码片段:

- import_role:
    name: java
  notify:
    - restart kafka
    - restart zookeeper

基本上我想安装 Java 运行 “java” 角色,当该角色执行更改时(例如 Java 已更新),然后重新启动“kafka”和“zookeeper”服务。事实证明,Ansible 不会抛出任何错误,也不会 运行 这些在“通知”字段中指定的处理程序。

我可以选择什么来解决这个问题?

P.S。 Java 正在手动安装,而不是从存储库安装。

我正在回答我自己的问题。


问题

我总共有3个角色:

  • kafka - 安装 kafkazookeeper 应用程序,配置,enables/starts 服务等
  • ssl - 将证书复制到服务器特定目录,仅此而已。更改证书后,我需要重新启动 kafka服务。
  • java - 安装 java 就是这样。当java更新后,我需要重启both kafka和zookeeper服务

当时的目的是 运行 仅 kafka 角色,并在 kafka 角色中包含其他 ssljava 角色。像这样:

- import_role:
    name: java
  notify:
    - restart kafka
    - restart zookeeper

- import_role:
    name: ssl
  notify:
    - restart kafka

我一直期待上面的代码能工作,为什么不呢? Ansible 没有对此抛出任何错误,但默默地没有 运行 任何处理程序...

注意:ssljava 都是 re-usable 角色,很少有人使用 roles/playbooks。


解决方法

我已经将 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

并且在 javassl 角色任务中,我相应地添加了处理程序。像这样 ssl 角色:

- name: upload SSL files
  copy:
    src: <hidden>
    dest: <hidden>
  notify: restart SSL dependent services

以上所有代码可能还没有任何意义,但请熟悉以下要点:

  1. 我在 kafka 角色中 import 而不是 include 其他角色。这意味着导入的角色(kafkassl)能够“看到”kafka 角色的处理程序。 Upstream note.
  2. 我正在使用 Ansible's 2.8 new feature called listen。这意味着任务可以调用指定的“侦听器”,它会自动调用所有侦听处理程序。如果没有绑定到侦听器的处理程序,它不会 运行 任何东西(这是预期的行为)。
  3. 没那么重要,但我使用 when: "'kafka_all' in group_names" 只是因为我将 kafka 安装任务存储在任务文件 install.yml 中并且我在那里指定 notify: restart kafka & zookeeper services 事情是 - 我想要在我希望将 Kafka 作为服务的服务器上以及在我只想拥有 Kafka CLI 工具的服务器上安装 Kafka(因此不会启动任何服务)。这样的服务器不会成为 kafka_all 的一部分,最终这些处理程序将不会被执行。