From 0814e628c5524ac7ca6e390ffd3a430df6304bc2 Mon Sep 17 00:00:00 2001 From: Timotej Lazar Date: Thu, 31 Jul 2025 12:15:48 +0200 Subject: [PATCH] Add radvd role --- roles/radvd/README.md | 1 + roles/radvd/handlers/main.yml | 5 +++++ roles/radvd/tasks/main.yml | 16 ++++++++++++++++ roles/radvd/templates/radvd.conf.j2 | 20 ++++++++++++++++++++ 4 files changed, 42 insertions(+) create mode 100644 roles/radvd/README.md create mode 100644 roles/radvd/handlers/main.yml create mode 100644 roles/radvd/tasks/main.yml create mode 100644 roles/radvd/templates/radvd.conf.j2 diff --git a/roles/radvd/README.md b/roles/radvd/README.md new file mode 100644 index 0000000..9034b89 --- /dev/null +++ b/roles/radvd/README.md @@ -0,0 +1 @@ +Install radvd and send out RAs on all interfaces where the configured IPv6 address is the gateway address for its prefix. diff --git a/roles/radvd/handlers/main.yml b/roles/radvd/handlers/main.yml new file mode 100644 index 0000000..94f78a1 --- /dev/null +++ b/roles/radvd/handlers/main.yml @@ -0,0 +1,5 @@ +- name: reload radvd + service: + name: radvd + state: reloaded + when: "'handler' not in ansible_skip_tags" diff --git a/roles/radvd/tasks/main.yml b/roles/radvd/tasks/main.yml new file mode 100644 index 0000000..9907172 --- /dev/null +++ b/roles/radvd/tasks/main.yml @@ -0,0 +1,16 @@ +- name: Install packages + package: + name: + - radvd + +- name: Configure radvd + template: + dest: /etc/radvd.conf + src: radvd.conf.j2 + notify: reload radvd + +- name: Enable radvd service + service: + name: radvd + enabled: true + state: started diff --git a/roles/radvd/templates/radvd.conf.j2 b/roles/radvd/templates/radvd.conf.j2 new file mode 100644 index 0000000..2fd4723 --- /dev/null +++ b/roles/radvd/templates/radvd.conf.j2 @@ -0,0 +1,20 @@ +{% for iface in interfaces + | defaultattr('mgmt_only') | rejectattr('mgmt_only') + | selectattr('enabled') %} +{% for address in iface.ip_addresses | selectattr("family.value", "==", 6) %} +{# get the gateway for this subnet #} +{% set subnet = address.address | ipaddr('subnet') %} +{% set prefix = prefixes | selectattr('prefix', '==', subnet) | first %} +{% set gateway = prefix.custom_fields.gateway.address %} +{# if we are gateway, send RAs on this interface #} +{% if gateway is defined and gateway == address.address %} +interface {{ iface.name }} { + AdvSendAdvert on; + prefix ::/64; + RDNSS {{ dns6 | join(' ') }} { }; + DNSSL {{ domain }} { }; +}; + +{% endif %} +{% endfor %} +{% endfor %}