summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoe Carstairs <me@joeac.net>2026-07-25 13:27:19 +0100
committerJoe Carstairs <me@joeac.net>2026-07-25 13:27:19 +0100
commitf93ee559bc1080182a4c466c97e922f53e69783a (patch)
treea01f45b73b4bc202af48ce49dad6876f314840c3
parent6cd86414799c98180ee49357ab522a72e4dc4cd5 (diff)
moves dyndns config management to ansible
-rw-r--r--Makefile11
-rw-r--r--ansible/inventory.yml2
-rw-r--r--ansible/playbook.yml7
-rw-r--r--ansible/roles/dyndns/tasks/main.yml72
-rw-r--r--ansible/vars/common.yml10
-rw-r--r--make/dyndns.mk55
6 files changed, 96 insertions, 61 deletions
diff --git a/Makefile b/Makefile
index faa2d26..1466154 100644
--- a/Makefile
+++ b/Makefile
@@ -17,19 +17,19 @@ endef
define install_module_rule =
.PHONY: install_$(module)
-install_$(module): install_openrc_$(module) install_dyndns_$(module) $(if $(SUBDOMAIN_$(module)),install_tls_$(SUBDOMAIN_$(module))) $(install_submake_file)
+install_$(module): install_openrc_$(module) $(if $(SUBDOMAIN_$(module)),install_tls_$(SUBDOMAIN_$(module))) $(install_submake_file)
$(if $(install_submake_file),$(MAKE) --makefile=$(notdir $(install_submake_file)) --directory=$(dir $(install_submake_file)) install)
endef
define reinstall_module_rule =
.PHONY: reinstall_$(module)
-reinstall_$(module): reinstall_openrc_$(module) reinstall_dyndns_$(module) $(if $(SUBDOMAIN_$(module)),reinstall_tls_$(SUBDOMAIN_$(module))) $(install_submake_file)
+reinstall_$(module): reinstall_openrc_$(module) $(if $(SUBDOMAIN_$(module)),reinstall_tls_$(SUBDOMAIN_$(module))) $(install_submake_file)
$(if $(install_submake_file),$(MAKE) --makefile=$(notdir $(install_submake_file)) --directory=$(dir $(install_submake_file)) reinstall)
endef
define uninstall_module_rule =
.PHONY: uninstall_$(module)
-uninstall_$(module): uninstall_openrc_$(module) uninstall_dyndns_$(module) $(if $(SUBDOMAIN_$(module)),install_tls_$(SUBDOMAIN_$(module)))
+uninstall_$(module): uninstall_openrc_$(module) $(if $(SUBDOMAIN_$(module)),install_tls_$(SUBDOMAIN_$(module)))
$(if $(install_submake_file),\
$(MAKE) --makefile=$(notdir $(install_submake_file)) --directory $(dir $(install_submake_file)) uninstall
)
@@ -45,10 +45,10 @@ $(foreach module,$(ALL_MODULES),$(eval $(call module_env_rule)))
install: install_tls install_nginx $(ENV_RULES) $(INSTALL_RULES) install_crontab
.PHONY: reinstall
-reinstall: reinstall_tls reinstall_nginx reinstall_dyndns $(ENV_RULES) $(REINSTALL_RULES) reinstall_crontab
+reinstall: reinstall_tls reinstall_nginx $(ENV_RULES) $(REINSTALL_RULES) reinstall_crontab
.PHONY: uninstall
-uninstall: uninstall_nginx uninstall_dyndns uninstall_tls uninstall_joeac.net_service $(UNINSTALL_RULES) uninstall_crontab
+uninstall: uninstall_nginx uninstall_tls uninstall_joeac.net_service $(UNINSTALL_RULES) uninstall_crontab
$(foreach module,$(ALL_MODULES),$(eval $(install_module_rule)))
$(foreach module,$(ALL_MODULES),$(eval $(reinstall_module_rule)))
@@ -62,5 +62,4 @@ include make/container.mk
include make/openrc.mk
include make/nginx.mk
include make/crontab.mk
-include make/dyndns.mk
include make/tls.mk
diff --git a/ansible/inventory.yml b/ansible/inventory.yml
index 9058c72..156368e 100644
--- a/ansible/inventory.yml
+++ b/ansible/inventory.yml
@@ -3,6 +3,8 @@ ungrouped:
pi-broughton:
ansible_host: 192.168.178.91
ansible_ssh_user: broughton
+ connection_device_name: eth0
blade-canongate:
ansible_host: 192.168.178.75
ansible_ssh_user: canongate
+ connection_device_name: eth0
diff --git a/ansible/playbook.yml b/ansible/playbook.yml
new file mode 100644
index 0000000..d91eaa4
--- /dev/null
+++ b/ansible/playbook.yml
@@ -0,0 +1,7 @@
+- name: Install dyndns
+ hosts: blade-canongate
+ become: true
+ roles:
+ - dyndns
+ vars_files:
+ - common.yml
diff --git a/ansible/roles/dyndns/tasks/main.yml b/ansible/roles/dyndns/tasks/main.yml
new file mode 100644
index 0000000..ed547d2
--- /dev/null
+++ b/ansible/roles/dyndns/tasks/main.yml
@@ -0,0 +1,72 @@
+- name: Fetch digitalocean_dyndns source
+ ansible.builtin.git:
+ repo: https://git.joeac.net/joeac/digitalocean_dyndns.git
+ dest: /usr/local/lib/digitalocean_dyndns
+
+- name: Mark get_ip_addr.sh executable
+ ansible.builtin.file:
+ path: /usr/local/lib/digitalocean_dyndns/get_ip_addr.sh
+ owner: joeac.net
+ group: joeac.net
+ mode: "775"
+
+- name: Mark dyndns.sh executable
+ ansible.builtin.file:
+ path: /usr/local/lib/digitalocean_dyndns/dyndns.sh
+ owner: joeac.net
+ group: joeac.net
+ mode: "775"
+
+- name: Symlink get_ip_addr.sh
+ ansible.builtin.file:
+ src: /usr/local/lib/digitalocean_dyndns/get_ip_addr.sh
+ dest: /usr/bin/get_ip_addr.sh
+ owner: joeac.net
+ group: joeac.net
+ state: link
+
+- name: Symlink dyndns.sh
+ ansible.builtin.file:
+ src: /usr/local/lib/digitalocean_dyndns/dyndns.sh
+ dest: /usr/bin/dyndns.sh
+ owner: joeac.net
+ group: joeac.net
+ state: link
+
+- name: Create config directory
+ ansible.builtin.file:
+ path: /etc/digitalocean_dyndns
+ state: directory
+ mode: "644"
+
+- name: Create cache directory
+ ansible.builtin.file:
+ path: /var/digitalocean_dyndns
+ state: directory
+ mode: "666"
+
+- name: Create log directory
+ ansible.builtin.file:
+ path: /var/log/digitalocean_dyndns
+ state: directory
+ mode: "666"
+
+- name: Copy DIGITALOCEAN_TOKEN
+ ansible.builtin.copy:
+ src: DIGITALOCEAN_TOKEN
+ dest: /etc/digitalocean_dyndns/DIGITALOCEAN_TOKEN
+ mode: "644"
+
+- name: Install daily crontabs for dyndns (IPv4)
+ loop: "{{ subdomains }}"
+ ansible.builtin.cron:
+ special_time: daily
+ name: daily crontab for dyndns for {{ item }}.joeac.net (IPv4)
+ job: CACHE_DIR=/var/digitalocean_dyndns CONFIG_DIR=/etc/digitalocean_dyndns dyndns.sh 4 {{ item }}.joeac.net >> /var/log/digitalocean_dyndns/{{ item }}.joeac.net.ipv4.log
+
+- name: Install daily crontabs for dyndns (IPv6)
+ loop: "{{ subdomains }}"
+ ansible.builtin.cron:
+ special_time: daily
+ name: daily crontab for dyndns for {{ item }}.joeac.net (IPv6)
+ job: CACHE_DIR=/var/digitalocean_dyndns CONFIG_DIR=/etc/digitalocean_dyndns CONN_DEVICE_NAME={{ connection_device_name }} dyndns.sh 6 {{ item }}.joeac.net >> /var/log/digitalocean_dyndns/{{ item }}.joeac.net.ipv6.log
diff --git a/ansible/vars/common.yml b/ansible/vars/common.yml
new file mode 100644
index 0000000..e6dc18c
--- /dev/null
+++ b/ansible/vars/common.yml
@@ -0,0 +1,10 @@
+subdomains:
+ - "@"
+ - budget
+ - docs
+ - ln
+ - mail
+ - autoconfig.mail
+ - clientsettings.mail
+ - mta-sts.mail
+ - pwd
diff --git a/make/dyndns.mk b/make/dyndns.mk
deleted file mode 100644
index 20490a9..0000000
--- a/make/dyndns.mk
+++ /dev/null
@@ -1,55 +0,0 @@
-installed_dyndns_crontabs = $(wildcard /etc/periodic/daily/dyndns-*.joeac.net)
-installed_dyndns_subdomains = $(installed_dyndns_crontabs:/etc/periodic/daily/dyndns-%.joeac.net=%)
-dyndns_subdomains_to_remove = $(filter-out $(SUBDOMAINS),$(installed_dyndns_subdomains))
-dyndns_crontabs_to_remove = $(dyndns_subdomains_to_remove:%=/etc/periodic/daily/dyndns-%.joeac.net)
-
-define install_dyndns_module_rule =
-.PHONY: install_dyndns_$(module)
-install_dyndns_module_$(module): $(if $(SUBDOMAIN_$(module)),/etc/periodic/daily/dyndns-$(SUBDOMAIN_$(module)).joeac.net)
-endef
-
-define reinstall_dyndns_module_rule =
-.PHONY: reinstall_dyndns_$(module)
-reinstall_dyndns_$(module): $(if $(SUBDOMAIN_$(module)),/etc/periodic/daily/dyndns-$(SUBDOMAIN_$(module)).joeac.net reinstall_dyndns)
-endef
-
-define uninstall_dyndns_module_rule =
-.PHONY: uninstall_dyndns_$(module)
-uninstall_dyndns_$(module):
- $(if $(SUBDOMAIN_$(module)), \
- sudo rm -f /etc/periodic/daily/dyndns-$(SUBDOMAIN_$(module)).joeac.net
- )
-endef
-
-$(foreach module,$(ALL_MODULES), $(eval $(install_dyndns_module_rule)))
-$(foreach module,$(ALL_MODULES), $(eval $(reinstall_dyndns_module_rule)))
-$(foreach module,$(ALL_MODULES), $(eval $(uninstall_dyndns_module_rule)))
-
-.PHONY: remove_/etc/periodic/daily/dyndns-%.joeac.net
-remove_/etc/periodic/daily/dyndns-%.joeac.net:
- rm -f $(@:remove_%=%)
-
-/etc/periodic/daily/dyndns-%joeac.net: ~/digitalocean_dyndns/dyndns.sh ~/.config/dyndns/DIGITALOCEAN_TOKEN
- echo "#!/bin/sh" > crontab.tmp
- echo " $(shell realpath ~)/digitalocean_dyndns/dyndns.sh 4 $(*F)joeac.net" >> crontab.tmp
- echo "CONN_DEVICE_NAME=eth0 $(shell realpath ~)/digitalocean_dyndns/dyndns.sh 6 $(*F)joeac.net" >> crontab.tmp
- sudo mv crontab.tmp $@
- sudo chmod +x $@
-
-.PHONY: reinstall_dyndns
-reinstall_dyndns: $(addprefix remove_,$(dyndns_crontabs_to_remove))
-
-.PHONY: uninstall_dyndns
-uninstall_dyndns: $(foreach module,$(ALL_MODULES),$(uninstall_dyndns_$(module)))
- sudo rm -rf \
- ~/digitalocean_dyndns/ \
- ~/.config/dyndns \
- ~/.cache/dyndns
-
-~/digitalocean_dyndns/%:
- git clone https://git.joeac.net/joeac/digitalocean_dyndns.git ~/digitalocean_dyndns
-
-~/.config/dyndns/DIGITALOCEAN_TOKEN: DIGITALOCEAN_TOKEN
- mkdir -p ~/.config/dyndns/
- rm -f ~/.config/dyndns/DIGITALOCEAN_TOKEN
- cp DIGITALOCEAN_TOKEN ~/.config/dyndns/DIGITALOCEAN_TOKEN