如何将非常相似的通知处理程序合并在一起?

43次阅读
没有评论

问题描述

在使用Ansible角色时,使用handlers通过systemd模块重启服务。他想知道是否有一种方法可以将这三个独立的处理程序参数化为类似于以下的形式:

- name: restart {{svcname}}
  systemd:
    name: '{{svcname}}'
    enabled: yes
    state: restarted
  become: true

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Ansible 2.7及更早版本中,处理程序名称中的变量不会被填充。这是一个已报告的错误,并且最近在开发版本中推送了一个修正。您需要从开发版本运行Ansible,并希望他们在下一个发布中发布此修复。

方案2

您可以设置一个事实,作为您需要通过处理程序重新启动的服务列表:

- name: Tag services to restart
  set_fact:
    services_to_restart:
      - ntp
      - nginx
      - grafana

然后,您的处理程序变为:

- name: Restart tagged services
  service:
    name: "{{ item }}"
    state: restarted
  loop: "{{ services_to_restart }} | default('nginx')"

建议在那里使用一个合理的默认值,以防将一个空列表发送给服务模块。

方案3

这种方法将为每个通知重新启动所有服务,因此只需将您想要的服务放入变量中。
1. 这将为每个通知重新启动所有服务。
2. 这就是为什么您只需要将您想要的服务放入变量中。
3. 但是,如果一个任务只需要重新启动ntp,nginx和grafana也将被重新启动。
4. @BruceBecker 谢谢你。但是这违背了处理程序的整个目的,不是吗?为了弄清楚是否需要将特定的服务名称放入列表中,我必须首先注册一个唯一命名的变量,然后在随后的set_fact任务中检查该任务是否改变了任何内容。处理程序的目的是使整个过程无缝和低维护。通过使用像您提出的方法这样的方法,我将失去所有这些优点,即使它可能在技术上是可行的。
5. 好的,观点很好。@storm的答案也更正确,所以我建议您将其作为“正确”的答案接受。

正文完