Como gerenciar uma cópia modificada de um arquivo?

Como gerenciar uma cópia modificada de um arquivo?

Seguindoesta resposta, quero fazer uma cópia da configuração do OpenSSL, com um conjunto específico de alterações. O arquivo original está fora do meu controle, então não posso transformá-lo em um modelo.

No momento eu tenho:

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

Essa sequência de alterações é idempotente, mas se o arquivo original for alterado, a alteração não será propagada para a cópia. Se eu mudar para force: yes, as alterações originais serão propagadas, mas as alterações serão executadas sempre que o manual for executado. Isso é problemático, pois preciso reiniciar os serviços dependentes em caso de alterações, mas obviamente isso não deve acontecer sempre.

Existe uma maneira de manter uma cópia de forma que o arquivo de destino seja modificado se e somente se for necessário?

Responder1

- 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

Responder2

Com base na resposta de John, acabei com o seguinte fragmento do manual. A parte importante é changed_when: Falsegarantir que apenas a etapa que modifica a cópia do arquivo de configuração de destino seja contada como uma alteração.

- 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

informação relacionada