Wie verwalte ich eine geänderte Kopie einer Datei?

Wie verwalte ich eine geänderte Kopie einer Datei?

Gefolgtdiese Antwort, ich möchte eine Kopie der OpenSSL-Konfiguration mit einer bestimmten Reihe von Änderungen erstellen. Die Originaldatei liegt außerhalb meiner Kontrolle, daher kann ich sie nicht als Vorlage verwenden.

Im Moment habe ich:

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

Diese Änderungssequenz ist idempotent, aber wenn sich die Originaldatei ändert, wird die Änderung nicht an die Kopie weitergegeben. Wenn ich dies in ändere force: yes, werden die ursprünglichen Änderungen weitergegeben, aber die Änderungen werden jedes Mal ausgeführt, wenn das Playbook ausgeführt wird. Dies ist problematisch, da ich im Falle von Änderungen abhängige Dienste neu starten muss, aber dies darf natürlich nicht jedes Mal passieren.

Gibt es eine Möglichkeit, eine Kopie so zu verwalten, dass die Zieldatei nur dann geändert wird, wenn dies erforderlich ist?

Antwort1

- 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

Antwort2

Basierend auf Johns Antwort bin ich zu folgendem Playbook-Fragment gekommen. Der wichtige Teil ist changed_when: False, der sicherstellt, dass nur der Schritt, der die Kopie der Zielkonfigurationsdatei ändert, als Änderung gezählt wird.

- 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

verwandte Informationen