我在伪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
- 这看起来像是一个黑客。
- 它总是说“/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
(未测试)
- 请注意,处理程序只会运行一次。引用处理程序:
这些“通知”动作在游戏中每个任务块结束时触发,即使被多个不同的任务通知也只会触发一次。