リストに定義されているリンクのみを保持し、他のリンクを削除するように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」にある必要があるファイル名のリストにすぎないとします)

関連情報