From 80f3374b97ef2499fcd18633638d7661767ce900 Mon Sep 17 00:00:00 2001 From: Ben Roberts Date: Mon, 20 Sep 2021 22:33:50 +0100 Subject: [PATCH] Support multiple envs_dir directories This module adds support for the puppet environmentpath setting to be configured using multiple directories. An example use-case is where r10k is in use to deploy some but not all environments, to avoid unmanaged environments being purged by r10k. - Each listed environmentpath directory will be created and managed by puppet - The default post-receive hook script uses the first listed directory in `envs_dir` to create initial environments to maintain backward compatibility. - The config_version_cmd is updated to use only the first listed directory from `envs_dir`, this is only used in the environment.conf.erb template which does not appear to be deployed anywhere in the current version of this module Tests are included to ensure that all listed directories are created and managed, and that any other references to the envs_dir parameter behave the same as if only a single directory were specified to maintain backward compatibility. Fixes #708 --- manifests/server.pp | 6 +++++- manifests/server/config.pp | 18 ++++++++++-------- spec/classes/puppet_server_spec.rb | 17 +++++++++++++++++ templates/server/post-receive.erb | 2 +- 4 files changed, 33 insertions(+), 10 deletions(-) diff --git a/manifests/server.pp b/manifests/server.pp index c6d76540f..1cfeebd23 100644 --- a/manifests/server.pp +++ b/manifests/server.pp @@ -72,6 +72,10 @@ # $environments_mode:: Environments directory mode. # # $envs_dir:: Directory that holds puppet environments +# Multiple paths can be specified, separated by colons. +# All listed directories will be created and attributes managed, +# but only the first listed path will be used to populate +# environments from git repo branches. # # $envs_target:: Indicates that $envs_dir should be # a symbolic link to this target @@ -488,7 +492,7 @@ if $config_version == undef { if $git_repo { - $config_version_cmd = "git --git-dir ${envs_dir}/\$environment/.git describe --all --long" + $config_version_cmd = "git --git-dir ${envs_dir.split(':')[0]}/\$environment/.git describe --all --long" } else { $config_version_cmd = undef } diff --git a/manifests/server/config.pp b/manifests/server/config.pp index 42c2469b5..d1068caca 100644 --- a/manifests/server/config.pp +++ b/manifests/server/config.pp @@ -241,13 +241,15 @@ $ensure = 'directory' } - file { $puppet::server::envs_dir: - ensure => $ensure, - owner => $puppet::server::environments_owner, - group => $puppet::server::environments_group, - mode => $puppet::server::environments_mode, - target => $puppet::server::envs_target, - force => true, + $puppet::server::envs_dir.split(':').each |$dir| { + file { $dir: + ensure => $ensure, + owner => $puppet::server::environments_owner, + group => $puppet::server::environments_group, + mode => $puppet::server::environments_mode, + target => $puppet::server::envs_target, + force => true, + } } if $puppet::server::git_repo { @@ -269,7 +271,7 @@ mode => $puppet::server::git_repo_mode, user => $puppet::server::git_repo_user, group => $puppet::server::git_repo_group, - require => File[$puppet::vardir, $puppet::server::envs_dir], + require => File[$puppet::vardir, $puppet::server::envs_dir.split(':')], } $git_branch_map = $puppet::server::git_branch_map diff --git a/spec/classes/puppet_server_spec.rb b/spec/classes/puppet_server_spec.rb index f8d859fa1..aa68a0489 100644 --- a/spec/classes/puppet_server_spec.rb +++ b/spec/classes/puppet_server_spec.rb @@ -697,6 +697,23 @@ end end end + + describe 'with multiple environment paths' do + let(:params) do + super().merge( + server_envs_dir: '/etc/puppetlabs/code/environments/:/etc/puppetlabs/code/unmanaged-environments/', + server_git_repo_path: '/test/puppet', + server_post_hook_name: 'post-receive', + server_git_repo: true, + ) + end + + it { should contain_puppet__config__main('environmentpath').with_value('/etc/puppetlabs/code/environments/:/etc/puppetlabs/code/unmanaged-environments/') } + it { should contain_file('/etc/puppetlabs/code/environments/') } + it { should contain_file('/etc/puppetlabs/code/unmanaged-environments/') } + it { should contain_git__repo('puppet_repo').that_requires('File[/etc/puppetlabs/code/environments/]') } + it { should contain_file('/test/puppet/hooks/post-receive').with_content(/ENVIRONMENT_BASEDIR\s=\s"\/etc\/puppetlabs\/code\/environments\/"/) } + end end end end diff --git a/templates/server/post-receive.erb b/templates/server/post-receive.erb index 37173b0a5..5cfc2dfa4 100644 --- a/templates/server/post-receive.erb +++ b/templates/server/post-receive.erb @@ -10,7 +10,7 @@ $stdout.sync = true $stderr.sync = true # Set this to where you want to keep your environments -ENVIRONMENT_BASEDIR = "<%= scope.lookupvar("puppet::server::envs_dir") %>" +ENVIRONMENT_BASEDIR = "<%= scope.lookupvar("puppet::server::envs_dir").split(/:/)[0] %>" # post-receive hooks set GIT_DIR to the current repository. If you want to # clone from a non-local repository, set this to the URL of the repository,