목록에 정의된 링크만 유지하고 다른 링크는 제거하도록 Ansible에 지시하려면 어떻게 해야 합니까?

목록에 정의된 링크만 유지하고 다른 링크는 제거하도록 Ansible에 지시하려면 어떻게 해야 합니까?

다음을 달성하고 싶습니다. sites-enabled목록에 정의된 심볼릭 링크만 디렉터리에 존재합니다.{{ sites_enabled }}

특히 어려운 점은 목록에 정의된 링크에 대해서만 Ansible을 존재하게 하고 목록에 없는 링크를 제거하려면 어떻게 해야 하는지입니다.

다음 솔루션을 생각해 냈지만 최적은 아닙니다.

# 3. Disable all links (clean plate)
- name: Disable all enabled vhosts.
  file: path="{{ remote_enabled_cfg_dir }}/{{ item }}" state=absent
  with_fileglob:
    - "{{ remote_enabled_cfg_dir }}/*"

# 4. Enable only the approved vhosts / Create Link from sites-available to sites-enabled
- name: Enable only allowed vhosts
  file:
    src: "{{ remote_cfg_dir }}/{{ item }}"
    dest: "{{ remote_enabled_cfg_dir }}/{{ item }}"
    owner: root
    group: wheel
    state: link
  with_items: "{{ sites_enabled }}"
  notify: reload nginx

그러나 나는 나중에 다시 만들기 위해 유효한 심볼릭 링크를 모두 삭제하고 플레이할 때마다 nginx를 다시 로드해야 하는 것을 좋아하지 않습니다. (지난 콘테스트 이후 아무 것도 바뀌지 않았으면 좋겠고 Ansible은 아무 조치도 취하지 않기를 바랍니다.) 이를 달성하는 더 현명한 방법이 있습니까?

답변1

나는 사용한다차이점이러한 목적으로 Jinja 필터가 사용됩니다. 구성 디렉터리의 내용을 나열하는 작업을 추가하고 결과를 변수에 등록합니다. 그런 다음 유효한 파일 목록과 이전 단계에서 찾은 파일 간의 차이점을 찾아 구성 디렉터리에서 잘못된 항목을 제거하는 작업을 추가합니다.

- name: Get contents of config directory
  command: ls "{{ remote_cfg_dir }}"
  register: cfg_dir_contents
- name: Remove invalid files from config directory
  file:
    dest: "{{ remote_cfg_dir }}/{{ item }}"
    state: absent
  loop: "{{ cfg_dir_contents.stdout_lines | difference(sites_enabled) }}"

("sites_enabled"는 "remote_cfg_dir"에 있어야 하는 파일 이름 목록일 뿐이라고 가정)

관련 정보