如何在ansible中实现关于修改文件的条件逻辑?

问题描述 投票:1回答:3

在ansible中,我想仅在配置更改时重新启动服务。

这是一个例子:

- hosts: workers
  tasks:
  - lineinfile: 'dest=/etc/default/autofs regexp=^OPTIONS= line="OPTIONS=\"-O soft\"" backup=yes'
  - shell: service autofs reload

正如您所看到的,即使配置文件未更新,此代码也将始终重新启动autofs

如何改进,以便仅在配置文件更改时重新启动?

注意:这是一个非特定于autofs的通用问题,它可以应用于我想要执行某些内容的任何服务,如果配置文件已更改,可能是通过lineinfileini_file核心模块。

ansible ansible-playbook
3个回答
2
投票

首先,您应该在用完时使用service module来控制运行服务。一般来说,如果有一个适当的模块用于某些东西并且它可以满足您的需要,那么您应该这样做,并且只需要对边缘情况进行外壳处理。

此外,当一个Ansible任务运行它returns a series of facts,你可以注册,以便能够直接使用。这几乎总是包含一个changed属性,这是一个布尔说法是否Ansible认为它改变了某些东西(它不能总是知道。如果一个shell任务在stdout中返回一些东西,那么除非你用changed_when直接覆盖它,否则它会假设一些变化)。

所以你可以用这样的东西:

- hosts: workers
  tasks:
  - name: Set autofs options
    lineinfile: 'dest=/etc/default/autofs regexp=^OPTIONS= line="OPTIONS=\"-O soft\"" backup=yes'
    register: result

  - name: reload autofs is autofs options are changed
    service: name=autofs state=reloaded
    when: result.changed

1
投票

如果您要在剧本中创建角色而不是使用松散任务,则可以使用handlers。另见Best practices: Task And Handler Organization For A Role

角色的任务文件:

- name: Change autofs config
  lineinfile: dest=/etc/default/autofs
              regexp=^OPTIONS=
              line="OPTIONS=\"-O soft\""
              backup=yes
  notify:
    - Restart autfs

然后在相同角色的处理程序文件中:

- name: Restart autfs
  service: name=autfs
           state=restarted

只要配置任务的状态发生变化,处理程序就会收到通知。

PS:我使用service module来管理服务。如果没有可用于您的任务的特定模块,则只应使用shell模块

Regarding roles:

但是你肯定想要做的一件事是使用“角色”组织功能,它被记录为主要剧本页面的一部分。见Playbook Roles and Include Statements。你绝对应该使用角色。角色很棒。使用角色。角色!我们说够了吗?角色很棒。


0
投票

我知道这已经过时了,但是我对此感到满意,觉得还有更多可以补充其他人已经回答的内容。您应该使用处理程序,但不需要谨慎使用处理程序。以下是直接在剧本中使用的处理程序示例。

---
- hosts: workers
  tasks:
    - lineinfile: 'dest=/etc/default/autofs regexp=^OPTIONS= line="OPTIONS=\"-O soft\"" backup=yes'
      notify: reload autofs
  handlers:
    - name: reload autofs
      service: name=autofs state=reloaded

有一点需要注意......处理程序在比赛结束时开始。因此,如果您有多个任务,并且您希望处理程序在通知它的任务之后触发,那么您可能会遇到困难。如果你需要处理程序按照你的任务顺序启动,你可以对flush_handlers执行'meta'任务,或者你可以像ydaetskcoR提供的那样使用寄存器/条件方式。在你的游戏中,只需一个任务,这并不重要。

© www.soinside.com 2019 - 2024. All rights reserved.