处理Ansible的import_tasks / import_role和“通知”的最佳方法是什么?

时间:2020-09-17 07:57:45

标签: ansible code-duplication ansible-role

这是一个非常简单的代码片段,摘自我的“ kafka”角色:

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

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

要解决此问题,我有什么选择?

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

1 个答案:

答案 0 :(得分:0)

我在回答自己的问题。


问题

我一共有3个角色:

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

然后打算只运行kafka角色,并在ssl角色中包括其他javakafka角色。像这样:

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

- import_role:
    name: ssl
  notify:
    - restart kafka

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

注意:ssljava都是可重用角色,其他几个角色/剧本也使用过。


解决方法

我已将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以及只希望具有Kafka CLI工具的服务器上的Kafka(因此不启动任何服务)。这样的服务器不会成为kafka_all的一部分,最终这些处理程序将不会执行。
相关问题