Occasionally a yum update restores conf.d/default.conf
on my CentOS 7 installs, and other times I just need to remove a site from its current server. My Nginx role in Ansible creates and updates server definitions for me, but I wanted the option to wipe out any configs I hadn't specifically defined for a server. It would take care of both my above cases, as well as any other site configs that may have snuck their way into my server, say if I had been testing something and left a config behind.
In the role defaults/main.yml
I use a boolean that defaults to no
for removing unmanaged sites. I like having to explicitly enable this behavior for each server since it is destructive.
In the first task I run a basic find
command to locate all files regardless of extension in the Nginx config dir. I don't want anything but active configs in there. It is idempotent so allowed to run even in --check
mode.
The second task required building the right when:
filter, which was done with a little guidance from here and here. My Nginx role mentioned above uses a dict
with the base name of each config (ie: myapp
) as the keys. We pass the keys into the Jinja2 filter that appends .conf
to each key, then returns the modified keys as a list in the format: [myapp.conf, othersite.conf, ...]
. With that list in hand it is easy to loop over the output of our find
command and any filenames found which don't match our key list take a trip to our 51st state: absent
. Get it? I'll see myself out.
# setting in role defaults
nginx_remove_unmanaged_sites: no
# Find every file in the conf.d dir
# Allow to run in check mode, mark task as "never changed"
- name: Find existing site configs
shell: find /etc/nginx/conf.d -type f -printf "%f\n"
register: contents
when: nginx_remove_unmanaged_sites
check_mode: no
changed_when: no
# remove files found above that aren't in nginx_sites
# append '.conf' to each key in nginx_sites with some regex magic
- name: Remove unmanaged configs
file:
path: "/etc/nginx/conf.d/{{ item }}"
state: absent
with_items: "{{ contents.stdout_lines }}"
when: nginx_remove_unmanaged_sites and item not in nginx_sites.keys()|map('regex_replace','^(.*)$','\\1.conf')|list
notify:
- reload nginx