Skip to content

Commit

Permalink
Support multiple envs_dir directories
Browse files Browse the repository at this point in the history
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. Multiple directories are passed as an Array of Stdlib::Absolutepath
values. For backwards compatibility, a single string is also accepted, and converted
into a single-element array on each use.

- 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.

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
Depends on #805
  • Loading branch information
optiz0r committed Sep 21, 2021
1 parent 268180e commit 1bf1fd2
Show file tree
Hide file tree
Showing 6 changed files with 40 additions and 15 deletions.
5 changes: 3 additions & 2 deletions manifests/init.pp
Original file line number Diff line number Diff line change
Expand Up @@ -293,7 +293,8 @@
#
# $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
# Also accepts a single directory as a string.
#
# $server_envs_target:: Indicates that $envs_dir should be
# a symbolic link to this target
Expand Down Expand Up @@ -654,7 +655,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,
Variant[Array[Stdlib::Absolutepath, 1], Stdlib::Absolutepath] $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,
Expand Down
2 changes: 1 addition & 1 deletion manifests/params.pp
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@
$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[0]}/common", "${codedir}/modules", "${sharedir}/modules", '/usr/share/puppet/modules'])
Expand Down
8 changes: 6 additions & 2 deletions manifests/server.pp
Original file line number Diff line number Diff line change
Expand Up @@ -71,7 +71,11 @@
#
# $environments_mode:: Environments directory mode.
#
# $envs_dir:: Directory that holds puppet environments
# $envs_dir:: List of directories that hold puppet environments
# A single directory can also be specified as a string.
# 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
Expand Down Expand Up @@ -370,7 +374,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,
Variant[Array[Stdlib::Absolutepath, 1], Stdlib::Absolutepath] $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,
Expand Down
21 changes: 12 additions & 9 deletions manifests/server/config.pp
Original file line number Diff line number Diff line change
Expand Up @@ -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 = Array($puppet::server::envs_dir, true)[0]

if $server_external_nodes and $server_external_nodes != '' {
class{ 'puppet::server::enc':
Expand All @@ -59,7 +60,7 @@

puppet::config::main {
'reports': value => $puppet::server::reports;
'environmentpath': value => $puppet::server::envs_dir;
'environmentpath': value => Array($puppet::server::envs_dir, true).join(':');
}
if $puppet::server::hiera_config and !empty($puppet::server::hiera_config){
puppet::config::main {
Expand Down Expand Up @@ -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,
Array($puppet::server::envs_dir, true).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 {
Expand All @@ -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
Expand Down
17 changes: 17 additions & 0 deletions spec/classes/puppet_server_spec.rb
Original file line number Diff line number Diff line change
Expand Up @@ -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
2 changes: 1 addition & 1 deletion templates/server/post-receive.erb
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down

0 comments on commit 1bf1fd2

Please sign in to comment.