ansible:如果文件不存在或源较新,则运行命令

ansible:如果文件不存在或源较新,则运行命令

我在伪Makefile中有以下要求:

/etc/postfix/sasl_passwd.db: /etc/postfix/sasl_passwd
  postmap /etc/postfix/sasl_passwd

换句话说,我想运行postmap <...>当且仅当在本次运行中/etc/postfix/sasl_passwd.db不存在或/etc/postfix/sasl_passwd已更改。

我提出了以下任务:

- name: /etc/potfix/sasl_passwd
  become: yes
  template:
    src: templates/sasl_passwd.j2
    dest: /etc/postfix/sasl_passwd
    mode: 0600
  register: sasl_passwd
- name: /etc/postfix/sasl_passwd.db exists?
  shell: test -f /etc/postfix/sasl_passdb.db
  failed_when: False
  register: sasl_passwd_exists
- name: postmap /etc/postfix/sasl_passwd
  become: yes
  shell: postmap /etc/postfix/sasl_passwd
  args:
    creates: /etc/postfix/sasl_passwd.db
  when: sasl_passwd.changed or sasl_passwd_exists.rc != 0
  1. 这看起来像是一个黑客。
  2. 它总是说“/etc/postfix/sasl_passwd.db存在?”步骤已更改(即提示中的黄色)。

when不会削减它,因为它会忽略sasl_passwd前提条件。即,一旦任何类型的sasl_passwd.db文件存储在磁盘上,它就永远不会运行。

如何使postup命令在更改后运行sasl_passwd

答案1

问:“它总是说“/etc/postfix/sasl_passwd.db存在?`步骤已更改(即提示中的黄色)。”

- name: /etc/postfix/sasl_passwd.db exists?
  shell: test -f /etc/postfix/sasl_passwd.db
  failed_when: False
  register: sasl_passwd_exists

答:模块shell无属性creates不是幂等的。使用模块统计数据反而

- name: /etc/postfix/sasl_passwd.db exists?
  stat:
    path: /etc/postfix/sasl_passwd.db
  register: sasl_passwd_exists

查看结果“sasl_passwd_存在”。使用这个条件

  when: not sasl_passwd_exists.stat.exists

问:“一旦任何类型的 sasl_passwd.db 位于磁盘上,它就永远不会运行”

- name: postmap /etc/postfix/sasl_passwd
  become: yes
  shell: postmap /etc/postfix/sasl_passwd
  args:
    creates: /etc/postfix/sasl_passwd.db
  when: sasl_passwd.changed or sasl_passwd_exists.rc != 0

A:删除属性creates。当文件存在时,任务将不会运行/etc/postfix/sasl_passwd.db存在。这不是你想要的。您想在以下时间运行该命令“sasl_passwd.已更改”(或者当不存在时)。

- name: postmap /etc/postfix/sasl_passwd
  become: yes
  shell: postmap /etc/postfix/sasl_passwd
  when: sasl_passwd.changed or
        (not sasl_passwd_exists.stat.exists)

笔记

  • 使用命令模块而不是如果可能。引用自笔记

如果您想通过 shell 运行命令(假设您正在使用 <、>、| 等),您实际上需要 shell 模块。如果引用不正确,解析 shell 元字符可能会导致执行意外的命令,因此更安全尽可能使用命令模块

  • 使用处理程序。这是 Ansible 的方式“根据变化进行操作”。例如
tasks:
  - name: Notify handler when db does not exist.
    stat:
      path: /etc/postfix/sasl_passwd.db
    register: sasl_passwd_exists
    changed_when: not sasl_passwd_exists.stat.exists
    notify: run postmap
  - name: Create sasl_passwd and notify the handler when changed.
    become: yes
    template:
      src: templates/sasl_passwd.j2
      dest: /etc/postfix/sasl_passwd
      mode: 0600
    notify: run postmap

handlers:
  - name: run postmap
    become: true
    command: postmap /etc/postfix/sasl_passwd

(未测试)


  • 请注意,处理程序只会运行一次。引用处理程序

这些“通知”动作在游戏中每个任务块结束时触发,即使被多个不同的任务通知也只会触发一次。

相关内容