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