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_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)

ノート

シェルを介してコマンドを実行するには(<、>、|などを使用すると仮定)、実際にはシェルモジュールが必要です。誤って引用された場合、シェルメタ文字を解析すると、予期しないコマンドが実行される可能性があるため、より安全です。可能な場合はいつでもコマンドモジュールを使用してください。

  • 使用マネージャー。これが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

(未検証)


この「通知」アクションは、ゲーム内の各クエストブロックの終わりにトリガーされ、複数の異なるクエストから通知を受けても一度だけトリガーされます。

おすすめ記事