Следующийэтот ответ, Я хочу сделать копию конфигурации OpenSSL с определенным набором изменений. Исходный файл находится вне моего контроля, поэтому я не могу сделать его шаблоном.
На данный момент у меня есть:
- name: Make a copy
copy:
src: original.cnf
dest: copy.cnf
force: no
- name: Modify
ini_file:
path: copy.cnf
section: ...
option: ...
value: ...
Эта последовательность изменений идемпотентна, но если исходный файл изменится, изменение не будет распространено на копию. Если я изменю это на force: yes
, то исходные изменения будут распространены, но изменения будут выполняться каждый раз при запуске playbook. Это проблематично, так как мне нужно перезапускать зависимые службы в случае изменений, но очевидно, что это не должно происходить каждый раз.
Есть ли способ сохранить копию таким образом, чтобы целевой файл изменялся только в случае необходимости?
решение1
- 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
решение2
На основе ответа Джона я пришел к следующему фрагменту плейбука. Важная часть — это changed_when: False
, которая гарантирует, что только шаг, который изменяет копию целевого файла конфигурации, считается изменением.
- 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