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