处理 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
- 安装 kafka 和 zookeeper 应用程序,配置,enables/starts 服务等
ssl
- 将证书复制到服务器特定目录,仅此而已。更改证书后,我需要重新启动仅 kafka服务。
java
- 安装 java 就是这样。当java更新后,我需要重启both kafka和zookeeper服务
当时的目的是 运行 仅 kafka
角色,并在 kafka
角色中包含其他 ssl
和 java
角色。像这样:
- import_role:
name: java
notify:
- restart kafka
- restart zookeeper
- import_role:
name: ssl
notify:
- restart kafka
我一直期待上面的代码能工作,为什么不呢? Ansible 没有对此抛出任何错误,但默默地没有 运行 任何处理程序...
注意:ssl
和 java
都是 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
并且在 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.
- 我正在使用 Ansible's 2.8 new feature called
listen
。这意味着任务可以调用指定的“侦听器”,它会自动调用所有侦听处理程序。如果没有绑定到侦听器的处理程序,它不会 运行 任何东西(这是预期的行为)。
- 没那么重要,但我使用
when: "'kafka_all' in group_names"
只是因为我将 kafka 安装任务存储在任务文件 install.yml
中并且我在那里指定 notify: restart kafka & zookeeper services
事情是 - 我想要在我希望将 Kafka 作为服务的服务器上以及在我只想拥有 Kafka CLI 工具的服务器上安装 Kafka(因此不会启动任何服务)。这样的服务器不会成为 kafka_all
的一部分,最终这些处理程序将不会被执行。
这是从我的“kafka”角色中提取的一个非常简单的代码片段:
- import_role:
name: java
notify:
- restart kafka
- restart zookeeper
基本上我想安装 Java 运行 “java” 角色,当该角色执行更改时(例如 Java 已更新),然后重新启动“kafka”和“zookeeper”服务。事实证明,Ansible 不会抛出任何错误,也不会 运行 这些在“通知”字段中指定的处理程序。
我可以选择什么来解决这个问题?
P.S。 Java 正在手动安装,而不是从存储库安装。
我正在回答我自己的问题。
问题
我总共有3个角色:
kafka
- 安装 kafka 和 zookeeper 应用程序,配置,enables/starts 服务等ssl
- 将证书复制到服务器特定目录,仅此而已。更改证书后,我需要重新启动仅 kafka服务。java
- 安装 java 就是这样。当java更新后,我需要重启both kafka和zookeeper服务
当时的目的是 运行 仅 kafka
角色,并在 kafka
角色中包含其他 ssl
和 java
角色。像这样:
- import_role:
name: java
notify:
- restart kafka
- restart zookeeper
- import_role:
name: ssl
notify:
- restart kafka
我一直期待上面的代码能工作,为什么不呢? Ansible 没有对此抛出任何错误,但默默地没有 运行 任何处理程序...
注意:ssl
和 java
都是 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
并且在 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. - 我正在使用 Ansible's 2.8 new feature called
listen
。这意味着任务可以调用指定的“侦听器”,它会自动调用所有侦听处理程序。如果没有绑定到侦听器的处理程序,它不会 运行 任何东西(这是预期的行为)。 - 没那么重要,但我使用
when: "'kafka_all' in group_names"
只是因为我将 kafka 安装任务存储在任务文件install.yml
中并且我在那里指定notify: restart kafka & zookeeper services
事情是 - 我想要在我希望将 Kafka 作为服务的服务器上以及在我只想拥有 Kafka CLI 工具的服务器上安装 Kafka(因此不会启动任何服务)。这样的服务器不会成为kafka_all
的一部分,最终这些处理程序将不会被执行。