以下を達成したいと思います。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」にある必要があるファイル名のリストにすぎないとします)