[PATCH 10/12] linux-mirror: add distribution-specific NFS server support

Daniel Gomez <[email protected]> Thu, 06 Nov 2025 23:36:04 +0100
Newsgroups dev.linux.lists.kdevops
Message-ID <[email protected]>
From: Daniel Gomez <[email protected]>

The original NFS support only worked on RedHat/Fedora systems, failing on
Debian/Ubuntu with "Could not find the requested service nfs-server" because
package and service names differ across distributions. RedHat uses nfs-utils
package with nfs-server service, while Debian/Ubuntu use nfs-kernel-server
for both, and SUSE uses nfs-kernel-server package with nfsserver service.

Created distribution-specific package installation tasks under install-deps/nfs/
with separate files for debian, redhat, and suse. A dispatcher in nfs/main.yml
uses import_tasks to include the correct distribution file based on
ansible_os_family. Using import_tasks instead of include_tasks ensures the when
conditions are applied at parse time to all imported tasks, avoiding the need
for redundant conditions in each distribution file.

The nfs_server_service variable is set in main.yml using three set_fact tasks
with distribution-specific conditionals. Setting the variable in the main task
scope rather than in imported files ensures it is available when the systemd
service enablement task runs. This approach separates package installation
(distribution-specific) from service management (common across all distributions).

Generated-by: Claude AI
Signed-off-by: Daniel Gomez <[email protected]>
---
 .../tasks/install-deps/nfs/debian/main.yml         |  9 ++++++
 .../linux-mirror/tasks/install-deps/nfs/main.yml   | 15 ++++++++++
 .../tasks/install-deps/nfs/redhat/main.yml         |  9 ++++++
 .../tasks/install-deps/nfs/suse/main.yml           |  9 ++++++
 playbooks/roles/linux-mirror/tasks/main.yml        | 34 +++++++++++++++++-----
 5 files changed, 69 insertions(+), 7 deletions(-)

diff --git a/playbooks/roles/linux-mirror/tasks/install-deps/nfs/debian/main.yml b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/debian/main.yml
new file mode 100644
index 00000000..98c0b1dc
--- /dev/null
+++ b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/debian/main.yml
@@ -0,0 +1,9 @@
+---
+- name: Install NFS server packages on Debian/Ubuntu
+  become: true
+  ansible.builtin.package:
+    name:
+      - rpcbind
+      - nfs-kernel-server
+    state: present
+  tags: ["mirror"]
diff --git a/playbooks/roles/linux-mirror/tasks/install-deps/nfs/main.yml b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/main.yml
new file mode 100644
index 00000000..0f67427a
--- /dev/null
+++ b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/main.yml
@@ -0,0 +1,15 @@
+---
+- name: Import Debian NFS dependencies
+  ansible.builtin.import_tasks: debian/main.yml
+  when:
+    - ansible_os_family == 'Debian'
+
+- name: Import RedHat NFS dependencies
+  ansible.builtin.import_tasks: redhat/main.yml
+  when:
+    - ansible_os_family == 'RedHat'
+
+- name: Import SUSE NFS dependencies
+  ansible.builtin.import_tasks: suse/main.yml
+  when:
+    - ansible_os_family == 'Suse'
diff --git a/playbooks/roles/linux-mirror/tasks/install-deps/nfs/redhat/main.yml b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/redhat/main.yml
new file mode 100644
index 00000000..936705e8
--- /dev/null
+++ b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/redhat/main.yml
@@ -0,0 +1,9 @@
+---
+- name: Install NFS server packages on RedHat/Fedora
+  become: true
+  ansible.builtin.package:
+    name:
+      - rpcbind
+      - nfs-utils
+    state: present
+  tags: ["mirror"]
diff --git a/playbooks/roles/linux-mirror/tasks/install-deps/nfs/suse/main.yml b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/suse/main.yml
new file mode 100644
index 00000000..9734a038
--- /dev/null
+++ b/playbooks/roles/linux-mirror/tasks/install-deps/nfs/suse/main.yml
@@ -0,0 +1,9 @@
+---
+- name: Install NFS server packages on SUSE
+  become: true
+  ansible.builtin.package:
+    name:
+      - rpcbind
+      - nfs-kernel-server
+    state: present
+  tags: ["mirror"]
diff --git a/playbooks/roles/linux-mirror/tasks/main.yml b/playbooks/roles/linux-mirror/tasks/main.yml
index bd47acd3..103996a3 100644
--- a/playbooks/roles/linux-mirror/tasks/main.yml
+++ b/playbooks/roles/linux-mirror/tasks/main.yml
@@ -256,18 +256,38 @@
     enabled: true
   tags: ["mirror"]
 
-- name: Install NFS server packages (for root user and if NFS is enabled)
-  become: true
-  ansible.builtin.package:
-    name:
-      - rpcbind
-    state: present
+- name: Install NFS server dependencies
+  ansible.builtin.include_tasks: install-deps/nfs/main.yml
   when:
     - not install_only_git_daemon|bool
     - ansible_user_id == 'root'
     - linux_mirror_nfs | bool
   tags: ["nfs", "mirror"]
 
+- name: Set NFS server service name for Debian/Ubuntu
+  ansible.builtin.set_fact:
+    nfs_server_service: nfs-kernel-server
+  when:
+    - ansible_os_family == 'Debian'
+    - linux_mirror_nfs | bool
+  tags: ["mirror"]
+
+- name: Set NFS server service name for RedHat/Fedora
+  ansible.builtin.set_fact:
+    nfs_server_service: nfs-server
+  when:
+    - ansible_os_family == 'RedHat'
+    - linux_mirror_nfs | bool
+  tags: ["mirror"]
+
+- name: Set NFS server service name for SUSE
+  ansible.builtin.set_fact:
+    nfs_server_service: nfsserver
+  when:
+    - ansible_os_family == 'Suse'
+    - linux_mirror_nfs | bool
+  tags: ["mirror"]
+
 - name: Ensure rpcbind and NFS services are started and enabled (for root user and if NFS is enabled)
   become: true
   ansible.builtin.systemd:
@@ -276,7 +296,7 @@
     enabled: true
   loop:
     - rpcbind
-    - nfs-server
+    - "{{ nfs_server_service }}"
   when:
     - ansible_user_id == 'root'
     - not install_only_git_daemon|bool

-- 
2.51.0