From 6201647b6a31ba0f6dfcec8bd0ab335aacba9ff6 Mon Sep 17 00:00:00 2001
From: Leonidas Spyropoulos <artafinde@gmail.com>
Date: Fri, 23 Apr 2021 11:59:37 +0100
Subject: [PATCH] New shared networking role.

This is shared between common and install_arch roles

Closed: #288

Signed-off-by: Leonidas Spyropoulos <artafinde@gmail.com>
---
 roles/common/defaults/main.yml                |  2 -
 roles/common/handlers/main.yml                |  6 ---
 roles/common/tasks/main.yml                   | 32 ++-----------
 roles/install_arch/tasks/main.yml             | 29 +++---------
 .../templates/10-dhcp-ethernet.network.j2     |  1 -
 .../templates/10-static-ethernet.network.j2   |  1 -
 .../defaults/main.yml                         |  1 +
 .../files/hcloud-init                         |  0
 .../files/hcloud-init.service                 |  1 +
 roles/networking/handlers/main.yml            |  8 ++++
 roles/networking/tasks/main.yml               | 45 +++++++++++++++++++
 .../templates/10-dhcp-ethernet.network.j2     |  0
 .../templates/10-static-ethernet.network.j2   |  0
 .../templates/resolv.conf.j2                  |  0
 14 files changed, 63 insertions(+), 63 deletions(-)
 delete mode 120000 roles/install_arch/templates/10-dhcp-ethernet.network.j2
 delete mode 120000 roles/install_arch/templates/10-static-ethernet.network.j2
 rename roles/{install_arch => networking}/defaults/main.yml (73%)
 rename roles/{install_arch => networking}/files/hcloud-init (100%)
 rename roles/{install_arch => networking}/files/hcloud-init.service (95%)
 create mode 100644 roles/networking/handlers/main.yml
 create mode 100644 roles/networking/tasks/main.yml
 rename roles/{common => networking}/templates/10-dhcp-ethernet.network.j2 (100%)
 rename roles/{common => networking}/templates/10-static-ethernet.network.j2 (100%)
 rename roles/{common => networking}/templates/resolv.conf.j2 (100%)

diff --git a/roles/common/defaults/main.yml b/roles/common/defaults/main.yml
index 0760ecf91..ee917a2f5 100644
--- a/roles/common/defaults/main.yml
+++ b/roles/common/defaults/main.yml
@@ -1,5 +1,3 @@
 ---
 configure_network: false
 enable_zram_swap: false
-network_interface: "e*"
-dns_servers: []
diff --git a/roles/common/handlers/main.yml b/roles/common/handlers/main.yml
index a55336f43..27008abdc 100644
--- a/roles/common/handlers/main.yml
+++ b/roles/common/handlers/main.yml
@@ -1,11 +1,5 @@
 ---
 
-- name: restart networkd
-  systemd:
-    name: systemd-networkd
-    state: restarted
-    daemon_reload: true
-
 - name: restart journald
   systemd:
     name: systemd-journald
diff --git a/roles/common/tasks/main.yml b/roles/common/tasks/main.yml
index 11b4e884d..b6a5e35a4 100644
--- a/roles/common/tasks/main.yml
+++ b/roles/common/tasks/main.yml
@@ -1,9 +1,5 @@
 ---
 
-- name: set fact for local dns resolver in use
-  set_fact:
-    host_has_local_dns_resolver: "{{ dns_servers|length == 1 and '127.0.0.1' in dns_servers }}"
-
 - name: install inetutils for hostname
   pacman: name=inetutils state=present
 
@@ -63,32 +59,10 @@
 - name: generate ssh key for root
   command: ssh-keygen -b 4096 -N "" -f /root/.ssh/id_rsa creates="/root/.ssh/id_rsa"
 
-- name: configure network
-  template: src=10-static-ethernet.network.j2 dest=/etc/systemd/network/10-static-ethernet.network owner=root group=root mode=0644
-  notify:
-    - restart networkd
-  when: configure_network
-
-- name: create symlink to resolv.conf
-  file: src=/run/systemd/resolve/stub-resolv.conf dest=/etc/resolv.conf state=link force=yes owner=root group=root mode=0755
-  when: configure_network and not host_has_local_dns_resolver
-
-- name: create resolv.conf
-  template: src=resolv.conf.j2 dest=/etc/resolv.conf owner=root group=root mode=0644
-  when: configure_network and host_has_local_dns_resolver
-
-- name: start networkd
-  service: name=systemd-networkd state=started enabled=yes
-  when: configure_network
-
-- name: start resolved
-  service:
-    name: systemd-resolved
-    state: "{{'stopped' if host_has_local_dns_resolver else 'started'}}"
-    enabled: "{{'no' if host_has_local_dns_resolver else 'yes'}}"
+- name: configure networking
+  include_role:
+    name: networking
   when: configure_network
