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

时间:2015-11-04 08:37:03

标签: ansible ansible-playbook

在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核心模块。

3 个答案:

答案 0 :(得分: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 :(得分: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。你绝对应该使用角色。角色很棒。使用角色。角色!我们说够了吗?角色很棒。

答案 2 :(得分: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提供的那样使用寄存器/条件方式。在你的游戏中,只需一个任务,这并不重要。