수행원이 답변, 특정 변경 사항을 적용하여 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
원래 변경 사항이 전파되지만 플레이북이 실행될 때마다 변경 사항이 수행됩니다. 변경 시 종속 서비스를 다시 시작해야 하기 때문에 문제가 되지만, 매번 이런 일이 발생해서는 안 됩니다.
필요한 경우에만 대상 파일을 수정하는 방식으로 복사본을 유지하는 방법이 있습니까?
답변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
John의 답변을 바탕으로 다음과 같은 플레이북 조각을 만들었습니다. 중요한 부분은 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