【问题标题】:What is the best way to deal with Ansible's import_tasks/import_role and "notify"?处理 Ansible import_tasks/import_role 和“通知”的最佳方法是什么?
【发布时间】:2020-09-17 07:57:45
【问题描述】:

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

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

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

我有什么办法可以解决这个问题?

附: Java 是手动安装的,而不是从存储库安装的。

【问题讨论】:

标签: ansible code-duplication ansible-role


【解决方案1】:

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


问题

我一共有 3 个角色:

  • kafka - 安装 kafkazookeeper 应用,配置,启用/启动服务等。
  • ssl - 将证书复制到服务器特定目录,仅此而已。更改证书时,我需要重启 only 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 都是可重复使用的角色,由少数其他角色/剧本使用。


解决方法

我已将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 &amp; zookeeper services 问题是-我想在我想要的服务器上安装Kafka Kafka 作为服务以及在我只想拥有 Kafka CLI 工具的服务器上(因此不启动任何服务)。这样的服务器不会成为kafka_all 的一部分,最终这些处理程序不会被执行。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-06
    • 2018-07-28
    • 2012-09-18
    • 2011-05-20
    • 2016-05-26
    • 2018-12-03
    • 1970-01-01
    相关资源
    最近更新 更多