파일의 수정된 복사본을 관리하는 방법은 무엇입니까?

파일의 수정된 복사본을 관리하는 방법은 무엇입니까?

수행원이 답변, 특정 변경 사항을 적용하여 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

관련 정보