add unbound_resolver role
This commit is contained in:
parent
6679277418
commit
dd1900fffe
13
ansible/roles/unbound_resolver/.yamllint
Normal file
13
ansible/roles/unbound_resolver/.yamllint
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
extends: default
|
||||||
|
|
||||||
|
rules:
|
||||||
|
braces:
|
||||||
|
max-spaces-inside: 1
|
||||||
|
level: error
|
||||||
|
brackets:
|
||||||
|
max-spaces-inside: 1
|
||||||
|
level: error
|
||||||
|
line-length: disable
|
||||||
|
# NOTE(retr0h): Templates no longer fail this lint rule.
|
||||||
|
# Uncomment if running old Molecule templates.
|
||||||
|
# truthy: disable
|
||||||
81
ansible/roles/unbound_resolver/README.md
Normal file
81
ansible/roles/unbound_resolver/README.md
Normal file
@ -0,0 +1,81 @@
|
|||||||
|
# Unbound
|
||||||
|
|
||||||
|
This role install and configure an Unbound resolver.
|
||||||
|
It also install a prometheus exporter compiled from [letsencrypt/unbound_exporter](https://github.com/letsencrypt/unbound_exporter)
|
||||||
|
|
||||||
|
## Targets
|
||||||
|
|
||||||
|
- Debian
|
||||||
|
|
||||||
|
## Role variables
|
||||||
|
|
||||||
|
- ``unbound_interfaces``: list of interfaces Unbound has to listen on. If not specified, Unbound will listen on 0.0.0.0.
|
||||||
|
- ``unbound_authorized_cidrs``: list of authorized CIDRS to query the resolver. As Unbound rejects everything by default, if none is set, the resolver won't answer to anyone.
|
||||||
|
- ``unbound_threads``: number of threads Unbound runs on. (default: 1)
|
||||||
|
- ``unbound_cache_size``: size of Unbound cache, in Mb. (default: 100)
|
||||||
|
- ``unbound_zones``: dictionnary about zones that need to be forwarded to another DNS server. It contains info for every managed zone :
|
||||||
|
``name``: name of the zone
|
||||||
|
``forward_ip``: list of the servers to forward queries to
|
||||||
|
``private``: boolean, has to be specified for dummies zones (ex: .priv). It disables DNSSEC validation for thoses zones.
|
||||||
|
|
||||||
|
Zones that are not explicitely specified in forwards will be forwarded to root servers.
|
||||||
|
|
||||||
|
## Prometheus exporter
|
||||||
|
|
||||||
|
* For the exporter to work properly you need to run the following command on each resolver :
|
||||||
|
```
|
||||||
|
unbound-control-setup
|
||||||
|
```
|
||||||
|
* You also need to ensure that the "extended-statistics: yes" directive is in the conf (it is here).
|
||||||
|
* The exporter configuration can be change by modifying the systemd service template.
|
||||||
|
|
||||||
|
## Unbound logging
|
||||||
|
|
||||||
|
In order to enable query log, you need to do the following :
|
||||||
|
* Add the following directives to the config :
|
||||||
|
```
|
||||||
|
logfile: "/var/log/unbound/unbound.log"
|
||||||
|
log-time-ascii: yes
|
||||||
|
log-queries: yes
|
||||||
|
log-replies: yes # will log informations about the reply, slows response time.
|
||||||
|
```
|
||||||
|
* Add the following line in /etc/apparmor.d/usr.sbin.unbound (with the comma) :
|
||||||
|
```
|
||||||
|
/var/log/unbound/unbound.log rw,
|
||||||
|
```
|
||||||
|
* Run the following commands to create both directory and file for logging :
|
||||||
|
```
|
||||||
|
mkdir /var/log/unbound
|
||||||
|
touch /var/log/unbound/unbound.log
|
||||||
|
chown -R unbound:unbound /var/log/unbound
|
||||||
|
apparmor_parser -r /etc/apparmor.d/usr.sbin.unbound
|
||||||
|
```
|
||||||
|
* Restart unbound.
|
||||||
|
|
||||||
|
## Example
|
||||||
|
|
||||||
|
In this example, we specify to forward queries for domain aaa.com to xxx.xxx.xxx.xxx, bbb.com to yyy.yyy.yyy.yyy or xxx.xxx.xxx.xxx as a failover, and requests for a private zone to zzz.zzz.zzz.zzz :
|
||||||
|
```yml
|
||||||
|
unbound_interfaces:
|
||||||
|
- "aaa.aaa.aaa.aaa"
|
||||||
|
|
||||||
|
unbound_authorized_cidrs:
|
||||||
|
- "aaa.aaa.aaa.0/24"
|
||||||
|
- "bbb.bbb.bbb.bbb/32"
|
||||||
|
|
||||||
|
unbound_threads: 2
|
||||||
|
unbound_cache_size: 1536
|
||||||
|
|
||||||
|
unbound_zones:
|
||||||
|
- name: "aaa.com"
|
||||||
|
forward_ip:
|
||||||
|
- xxx.xxx.xxx.xxx
|
||||||
|
- name: "bbb.com"
|
||||||
|
forward_ip:
|
||||||
|
- yyy.yyy.yyy.yyy
|
||||||
|
- xxx.xxx.xxx.xxx
|
||||||
|
- name: "mysuperprivatezone.priv"
|
||||||
|
forward_ip:
|
||||||
|
- zzz.zzz.zzz.zzz
|
||||||
|
private: true
|
||||||
|
```
|
||||||
6
ansible/roles/unbound_resolver/defaults/main.yml
Normal file
6
ansible/roles/unbound_resolver/defaults/main.yml
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
---
|
||||||
|
unbound_interfaces:
|
||||||
|
- "0.0.0.0"
|
||||||
|
unbound_threads: 1
|
||||||
|
unbound_cache_size: 100
|
||||||
|
unbound_loglevel: 1
|
||||||
10
ansible/roles/unbound_resolver/files/logrotate
Normal file
10
ansible/roles/unbound_resolver/files/logrotate
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
/var/log/unbound/*.log {
|
||||||
|
weekly
|
||||||
|
missingok
|
||||||
|
rotate 52
|
||||||
|
compress
|
||||||
|
notifempty
|
||||||
|
postrotate
|
||||||
|
/usr/sbin/unbound-control log_reopen
|
||||||
|
endscript
|
||||||
|
}
|
||||||
BIN
ansible/roles/unbound_resolver/files/unbound_exporter
Executable file
BIN
ansible/roles/unbound_resolver/files/unbound_exporter
Executable file
Binary file not shown.
15
ansible/roles/unbound_resolver/handlers/main.yml
Normal file
15
ansible/roles/unbound_resolver/handlers/main.yml
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: Daemon reload
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
daemon_reload: true
|
||||||
|
|
||||||
|
- name: Restart unbound exporter
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: unbound_exporter
|
||||||
|
state: restarted
|
||||||
|
|
||||||
|
- name: Reload Unbound
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: unbound
|
||||||
|
state: reloaded
|
||||||
76
ansible/roles/unbound_resolver/tasks/main.yml
Normal file
76
ansible/roles/unbound_resolver/tasks/main.yml
Normal file
@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
- name: Set specific variables for distributions
|
||||||
|
ansible.builtin.include_vars: "{{ item }}"
|
||||||
|
with_first_found:
|
||||||
|
- files:
|
||||||
|
- '{{ ansible_distribution }}-{{ ansible_distribution_version }}.yml' # CentOS-6.5
|
||||||
|
- '{{ ansible_os_family }}-{{ ansible_distribution_version }}.yml' # RedHat-6.5
|
||||||
|
- '{{ ansible_distribution }}-{{ ansible_distribution_major_version }}.yml' # CentOS-6
|
||||||
|
- '{{ ansible_os_family }}-{{ ansible_distribution_major_version }}.yml' # RedHat-6
|
||||||
|
- '{{ ansible_distribution }}.yml' # CentOS
|
||||||
|
- '{{ ansible_os_family }}.yml' # RedHat
|
||||||
|
- 'default.yml'
|
||||||
|
|
||||||
|
- name: Enhance socket buffer size in UDP
|
||||||
|
ansible.posix.sysctl:
|
||||||
|
name: "{{ item }}"
|
||||||
|
value: 4194304
|
||||||
|
reload: true
|
||||||
|
with_items:
|
||||||
|
- "net.core.rmem_max"
|
||||||
|
- "net.core.wmem_max"
|
||||||
|
|
||||||
|
- name: Install Unbound
|
||||||
|
ansible.builtin.apt:
|
||||||
|
name: "{{ unbound_package }}"
|
||||||
|
update_cache: true
|
||||||
|
state: present
|
||||||
|
when: ansible_os_family == "Debian"
|
||||||
|
|
||||||
|
- name: Setup service configuration
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: unbound.conf.j2
|
||||||
|
dest: /etc/unbound/unbound.conf.d/custom.conf
|
||||||
|
owner: unbound
|
||||||
|
group: unbound
|
||||||
|
mode: "0755"
|
||||||
|
notify: Reload Unbound
|
||||||
|
|
||||||
|
- name: Set permission on conf directory
|
||||||
|
ansible.builtin.file:
|
||||||
|
path: /etc/unbound
|
||||||
|
owner: unbound
|
||||||
|
group: unbound
|
||||||
|
recurse: true
|
||||||
|
|
||||||
|
- name: Ensure service is enabled at boot and started
|
||||||
|
ansible.builtin.systemd_service:
|
||||||
|
name: "unbound"
|
||||||
|
enabled: true
|
||||||
|
state: started
|
||||||
|
|
||||||
|
- name: Deploy unbound exporter
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: unbound_exporter
|
||||||
|
dest: /usr/local/bin/unbound_exporter
|
||||||
|
mode: "0755"
|
||||||
|
|
||||||
|
- name: Deploy unbound exporter service
|
||||||
|
ansible.builtin.template:
|
||||||
|
src: unbound_exporter.service.j2
|
||||||
|
dest: /etc/systemd/system/unbound_exporter.service
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "0644"
|
||||||
|
notify:
|
||||||
|
- Daemon reload
|
||||||
|
- Restart unbound exporter
|
||||||
|
|
||||||
|
- name: Deploy logrotate config file
|
||||||
|
ansible.builtin.copy:
|
||||||
|
src: logrotate
|
||||||
|
dest: /etc/logrotate.d/unbound
|
||||||
|
owner: root
|
||||||
|
group: root
|
||||||
|
mode: "0644"
|
||||||
58
ansible/roles/unbound_resolver/templates/unbound.conf.j2
Normal file
58
ansible/roles/unbound_resolver/templates/unbound.conf.j2
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
## {{ ansible_managed }}
|
||||||
|
|
||||||
|
server:
|
||||||
|
verbosity: {{unbound_loglevel }}
|
||||||
|
extended-statistics: yes
|
||||||
|
|
||||||
|
do-udp: yes
|
||||||
|
do-tcp: yes
|
||||||
|
do-ip6: no
|
||||||
|
|
||||||
|
num-threads: {{ unbound_threads }}
|
||||||
|
msg-cache-slabs: {{ unbound_threads }}
|
||||||
|
rrset-cache-slabs: {{ unbound_threads }}
|
||||||
|
infra-cache-slabs: {{ unbound_threads }}
|
||||||
|
key-cache-slabs: {{ unbound_threads }}
|
||||||
|
|
||||||
|
rrset-cache-size: {{ unbound_cache_size }}m
|
||||||
|
key-cache-size: {{ ((unbound_cache_size/2) | int) }}m
|
||||||
|
msg-cache-size: {{ ((unbound_cache_size/2) | int) }}m
|
||||||
|
neg-cache-size: {{ ((unbound_cache_size/4) | int) }}m
|
||||||
|
|
||||||
|
prefetch: yes
|
||||||
|
cache-min-ttl: 300
|
||||||
|
cache-max-ttl: 86400
|
||||||
|
|
||||||
|
outgoing-range: 8192
|
||||||
|
num-queries-per-thread: 4096
|
||||||
|
|
||||||
|
so-rcvbuf: 4m
|
||||||
|
so-sndbuf: 4m
|
||||||
|
so-reuseport: yes
|
||||||
|
rrset-roundrobin: yes
|
||||||
|
val-log-level:1
|
||||||
|
|
||||||
|
|
||||||
|
{% for iface in unbound_interfaces %}
|
||||||
|
interface: {{ iface }}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% for cidr in unbound_authorized_cidrs %}
|
||||||
|
access-control: {{ cidr }} allow
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% if unbound_zones is defined %}
|
||||||
|
{% for zone in unbound_zones %}
|
||||||
|
{% if zone.private is defined and zone.private %}
|
||||||
|
domain-insecure: "{{ zone.name }}"
|
||||||
|
{% endif %}
|
||||||
|
{% endfor %}
|
||||||
|
|
||||||
|
{% for zone in unbound_zones %}
|
||||||
|
forward-zone:
|
||||||
|
name: "{{ zone.name }}"
|
||||||
|
{% for fwa in zone.forward_ip %}
|
||||||
|
forward-addr: {{ fwa }}
|
||||||
|
{% endfor -%}
|
||||||
|
{% endfor %}
|
||||||
|
{% endif %}
|
||||||
@ -0,0 +1,13 @@
|
|||||||
|
[Unit]
|
||||||
|
Description=Unbound exporter for prometheus
|
||||||
|
Documentation=https://github.com/letsencrypt/unbound_exporter
|
||||||
|
Wants=network-online.target
|
||||||
|
After=network-online.target
|
||||||
|
|
||||||
|
[Service]
|
||||||
|
Type=simple
|
||||||
|
ExecStart=/usr/local/bin/unbound_exporter -unbound.host="unix:///run/unbound.ctl"
|
||||||
|
Restart=always
|
||||||
|
|
||||||
|
[Install]
|
||||||
|
WantedBy=multi-user.target
|
||||||
3
ansible/roles/unbound_resolver/vars/Debian.yml
Normal file
3
ansible/roles/unbound_resolver/vars/Debian.yml
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
---
|
||||||
|
|
||||||
|
unbound_package: "unbound"
|
||||||
Loading…
x
Reference in New Issue
Block a user