From bd96e59f99b04166079332b771dba4ea32cf85e0 Mon Sep 17 00:00:00 2001 From: Brian Schonecker Date: Tue, 14 Jan 2025 10:58:16 -0500 Subject: [PATCH] Add the option to create the exported directory automatically --- README.md | 6 +++-- REFERENCE.md | 37 +++++++++++++++++++++++----- manifests/functions/create_export.pp | 20 ++++++++++----- manifests/server/export.pp | 37 +++++++++++++++++++--------- spec/defines/server_export_spec.rb | 14 +++++++++-- 5 files changed, 87 insertions(+), 27 deletions(-) diff --git a/README.md b/README.md index 4b6da783..55970da3 100644 --- a/README.md +++ b/README.md @@ -153,10 +153,12 @@ This will mount /data on client in /share/data. } # ensure is passed to mount, which will make the client not mount it # the directory automatically, just add it to fstab + # The directory on the NFS server is not created automatically. nfs::server::export { '/media_library': - ensure => 'present', + ensure => 'present', nfstag => 'media', - clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)', + clients => '10.0.0.0/24(rw,insecure,async,no_root_squash) localhost(rw)', + manage_dir => false, } } diff --git a/REFERENCE.md b/REFERENCE.md index 2b23f7c6..f4f27fe7 100644 --- a/REFERENCE.md +++ b/REFERENCE.md @@ -1012,6 +1012,7 @@ The following parameters are available in the `nfs::functions::create_export` de * [`owner`](#-nfs--functions--create_export--owner) * [`group`](#-nfs--functions--create_export--group) * [`mode`](#-nfs--functions--create_export--mode) +* [`manage_dir`](#-nfs--functions--create_export--manage_dir) ##### `clients` @@ -1051,6 +1052,14 @@ Sets the permissions of the exported directory. Default value: `undef` +##### `manage_dir` + +Data type: `Boolean` + +Whether or not to manage the directory to be exported. + +Default value: `true` + ### `nfs::functions::mkdir` Manage directory creation. @@ -1103,7 +1112,19 @@ Default value: `'mounted'` ### `nfs::server::export` -Manage all exported resources on a NFS server. +nfs::server::export { '/srv/nfs_exported/directory': + clients => '1.2.3.4/24(rw,insecure,no_subtree_check,async,no_root_squash) 5.6.7.8/24(ro)', + share => 'share_name_on_nfs_server', +} + +Links + +* {Puppet Docs: Using Parameterized Classes}[http://j.mp/nVpyWY] + + nfs::server::export { '/srv/nfs_exported/directory': + clients => '1.2.3.4/24(rw,insecure,no_subtree_check,async,no_root_squash) 5.6.7.8/24(ro)', + share => 'share_name_on_nfs_server', + } #### Examples @@ -1116,11 +1137,6 @@ class { '::nfs': nfs_v4_export_root => '/share', nfs_v4_export_root_clients => '1.2.3.4/24(rw,fsid=root,insecure,no_subtree_check,async,no_root_squash)', } - -nfs::server::export { '/srv/nfs_exported/directory': - clients => '1.2.3.4/24(rw,insecure,no_subtree_check,async,no_root_squash) 5.6.7.8/24(ro)', - share => 'share_name_on_nfs_server', -} ``` #### Parameters @@ -1144,6 +1160,7 @@ The following parameters are available in the `nfs::server::export` defined type * [`v3_export_name`](#-nfs--server--export--v3_export_name) * [`v4_export_name`](#-nfs--server--export--v4_export_name) * [`nfsv4_bindmount_enable`](#-nfs--server--export--nfsv4_bindmount_enable) +* [`manage_dir`](#-nfs--server--export--manage_dir) ##### `clients` @@ -1282,3 +1299,11 @@ Data type: `Boolean` Default value: `$nfs::nfsv4_bindmount_enable` +##### `manage_dir` + +Data type: `Boolean` + +Whether or not to manage the directory to be exported. + +Default value: `true` + diff --git a/manifests/functions/create_export.pp b/manifests/functions/create_export.pp index 06786390..af361277 100644 --- a/manifests/functions/create_export.pp +++ b/manifests/functions/create_export.pp @@ -15,6 +15,9 @@ # @param mode # Sets the permissions of the exported directory. # +# @param manage_dir +# Whether or not to manage the directory to be exported. +# # @author # * Daniel Klockenkaemper # * Martin Alfke @@ -22,6 +25,7 @@ define nfs::functions::create_export ( Variant[String[1], Array[String[1]]] $clients, String[1] $ensure = 'present', + Boolean $manage_dir = true, Optional[String[1]] $owner = undef, Optional[String[1]] $group = undef, Optional[String[1]] $mode = undef, @@ -34,13 +38,17 @@ content => $line, } + # Create the directory path only if a File resource isn't + # defined previously AND the $manage_dir boolean is true. unless defined(File[$name]) { - file { $name: - ensure => directory, - owner => $owner, - group => $group, - mode => $mode, - selinux_ignore_defaults => true, + if $manage_dir { + file { $name: + ensure => directory, + owner => $owner, + group => $group, + mode => $mode, + selinux_ignore_defaults => true, + } } } } diff --git a/manifests/server/export.pp b/manifests/server/export.pp index 26303240..57ad30f3 100644 --- a/manifests/server/export.pp +++ b/manifests/server/export.pp @@ -47,6 +47,9 @@ # @param v4_export_name # @param nfsv4_bindmount_enable # +# @param manage_dir +# Whether or not to manage the directory to be exported. +# # @example # class { '::nfs': # server_enabled => true, @@ -55,6 +58,15 @@ # nfs_v4_export_root_clients => '1.2.3.4/24(rw,fsid=root,insecure,no_subtree_check,async,no_root_squash)', # } # +# nfs::server::export { '/srv/nfs_exported/directory': +# clients => '1.2.3.4/24(rw,insecure,no_subtree_check,async,no_root_squash) 5.6.7.8/24(ro)', +# share => 'share_name_on_nfs_server', +# } +# +# Links +# +# * {Puppet Docs: Using Parameterized Classes}[http://j.mp/nVpyWY] +# # nfs::server::export { '/srv/nfs_exported/directory': # clients => '1.2.3.4/24(rw,insecure,no_subtree_check,async,no_root_squash) 5.6.7.8/24(ro)', # share => 'share_name_on_nfs_server', @@ -84,6 +96,7 @@ Optional[String[1]] $mode = undef, String[1] $server = $facts['clientcert'], Boolean $nfsv4_bindmount_enable = $nfs::nfsv4_bindmount_enable, + Boolean $manage_dir = true, ) { if $nfs::server::nfs_v4 { if $nfsv4_bindmount_enable { @@ -103,12 +116,13 @@ } nfs::functions::create_export { $export_title: - ensure => $ensure, - clients => $clients, - owner => $owner, - group => $group, - mode => $mode, - require => $create_export_require, + ensure => $ensure, + clients => $clients, + manage_dir => $manage_dir, + owner => $owner, + group => $group, + mode => $mode, + require => $create_export_require, } if $mount != undef { @@ -137,11 +151,12 @@ } nfs::functions::create_export { $v3_export_name: - ensure => $ensure, - clients => $clients, - owner => $owner, - group => $group, - mode => $mode, + ensure => $ensure, + clients => $clients, + manage_dir => $manage_dir, + owner => $owner, + group => $group, + mode => $mode, } if $nfs::storeconfigs_enabled { diff --git a/spec/defines/server_export_spec.rb b/spec/defines/server_export_spec.rb index ed022024..e711361a 100644 --- a/spec/defines/server_export_spec.rb +++ b/spec/defines/server_export_spec.rb @@ -34,7 +34,15 @@ let(:params) { { clients: '1.2.3.4(rw)' } } - it { is_expected.to contain_nfs__functions__create_export('/srv/test').with('ensure' => 'mounted', 'clients' => '1.2.3.4(rw)') } + it do + is_expected.to contain_nfs__functions__create_export('/srv/test').with( + 'ensure' => 'mounted', + 'clients' => '1.2.3.4(rw)', + 'manage_dir' => true + ) + end + + it { is_expected.to contain_file('/srv/test').with('ensure' => 'directory') } it do expect(exported_resources).to contain_nfs__client__mount('/srv/test') @@ -70,10 +78,12 @@ let(:pre_condition) { 'class {"nfs": server_enabled => true, nfs_v4 => false, storeconfigs_enabled => false}' } - let(:params) { { clients: '1.2.3.4(rw)' } } + let(:params) { { clients: '1.2.3.4(rw)', manage_dir: false } } it { is_expected.to contain_nfs__functions__create_export('/srv/test').with('ensure' => 'mounted', 'clients' => '1.2.3.4(rw)') } + it { is_expected.not_to contain_file('/srv/test') } + it { expect(exported_resources).not_to contain_nfs__client__mount('/srv/test') } end