Postfix

ansible:如果文件不存在或源較新,則執行命令

  • June 12, 2021

我在偽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
  1. 這似乎是一個黑客。
  2. 它總是說“/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

(未測試)


  • 請注意,處理程序只會執行一次。報價處理程序

這些“通知”動作在播放中的每個任務塊結束時觸發,即使由多個不同的任務通知,也只會觸發一次。

引用自:https://unix.stackexchange.com/questions/594744