-  tags:
-    - this
 
 - name: configure tcp receive window limits
   sysctl:
diff --git a/roles/install_arch/tasks/main.yml b/roles/install_arch/tasks/main.yml
index 2f416a5d3..bf8c3838a 100644
--- a/roles/install_arch/tasks/main.yml
+++ b/roles/install_arch/tasks/main.yml
@@ -122,27 +122,11 @@
   register: chroot_mkinitcpio
   changed_when: "chroot_mkinitcpio.rc == 0"
 
-- name: configure network (static)
-  template: src=10-static-ethernet.network.j2 dest=/mnt/etc/systemd/network/10-static-ethernet.network owner=root group=root mode=0644
-  when: not dhcp|default(false)
-
-- name: configure network (dhcp)
-  template: src=10-dhcp-ethernet.network.j2 dest=/mnt/etc/systemd/network/10-dhcp-ethernet.network owner=root group=root mode=0644
-  when: dhcp|default(false)
-
-- name: install hcloud-init
-  copy: src=hcloud-init dest=/mnt/usr/local/bin/hcloud-init owner=root group=root mode=0755
-  when: "'hcloud' in group_names or inventory_hostname == 'packer-base-image'"
-
-- name: install hcloud-init.service
-  copy: src=hcloud-init.service dest=/mnt/etc/systemd/system/hcloud-init.service owner=root group=root mode=0644
-  when: "'hcloud' in group_names or inventory_hostname == 'packer-base-image'"
-
-- name: enable hcloud-init inside chroot
-  command: chroot /mnt systemctl enable hcloud-init
-  register: chroot_systemd_services
-  changed_when: "chroot_systemd_services.rc == 0"
-  when: "'hcloud' in group_names or inventory_hostname == 'packer-base-image'"
+- name: configure networking
+  include_role:
+    name: networking
+  vars:
+    chroot_path: "/mnt"
 
 - name: provide default mount options (btrfs)
   lineinfile:
@@ -180,9 +164,6 @@
 - name: configure sshd
   template: src=sshd_config.j2 dest=/mnt/etc/ssh/sshd_config owner=root group=root mode=0644
 
-- name: create symlink to resolv.conf
-  file: src=/run/systemd/resolve/stub-resolv.conf dest=/mnt/etc/resolv.conf state=link force=yes owner=root group=root mode=0644
-
 - name: clean pacman cache
   command: yes | chroot /mnt pacman -Scc
   register: chroot_pacman_clean_cache
diff --git a/roles/install_arch/templates/10-dhcp-ethernet.network.j2 b/roles/install_arch/templates/10-dhcp-ethernet.network.j2
deleted file mode 120000
index a152d98ea..000000000
--- a/roles/install_arch/templates/10-dhcp-ethernet.network.j2
+++ /dev/null
@@ -1 +0,0 @@
-../../common/templates/10-dhcp-ethernet.network.j2
\ No newline at end of file
diff --git a/roles/install_arch/templates/10-static-ethernet.network.j2 b/roles/install_arch/templates/10-static-ethernet.network.j2
deleted file mode 120000
index d73e3a3b2..000000000
--- a/roles/install_arch/templates/10-static-ethernet.network.j2
+++ /dev/null
@@ -1 +0,0 @@
-../../common/templates/10-static-ethernet.network.j2
\ No newline at end of file
diff --git a/roles/install_arch/defaults/main.yml b/roles/networking/defaults/main.yml
similarity index 73%
rename from roles/install_arch/defaults/main.yml
rename to roles/networking/defaults/main.yml
index f04986c35..df6f06dc7 100644
--- a/roles/install_arch/defaults/main.yml
+++ b/roles/networking/defaults/main.yml
@@ -1,3 +1,4 @@
 ---
+chroot_path: ""
 network_interface: "e*"
 dns_servers: []
