openstack-ansible/playbooks/unbound-install.yml
Logan V d651ed70f4 Unbound DNS resolution containers
Optionally deploy unbound DNS caching resolvers in lieu of
managing /etc/hosts across all hosts.

This is an opt-in optimization providing centralized DNS
resolution containers to allow intra-cluster name resolution
identical to what openstack_hosts provides with its /etc/hosts
management.

Managing /etc/hosts is very inefficient and cumbersome in large
environments with lots of hosts, so this change allows for a
quicker and more consistent deployment using centralized resolvers.

Change-Id: Ibbc1fc77aa42c1a530e2f52a5c3c4ed86d0fe8ea
2016-08-26 10:11:22 -05:00

95 lines
3.3 KiB
YAML

---
# Copyright 2016, Logan Vig <logan2211@gmail.com>
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
- name: Install unbound DNS resolvers
hosts:
- unbound_all
gather_facts: "{{ gather_facts | default(True) }}"
user: root
roles:
- role: "unbound"
tags:
- unbound_server
- role: "system_crontab_coordination"
tags:
- "system-crontab-coordination"
vars:
is_metal: "{{ properties.is_metal|default(false) }}"
- name: Install unbound DNS resolver client configurations
hosts:
- "!unbound_all"
- all
user: root
pre_tasks:
#gather a list of physical_hosts containing unbound containers
- name: Set unbound physical hosts fact
set_fact:
unbound_physical_hosts: >
{% set _var = [] -%}
{% for i in groups[resolvconf_resolver_group] -%}
{% if hostvars[i]['physical_host'] is defined -%}
{% if _var.append(hostvars[i]['physical_host']) -%}{% endif -%}
{% endif -%}
{% endfor -%}
{{ _var }}
when: resolvconf_enabled | bool
#create a sorted resolver list with affinity toward unbound container(s)
#on the same physical_host
- name: Apply resolver sorting
set_fact:
resolver_list: >
{% set _var = [] -%}
{% for i in groups[resolvconf_resolver_group] -%}
{% if physical_host is defined
and hostvars[i]['physical_host'] is defined
and physical_host == hostvars[i]['physical_host'] -%}
{% if _var.append(dict(host=hostvars[i]['ansible_ssh_host'], priority=100)) -%}{% endif -%}
{% else -%}
{% if _var.append(dict(host=hostvars[i]['ansible_ssh_host'], priority=50)) -%}{% endif -%}
{% endif -%}
{% endfor -%}
{{ _var }}
when:
- resolvconf_enabled | bool
- physical_host is defined
- physical_host in unbound_physical_hosts
- name: Set resolver IP list fact
set_fact:
resolvconf_resolver_ips: "{{ resolver_list | sort(reverse=true, attribute='priority') | map(attribute='host') | list }}"
resolvconf_options:
- 'timeout:1'
when:
- resolvconf_enabled | bool
- resolver_list is defined
- resolver_list | length > 0
#rotate is only used when no physical_host affinity is defined
- name: Set resolver rotate when physical_host is not an unbound host
set_fact:
resolvconf_options:
- 'timeout:1'
- 'rotate'
when:
- resolvconf_enabled | bool
- resolver_list is not defined
roles:
- role: "resolvconf"
when: resolvconf_enabled | bool
tags:
- unbound_client
vars:
#Only run the resolvconf role when DNS containers are deployed to the env.
resolvconf_enabled: "{{ groups['unbound_all'] is defined and groups['unbound_all'] | length > 0 }}"