ファイルの変更されたコピーを管理するにはどうすればよいですか?

ファイルの変更されたコピーを管理するにはどうすればよいですか?

続くこの答え、特定の変更を加えた OpenSSL の設定のコピーを作成したいと考えています。元のファイルは私の管理外にあるため、テンプレートにすることはできません。

現時点では、次のものがあります:

  - name: Make a copy
    copy:
      src: original.cnf
      dest: copy.cnf
      force: no
  - name: Modify
    ini_file:
      path: copy.cnf
      section: ...
      option: ...
      value: ...

この変更のシーケンスはべき等ですが、元のファイルが変更されても、その変更はコピーに伝播されません。これを に変更すると、force: yes元の変更は伝播されますが、プレイブックが実行されるたびに変更が実行されます。変更があった場合は依存サービスを再起動する必要があるため、これは問題になりますが、明らかにこれは毎回発生してはいけません。

必要な場合にのみターゲット ファイルが変更されるようにコピーを維持する方法はありますか?

答え1

- block:
  name: These two are changed every time as modifications are not in original.cnf
  - name: Make a temporary copy
    copy:
      src: original.cnf
      dest: temp.cnf
      force: yes
  - name: Modify temporary copy
    ini_file:
      path: temp.cnf
      section: ...
      option: ...
      value: ...

- block:
  name: With same original.cnf and same modifications, the result will be already installed
  - name: Idempotent copy into place
    register: openssl_config_install
    copy:
      src: temp.cnf
      dest: copy.cnf
      force: yes


- assert:
    that:
      - openssl_config_install is not changed

答え2

John の回答に基づいて、次のプレイブック フラグメントを作成しました。重要な部分はchanged_when: False、ターゲット構成ファイルのコピーを変更するステップのみが変更としてカウントされるようにする です。

- name: Create OpenSSL config copy
  block:
  - name: Create temporary file for the config's copy
    tempfile:
    register: tempfile
    changed_when: False
  - name: Copy openssl.cnf to the temporary file
    copy:
      src: "{{ openssl_cnf_source }}"
      dest: "{{ tempfile.path }}"
      mode: 0644  # Without this the next `copy` task can have issues reading the file.
    changed_when: False
  - name: Modify openssl.cnf in the temporary file
    ini_file:
      path: "{{ tempfile.path }}"
      section: ...
      option: ...
      value: ...
    changed_when: False
  - name: Copy the temporary file to the target OpenSSL config
    copy:
      src: "{{ tempfile.path }}"
      dest: "{{ openssl_cnf_copy }}"
      mode: 0644
      owner: ...
    notify:
      - ...
  - name: Delete the temporary file
    file:
      path: "{{ tempfile.path }}"
      state: absent
    changed_when: False

関連情報