我想要实现以下目标 - 在目录中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”中应存在的文件名称列表)