Postfix
ansible:如果文件不存在或源較新,則執行命令
我在偽Makefile中有以下要求:
/etc/postfix/sasl_passwd.db: /etc/postfix/sasl_passwd postmap /etc/postfix/sasl_passwd
換句話說,我想執行
postmap <...>
iff/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
?
問:“它總是說“/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
A:*
shell
沒有屬性creates
*的模組不是冪等的。改用模組stat- name: /etc/postfix/sasl_passwd.db exists? stat: path: /etc/postfix/sasl_passwd.db register: sasl_passwd_exists
查看結果*“sasl_passwd_exists”*。使用這個條件
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.changed”*(或不存在時)執行該命令。- 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
(未測試)
- 請注意,處理程序只會執行一次。報價處理程序:
這些“通知”動作在播放中的每個任務塊結束時觸發,即使由多個不同的任務通知,也只會觸發一次。