diff --git a/manifests/init.pp b/manifests/init.pp index 38c3a033..9ee976d6 100644 --- a/manifests/init.pp +++ b/manifests/init.pp @@ -293,7 +293,7 @@ # # $server_environment_timeout:: Timeout for cached compiled catalogs (10s, 5m, ...) # -# $server_envs_dir:: Directory that holds puppet environments +# $server_envs_dir:: List of directories which hold puppet environments # # $server_envs_target:: Indicates that $envs_dir should be # a symbolic link to this target @@ -654,7 +654,7 @@ String $server_environments_owner = $puppet::params::server_environments_owner, Optional[String] $server_environments_group = $puppet::params::server_environments_group, Pattern[/^[0-9]{3,4}$/] $server_environments_mode = $puppet::params::server_environments_mode, - Stdlib::Absolutepath $server_envs_dir = $puppet::params::server_envs_dir, + Array[Stdlib::Absolutepath, 1] $server_envs_dir = $puppet::params::server_envs_dir, Optional[Stdlib::Absolutepath] $server_envs_target = $puppet::params::server_envs_target, Variant[Undef, String[0], Array[Stdlib::Absolutepath]] $server_common_modules_path = $puppet::params::server_common_modules_path, Pattern[/^[0-9]{3,4}$/] $server_git_repo_mode = $puppet::params::server_git_repo_mode, diff --git a/manifests/params.pp b/manifests/params.pp index 5613a445..138a113e 100644 --- a/manifests/params.pp +++ b/manifests/params.pp @@ -243,10 +243,10 @@ $server_environments_group = $root_group $server_environments_mode = '0755' # Where we store our puppet environments - $server_envs_dir = "${codedir}/environments" + $server_envs_dir = ["${codedir}/environments"] $server_envs_target = undef # Modules in this directory would be shared across all environments - $server_common_modules_path = unique(["${server_envs_dir}/common", "${codedir}/modules", "${sharedir}/modules", '/usr/share/puppet/modules']) + $server_common_modules_path = unique(["${server_envs_dir[0]}/common", "${codedir}/modules", "${sharedir}/modules", '/usr/share/puppet/modules']) # Dynamic environments config, ignore if the git_repo is 'false' # Path to the repository diff --git a/manifests/server.pp b/manifests/server.pp index 2027f5ab..9f4efb49 100644 --- a/manifests/server.pp +++ b/manifests/server.pp @@ -71,7 +71,10 @@ # # $environments_mode:: Environments directory mode. # -# $envs_dir:: Directory that holds puppet environments +# $envs_dir:: List of directories that hold puppet environments +# 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 @@ -370,7 +373,7 @@ String $environments_owner = $puppet::server_environments_owner, Optional[String] $environments_group = $puppet::server_environments_group, Pattern[/^[0-9]{3,4}$/] $environments_mode = $puppet::server_environments_mode, - Stdlib::Absolutepath $envs_dir = $puppet::server_envs_dir, + Array[Stdlib::Absolutepath, 1] $envs_dir = $puppet::server_envs_dir, Optional[Stdlib::Absolutepath] $envs_target = $puppet::server_envs_target, Variant[Undef, String[0], Array[Stdlib::Absolutepath]] $common_modules_path = $puppet::server_common_modules_path, Pattern[/^[0-9]{3,4}$/] $git_repo_mode = $puppet::server_git_repo_mode, diff --git a/manifests/server/config.pp b/manifests/server/config.pp index 42c2469b..77210fbf 100644 --- a/manifests/server/config.pp +++ b/manifests/server/config.pp @@ -36,6 +36,7 @@ $server_external_nodes = $puppet::server::external_nodes $server_environment_timeout = $puppet::server::environment_timeout $trusted_external_command = $puppet::server::trusted_external_command + $primary_envs_dir = $puppet::server::envs_dir[0] if $server_external_nodes and $server_external_nodes != '' { class{ 'puppet::server::enc': @@ -59,7 +60,7 @@ puppet::config::main { 'reports': value => $puppet::server::reports; - 'environmentpath': value => $puppet::server::envs_dir; + 'environmentpath': value => $puppet::server::envs_dir.join(':'); } if $puppet::server::hiera_config and !empty($puppet::server::hiera_config){ puppet::config::main { @@ -241,13 +242,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.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 +272,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, $primary_envs_dir], } $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 06f41be6..8b9fabdb 100644 --- a/spec/classes/puppet_server_spec.rb +++ b/spec/classes/puppet_server_spec.rb @@ -696,6 +696,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 37173b0a..1a2a9e1a 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::config::primary_envs_dir") %>" # 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,