¿Cómo gestionar una copia modificada de un archivo?

¿Cómo gestionar una copia modificada de un archivo?

Siguienteesta respuesta, Quiero hacer una copia de la configuración de OpenSSL, con un conjunto específico de cambios. El archivo original está fuera de mi control, por lo que no puedo convertirlo en plantilla.

Por el momento tengo:

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

Esta secuencia de cambios es idempotente, pero si el archivo original cambia, el cambio no se propagará a la copia. Si cambio esto a force: yes, los cambios originales se propagarán, pero se realizarán cada vez que se ejecute el libro de estrategias. Esto es problemático, ya que necesito reiniciar los servicios dependientes en caso de cambios, pero obviamente esto no debe suceder siempre.

¿Existe alguna manera de mantener una copia de tal manera que el archivo de destino se modifique si y solo si es necesario?

Respuesta1

- 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

Respuesta2

Según la respuesta de John, terminé con el siguiente fragmento del libro de jugadas. La parte importante es changed_when: False, que garantiza que solo el paso que modifica la copia del archivo de configuración de destino se cuente como cambio.

- 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

información relacionada