From f8ae01604210c04712c8047d85a5e50551829edb Mon Sep 17 00:00:00 2001 From: "Dustin C. Hatch" Date: Mon, 23 Jul 2018 17:25:25 -0500 Subject: [PATCH] roles/dch-storage-net: Set up/mount shared storage The *dch-storage-net* role configures a machine to connect the storage network and mount shared folders from the storage appliance. The `wait-global-address.sh` script and corresponding *wait-global-address@.service* systemd unit template are necessary to ensure that the storage network is actually available before attempting to mount the shared volumes. This is particularly important at boot, since `dhcpcd` does not implement any kind of signaling that can be used by *network-online.target*, so the network is considered "online" as soon as the `dhcpcd` process has started. This typically results in "network unreachable" errors. --- .../files/wait-global-address.service | 14 +++++++++ .../files/wait-global-address.sh | 6 ++++ roles/dch-storage-net/handlers/main.yml | 2 ++ roles/dch-storage-net/tasks/main.yml | 29 +++++++++++++++++++ 4 files changed, 51 insertions(+) create mode 100644 roles/dch-storage-net/files/wait-global-address.service create mode 100644 roles/dch-storage-net/files/wait-global-address.sh create mode 100644 roles/dch-storage-net/handlers/main.yml create mode 100644 roles/dch-storage-net/tasks/main.yml diff --git a/roles/dch-storage-net/files/wait-global-address.service b/roles/dch-storage-net/files/wait-global-address.service new file mode 100644 index 0000000..86cb769 --- /dev/null +++ b/roles/dch-storage-net/files/wait-global-address.service @@ -0,0 +1,14 @@ +[Unit] +Description=Wait for global address on %I +Requires=sys-subsystem-net-devices-%i.device +After=network-pre.target +Before=network-online.target + + +[Service] +Type=oneshot +RemainAfterExit=yes +ExecStart=/usr/local/libexec/wait-global-address.sh %I + +[Install] +WantedBy=network-online.target diff --git a/roles/dch-storage-net/files/wait-global-address.sh b/roles/dch-storage-net/files/wait-global-address.sh new file mode 100644 index 0000000..16eb331 --- /dev/null +++ b/roles/dch-storage-net/files/wait-global-address.sh @@ -0,0 +1,6 @@ +#!/bin/sh + +until ip -o address show dev "$1" | grep -q global; do + printf 'Waiting for global address on %s\n' "$1" + sleep 1; +done diff --git a/roles/dch-storage-net/handlers/main.yml b/roles/dch-storage-net/handlers/main.yml new file mode 100644 index 0000000..8d4e1e3 --- /dev/null +++ b/roles/dch-storage-net/handlers/main.yml @@ -0,0 +1,2 @@ +- name: reload systemd + command: systemctl daemon-reload diff --git a/roles/dch-storage-net/tasks/main.yml b/roles/dch-storage-net/tasks/main.yml new file mode 100644 index 0000000..4da1957 --- /dev/null +++ b/roles/dch-storage-net/tasks/main.yml @@ -0,0 +1,29 @@ +- name: ensure wait-global-address script is installed + copy: + src=wait-global-address.sh + dest=/usr/local/libexec/wait-global-address.sh + mode=0755 +- name: ensure wait-global-address unit is installed + copy: + src=wait-global-address.service + dest=/etc/systemd/system/wait-global-address@.service + mode=0644 + notify: reload systemd + +- name: ensure wait-global-address service starts at boot + service: + name=wait-global-address@{{ storage_iface }}.service + enabled=yes +- name: ensure wait-global-address service is running + service: + name=wait-global-address@{{ storage_iface }}.service + state=started + +- name: ensure storage volumes are mounted + mount: + path={{ item.mountpoint }} + src={{ item.host }}:{{ item.share }} + fstype={{ item.fstype|d('nfs') }} + opts={{ item.opts|d(omit) }} + state=mounted + with_items: '{{ mount_shared_volumes }}'