diff --git a/roles/install_arch/files/hcloud-init b/roles/networking/files/hcloud-init
similarity index 100%
rename from roles/install_arch/files/hcloud-init
rename to roles/networking/files/hcloud-init
diff --git a/roles/install_arch/files/hcloud-init.service b/roles/networking/files/hcloud-init.service
similarity index 95%
rename from roles/install_arch/files/hcloud-init.service
rename to roles/networking/files/hcloud-init.service
index 54d433f50..a293cedb6 100644
--- a/roles/install_arch/files/hcloud-init.service
+++ b/roles/networking/files/hcloud-init.service
@@ -10,6 +10,7 @@ Wants=systemd-networkd.service
 [Service]
 ExecStart=/usr/local/bin/hcloud-init
 Type=oneshot
+RemainAfterExit=yes
 StandardOutput=journal
 StandardError=journal
 
diff --git a/roles/networking/handlers/main.yml b/roles/networking/handlers/main.yml
new file mode 100644
index 000000000..ebbc6ef0c
--- /dev/null
+++ b/roles/networking/handlers/main.yml
@@ -0,0 +1,8 @@
+---
+
+- name: restart networkd
+  systemd:
+    name: systemd-networkd
+    state: restarted
+    daemon_reload: true
+  when: chroot_path | length == 0
diff --git a/roles/networking/tasks/main.yml b/roles/networking/tasks/main.yml
new file mode 100644
index 000000000..278967e44
--- /dev/null
+++ b/roles/networking/tasks/main.yml
@@ -0,0 +1,45 @@
+---
+- name: set fact for local dns resolver in use
+  set_fact:
+    host_has_local_dns_resolver: "{{ dns_servers|length == 1 and '127.0.0.1' in dns_servers }}"
+
+- name: configure network (static)
+  template: src=10-static-ethernet.network.j2 dest={{ chroot_path }}/etc/systemd/network/10-static-ethernet.network owner=root group=root mode=0644
+  notify:
+    - restart networkd
+  when: not dhcp|default(false)
+
+- name: configure network (dhcp)
+  template: src=10-dhcp-ethernet.network.j2 dest={{ chroot_path }}/etc/systemd/network/10-dhcp-ethernet.network owner=root group=root mode=0644
+  notify:
+    - restart networkd
+  when: dhcp|default(false)
+
+- name: create symlink to resolv.conf
+  file: src=/run/systemd/resolve/stub-resolv.conf dest={{ chroot_path }}/etc/resolv.conf state=link force=yes owner=root group=root mode=0644
+
+- name: install hcloud-init
+  copy: src=hcloud-init dest={{ chroot_path }}/usr/local/bin/hcloud-init owner=root group=root mode=0755
+  when: "'hcloud' in group_names or inventory_hostname == 'packer-base-image'"
+
+- name: install hcloud-init.service
+  copy: src=hcloud-init.service dest={{ chroot_path }}/etc/systemd/system/hcloud-init.service owner=root group=root mode=0644
+  when: "'hcloud' in group_names or inventory_hostname == 'packer-base-image'"
+
+- name: enable hcloud-init inside chroot
+  command: chroot {{ chroot_path }} systemctl enable hcloud-init
+  register: chroot_systemd_services
+  changed_when: "chroot_systemd_services.rc == 0"
+  when: chroot_path | length != 0 and ("'hcloud' in group_names or inventory_hostname == 'packer-base-image'")
+
+- name: start and enable hcloud-init
+  service: name=hcloud-init daemon_reload=yes state=started enabled=yes
+  when: chroot_path | length == 0
+
+- name: start and enable networkd
+  service: name=systemd-networkd state=started enabled=yes
+  when: chroot_path | length == 0
+
+- name: start and enable resolved
+  service: name=systemd-resolved state=started enabled=yes
+  when: chroot_path | length == 0
diff --git a/roles/common/templates/10-dhcp-ethernet.network.j2 b/roles/networking/templates/10-dhcp-ethernet.network.j2
similarity index 100%
rename from roles/common/templates/10-dhcp-ethernet.network.j2
rename to roles/networking/templates/10-dhcp-ethernet.network.j2
diff --git a/roles/common/templates/10-static-ethernet.network.j2 b/roles/networking/templates/10-static-ethernet.network.j2
similarity index 100%
rename from roles/common/templates/10-static-ethernet.network.j2
rename to roles/networking/templates/10-static-ethernet.network.j2
diff --git a/roles/common/templates/resolv.conf.j2 b/roles/networking/templates/resolv.conf.j2
similarity index 100%
rename from roles/common/templates/resolv.conf.j2
rename to roles/networking/templates/resolv.conf.j2
-- 
GitLab