{#
Copyright 2017-present Open Networking Foundation

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.
#}

# Dynamic resolv.conf(5) file for glibc resolver(3) generated by resolvconf(8)
# DO NOT EDIT THIS FILE BY HAND -- YOUR CHANGES WILL BE OVERWRITTEN
# Make changes to  /etc/resolvconf/resolv.conf.d instead
# Created by dns-configure/templates/head.j2
{% if unbound_listen_on_default %}
{% for host in groups['head'] %}
nameserver {{ hostvars[host].ansible_default_ipv4.address }}
{% endfor %}
{% endif %}
{% if dns_servers is defined %}
{% for ns in dns_servers %}
nameserver {{ ns }}
{% endfor %}
{% endif %}
