From 1ee39e86afe565d6b48277f124ea73c3992955e4 Mon Sep 17 00:00:00 2001 From: Chewbaccalakis Date: Thu, 25 Jun 2026 11:52:53 -0700 Subject: [PATCH] added technitium setup --- ansible/plays/machine_setup/technitium.yml | 216 +++++++++++++++++++++ 1 file changed, 216 insertions(+) create mode 100644 ansible/plays/machine_setup/technitium.yml diff --git a/ansible/plays/machine_setup/technitium.yml b/ansible/plays/machine_setup/technitium.yml new file mode 100644 index 0000000..74ce48c --- /dev/null +++ b/ansible/plays/machine_setup/technitium.yml @@ -0,0 +1,216 @@ +--- +- name: Set up technitium LXC + hosts: technitium + become: yes + vars: + dotnet_dir: /opt/dotnet + dotnet_version: "10.0" + dotnet_runtime_prefix: "Microsoft.AspNetCore.App 10.0." + dotnet_url: "https://dot.net/v1/dotnet-install.sh" + dns_config: /etc/dns + dns_log: /var/log/technitium/dns + dns_url: "https://download.technitium.com/dns/DnsServerPortable.tar.gz" + service_user: dns-server + + tasks: + - name: default_packages + ansible.builtin.include_tasks: ../../templates/default_packages.yml + + - name: create_user + ansible.builtin.include_tasks: ../../templates/create_user.yml + vars: + username: nick + github_user: Chewbaccalakis + + # Determine dns_dir: use /etc/dns if an existing install is detected, otherwise /opt/technitium/dns + - name: Check for existing install at /etc/dns/config + ansible.builtin.stat: + path: /etc/dns/config + register: etc_dns_config + + - name: Set dns_dir for existing install + ansible.builtin.set_fact: + dns_dir: /etc/dns + dns_tar: /etc/dns/DnsServerPortable.tar.gz + when: etc_dns_config.stat.exists and etc_dns_config.stat.isdir + + - name: Set dns_dir for fresh install + ansible.builtin.set_fact: + dns_dir: /opt/technitium/dns + dns_tar: /opt/technitium/dns/DnsServerPortable.tar.gz + when: not (etc_dns_config.stat.exists and etc_dns_config.stat.isdir) + + - name: Create required directories + ansible.builtin.file: + path: "{{ item }}" + state: directory + mode: '0755' + loop: + - "{{ dns_dir }}" + - "{{ dns_config }}" + + # .NET Runtime + - name: Check installed .NET runtimes + ansible.builtin.command: dotnet --list-runtimes + register: dotnet_runtimes + changed_when: false + failed_when: false + + - name: Install ASP.NET Core Runtime + when: dotnet_runtime_prefix not in (dotnet_runtimes.stdout | default('')) + block: + - name: Download dotnet-install.sh + ansible.builtin.get_url: + url: "{{ dotnet_url }}" + dest: /tmp/dotnet-install.sh + mode: '0755' + + - name: Run dotnet-install.sh + ansible.builtin.command: > + bash /tmp/dotnet-install.sh + -c {{ dotnet_version }} + --runtime aspnetcore + --no-path + --install-dir {{ dotnet_dir }} + + - name: Create /usr/bin/dotnet symlink + ansible.builtin.file: + src: "{{ dotnet_dir }}/dotnet" + dest: /usr/bin/dotnet + state: link + + # DNS Server + - name: Download Technitium DNS Server archive + ansible.builtin.get_url: + url: "{{ dns_url }}" + dest: "{{ dns_tar }}" + mode: '0644' + + - name: Extract Technitium DNS Server + ansible.builtin.unarchive: + src: "{{ dns_tar }}" + dest: "{{ dns_dir }}" + remote_src: yes + + # ICU + - name: Test ICU availability for .NET + ansible.builtin.command: "dotnet {{ dns_dir }}/DnsServerApp.dll --icu-test" + register: icu_test + changed_when: false + failed_when: false + + - name: Install ICU library + when: icu_test.rc != 0 + block: + - name: Find available ICU package + ansible.builtin.shell: | + for pkg in libicu74 libicu72 libicu70; do + if apt-cache show $pkg >/dev/null 2>&1; then + echo $pkg + exit 0 + fi + done + echo "libicu-dev" + register: icu_package + changed_when: false + + - name: Install ICU package + ansible.builtin.apt: + name: "{{ icu_package.stdout }}" + state: present + update_cache: yes + + - name: Verify ICU works after install + ansible.builtin.command: "dotnet {{ dns_dir }}/DnsServerApp.dll --icu-test" + + # Systemd service + - name: Check if dns.service is already installed + ansible.builtin.stat: + path: /etc/systemd/system/dns.service + register: dns_service_file + + - name: Restart existing dns service (update path) + ansible.builtin.systemd: + name: dns.service + state: restarted + when: dns_service_file.stat.exists + + - name: First-time service setup + when: not dns_service_file.stat.exists + block: + - name: Create DNS log directory + ansible.builtin.file: + path: "{{ dns_log }}" + state: directory + mode: '0755' + + - name: Create dns-server service user + ansible.builtin.user: + name: "{{ service_user }}" + system: yes + create_home: no + shell: /usr/sbin/nologin + + - name: Set ownership on DNS directories + ansible.builtin.file: + path: "{{ item }}" + owner: "{{ service_user }}" + group: "{{ service_user }}" + recurse: yes + loop: + - "{{ dns_dir }}" + - "{{ dns_config }}" + - "{{ dns_log }}" + + - name: Copy systemd service file + ansible.builtin.copy: + src: "{{ dns_dir }}/systemd.service" + dest: /etc/systemd/system/dns.service + remote_src: yes + + - name: Enable dns.service + ansible.builtin.systemd: + name: dns.service + enabled: yes + daemon_reload: yes + + - name: Stop and disable systemd-resolved + ansible.builtin.systemd: + name: systemd-resolved + state: stopped + enabled: no + failed_when: false + + - name: Start dns.service + ansible.builtin.systemd: + name: dns.service + state: started + + - name: Check if NetworkManager.conf exists + ansible.builtin.stat: + path: /etc/NetworkManager/NetworkManager.conf + register: nm_conf + + - name: Configure NetworkManager to not manage DNS + community.general.ini_file: + path: /etc/NetworkManager/NetworkManager.conf + section: main + option: dns + value: none + no_extra_spaces: yes + when: nm_conf.stat.exists + + - name: Back up existing resolv.conf + ansible.builtin.copy: + src: /etc/resolv.conf + dest: "{{ dns_dir }}/resolv.conf.bak" + remote_src: yes + force: no + + - name: Configure resolv.conf to use local DNS + ansible.builtin.copy: + dest: /etc/resolv.conf + content: | + # Generated by Technitium DNS Server Installer + + nameserver 127.0.0.1