Skip to content

Commit

Permalink
(puppetlabs#469) Assign correct environment to node groups
Browse files Browse the repository at this point in the history
This checks if a user configured a environment in pe.conf. If that's the
case, it will be used for the PEADM-specific node groups. Otherwise we
fall back to production.

This fixes a timing issue discovered in puppetlabs#469. In situations where the PE
infra isn't running in production, we cannot assume that a production
environment exists. And a node group can only reference classes from the
environment the node group belongs to.
  • Loading branch information
bastelfreak committed Aug 21, 2024
1 parent 4a27e2d commit 119a48b
Show file tree
Hide file tree
Showing 11 changed files with 153 additions and 12 deletions.
76 changes: 75 additions & 1 deletion REFERENCE.md
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@
* [`peadm::file_or_content`](#peadm--file_or_content)
* [`peadm::flatten_compact`](#peadm--flatten_compact)
* [`peadm::generate_pe_conf`](#peadm--generate_pe_conf): Generate a pe.conf file in JSON format
* [`peadm::get_node_group_environment`](#peadm--get_node_group_environment): check if a custom PE environment is set in pe.conf
* [`peadm::get_pe_conf`](#peadm--get_pe_conf)
* [`peadm::get_targets`](#peadm--get_targets): Accept undef or a SingleTargetSpec, and return an Array[Target, 1, 0]. This differs from get_target() in that: - It returns an Array[Target
* [`peadm::migration_opts_default`](#peadm--migration_opts_default)
Expand Down Expand Up @@ -109,7 +110,6 @@ Supported use cases:
* `peadm::misc::divert_code_manager`: This plan exists to account for a scenario where a PE XL
* `peadm::modify_cert_extensions`
* `peadm::subplans::component_install`: Install a new PEADM component
* `peadm::subplans::configure`: Configure first-time classification and DR setup
* `peadm::subplans::db_populate`: Destructively (re)populates a new or existing database with the contents or a known good source
* `peadm::subplans::install`: Perform initial installation of Puppet Enterprise Extra Large
* `peadm::subplans::modify_certificate`
Expand Down Expand Up @@ -715,6 +715,24 @@ Data type: `Hash`
A hash of settings to set in the config file. Any keys that are set to
undef will not be included in the config file.

### <a name="peadm--get_node_group_environment"></a>`peadm::get_node_group_environment`

Type: Puppet Language

check if a custom PE environment is set in pe.conf

#### `peadm::get_node_group_environment(Target $primary)`

The peadm::get_node_group_environment function.

Returns: `Any`

##### `primary`

Data type: `Target`

the FQDN for the primary, here we will read the pe.conf from

### <a name="peadm--get_pe_conf"></a>`peadm::get_pe_conf`

Type: Puppet Language
Expand Down Expand Up @@ -1563,10 +1581,16 @@ The peadm::add_database class.

The following parameters are available in the `peadm::add_database` plan:

* [`node_group_environment`](#-peadm--add_database--node_group_environment)
* [`targets`](#-peadm--add_database--targets)
* [`primary_host`](#-peadm--add_database--primary_host)
* [`mode`](#-peadm--add_database--mode)
* [`begin_at_step`](#-peadm--add_database--begin_at_step)
* [`environment_node_group`](#-peadm--add_database--environment_node_group)

##### <a name="-peadm--add_database--node_group_environment"></a>`node_group_environment`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

##### <a name="-peadm--add_database--targets"></a>`targets`

Expand Down Expand Up @@ -1606,6 +1630,14 @@ Optional[Enum[

Default value: `undef`

##### <a name="-peadm--add_database--environment_node_group"></a>`environment_node_group`

Data type: `String[1]`



Default value: `peadm::get_node_group_environment($primary_host)`

### <a name="peadm--backup"></a>`peadm::backup`

Backup puppet primary configuration
Expand Down Expand Up @@ -1692,6 +1724,7 @@ management using PEAdm.

The following parameters are available in the `peadm::convert` plan:

* [`node_group_environment`](#-peadm--convert--node_group_environment)
* [`primary_host`](#-peadm--convert--primary_host)
* [`replica_host`](#-peadm--convert--replica_host)
* [`compiler_hosts`](#-peadm--convert--compiler_hosts)
Expand All @@ -1702,6 +1735,11 @@ The following parameters are available in the `peadm::convert` plan:
* [`internal_compiler_b_pool_address`](#-peadm--convert--internal_compiler_b_pool_address)
* [`dns_alt_names`](#-peadm--convert--dns_alt_names)
* [`begin_at_step`](#-peadm--convert--begin_at_step)
* [`environment_node_group`](#-peadm--convert--environment_node_group)

##### <a name="-peadm--convert--node_group_environment"></a>`node_group_environment`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

##### <a name="-peadm--convert--primary_host"></a>`primary_host`

Expand Down Expand Up @@ -1789,6 +1827,14 @@ Optional[Enum[

Default value: `undef`

##### <a name="-peadm--convert--environment_node_group"></a>`environment_node_group`

Data type: `String[1]`



Default value: `peadm::get_node_group_environment($primary_host)`

### <a name="peadm--install"></a>`peadm::install`

Install a new PE cluster
Expand All @@ -1805,6 +1851,7 @@ The following parameters are available in the `peadm::install` plan:
* [`final_agent_state`](#-peadm--install--final_agent_state)
* [`stagingdir`](#-peadm--install--stagingdir)
* [`uploaddir`](#-peadm--install--uploaddir)
* [`node_group_environment`](#-peadm--install--node_group_environment)
* [`primary_host`](#-peadm--install--primary_host)
* [`replica_host`](#-peadm--install--replica_host)
* [`compiler_hosts`](#-peadm--install--compiler_hosts)
Expand All @@ -1825,6 +1872,7 @@ The following parameters are available in the `peadm::install` plan:
* [`download_mode`](#-peadm--install--download_mode)
* [`permit_unsafe_versions`](#-peadm--install--permit_unsafe_versions)
* [`token_lifetime`](#-peadm--install--token_lifetime)
* [`environment_node_group`](#-peadm--install--environment_node_group)

##### <a name="-peadm--install--compiler_pool_address"></a>`compiler_pool_address`

Expand Down Expand Up @@ -1904,6 +1952,10 @@ for offline usage.

Default value: `undef`

##### <a name="-peadm--install--node_group_environment"></a>`node_group_environment`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

##### <a name="-peadm--install--primary_host"></a>`primary_host`

Data type: `Peadm::SingleTargetSpec`
Expand Down Expand Up @@ -2060,6 +2112,14 @@ Data type: `String`

Default value: `'1y'`

##### <a name="-peadm--install--environment_node_group"></a>`environment_node_group`

Data type: `String[1]`



Default value: `peadm::get_node_group_environment($primary_host)`

### <a name="peadm--modify_certificate"></a>`peadm::modify_certificate`

Certificates can be modified by adding extensions, removing extensions, or
Expand Down Expand Up @@ -2277,6 +2337,7 @@ The following parameters are available in the `peadm::upgrade` plan:
* [`r10k_known_hosts`](#-peadm--upgrade--r10k_known_hosts)
* [`stagingdir`](#-peadm--upgrade--stagingdir)
* [`uploaddir`](#-peadm--upgrade--uploaddir)
* [`node_group_environment`](#-peadm--upgrade--node_group_environment)
* [`primary_host`](#-peadm--upgrade--primary_host)
* [`replica_host`](#-peadm--upgrade--replica_host)
* [`compiler_hosts`](#-peadm--upgrade--compiler_hosts)
Expand All @@ -2287,6 +2348,7 @@ The following parameters are available in the `peadm::upgrade` plan:
* [`download_mode`](#-peadm--upgrade--download_mode)
* [`permit_unsafe_versions`](#-peadm--upgrade--permit_unsafe_versions)
* [`begin_at_step`](#-peadm--upgrade--begin_at_step)
* [`environment_node_group`](#-peadm--upgrade--environment_node_group)

##### <a name="-peadm--upgrade--compiler_pool_address"></a>`compiler_pool_address`

Expand Down Expand Up @@ -2366,6 +2428,10 @@ for offline usage.

Default value: `'/tmp'`

##### <a name="-peadm--upgrade--node_group_environment"></a>`node_group_environment`

environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production

##### <a name="-peadm--upgrade--primary_host"></a>`primary_host`

Data type: `Peadm::SingleTargetSpec`
Expand Down Expand Up @@ -2454,6 +2520,14 @@ Optional[Enum[

Default value: `undef`

##### <a name="-peadm--upgrade--environment_node_group"></a>`environment_node_group`

Data type: `String[1]`



Default value: `peadm::get_node_group_environment($primary_host)`

### <a name="peadm--util--init_db_server"></a>`peadm::util::init_db_server`

The peadm::util::init_db_server class.
Expand Down
31 changes: 31 additions & 0 deletions functions/get_node_group_environment.pp
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
#
# @summary check if a custom PE environment is set in pe.conf
#
# @param primary the FQDN for the primary, here we will read the pe.conf from
#
# @see https://www.puppet.com/docs/pe/latest/upgrade_pe#update_environment
#
# @author Tim Meusel <[email protected]>
#
function peadm::get_node_group_environment(Target $primary) {
$peconf = peadm::get_pe_conf($primary)
# if both are set, they need to be set to the same value
# if they are not set, we assume that the user runs their infra in production
$pe_install = $peconf['pe_install::install::classification::pe_node_group_environment']
$puppet_enterprise = $peconf['puppet_enterprise::master::recover_configuration::pe_environment']

# check if both are equal
# This also evaluates to true if both are undef
if $pe_install == $puppet_enterprise {
# check if the option isn't undef
# ToDo: A proper regex for allowed characters in an environment would be nice
# https://github.com/puppetlabs/puppet-docs/issues/1158
if $pe_install =~ String[1] {
return $pe_install
} else {
return 'production'
}
} else {
fail("pe_install::install::classification::pe_node_group_environment and puppet_enterprise::master::recover_configuration::pe_environment need to be set to the same value, not '${pe_install}' and ${puppet_enterprise}")
}
}
3 changes: 3 additions & 0 deletions manifests/setup/node_manager.pp
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,7 @@
# A load balancer address directing traffic to any of the "B" pool
# compilers. This is used for DR configuration in large and extra large
# architectures.
# @param node_group_environment the environment that will be assigned to all the PE Infra node groups
#
class peadm::setup::node_manager (
String[1] $primary_host,
Expand All @@ -36,6 +37,7 @@
Optional[String[1]] $compiler_pool_address = undef,
Optional[String[1]] $internal_compiler_a_pool_address = $server_a_host,
Optional[String[1]] $internal_compiler_b_pool_address = $server_b_host,
String[1] $node_group_environment = 'production',
) {
# "Not-configured" placeholder string. This will be used in places where we
# cannot set an explicit null, and need to supply some kind of value.
Expand All @@ -46,6 +48,7 @@
# else.
Node_group {
purge_behavior => none,
environment => $node_group_environment,
}

##################################################
Expand Down
22 changes: 14 additions & 8 deletions plans/add_database.pp
Original file line number Diff line number Diff line change
@@ -1,3 +1,6 @@
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::add_database(
Peadm::SingleTargetSpec $targets,
Peadm::SingleTargetSpec $primary_host,
Expand All @@ -9,6 +12,7 @@
'update-db-settings',
'cleanup-db',
'finalize']] $begin_at_step = undef,
String[1] $environment_node_group = peadm::get_node_group_environment($primary_host),
) {
$primary_target = peadm::get_targets($primary_host, 1)
$postgresql_target = peadm::get_targets($targets, 1)
Expand Down Expand Up @@ -91,13 +95,13 @@
run_plan('peadm::subplans::component_install', $postgresql_target,
primary_host => $primary_target,
avail_group_letter => $avail_group_letter,
role => 'puppet/puppetdb-database'
role => 'puppet/puppetdb-database',
)
}

# Stop Puppet to ensure catalogs are not being compiled for PE infrastructure nodes
run_command('systemctl stop puppet.service', peadm::flatten_compact([
$postgresql_target,
$postgresql_target,
$compilers,
$primary_target,
$replica_target,
Expand Down Expand Up @@ -128,15 +132,17 @@
$host = pick($a_host, $b_host)
out::verbose("In transitive state, setting classification to ${host}")
run_plan('peadm::util::update_classification', $primary_target,
postgresql_a_host => $host,
postgresql_b_host => $host,
peadm_config => $peadm_config
postgresql_a_host => $host,
postgresql_b_host => $host,
peadm_config => $peadm_config,
environment_node_group => $environment_node_group,
)
} else {
run_plan('peadm::util::update_classification', $primary_target,
postgresql_a_host => $avail_group_letter ? { 'A' => $postgresql_host, default => undef },
postgresql_b_host => $avail_group_letter ? { 'B' => $postgresql_host, default => undef },
peadm_config => $peadm_config
postgresql_a_host => $avail_group_letter ? { 'A' => $postgresql_host, default => undef },
postgresql_b_host => $avail_group_letter ? { 'B' => $postgresql_host, default => undef },
peadm_config => $peadm_config,
environment_node_group => $environment_node_group,
)
}
}
Expand Down
8 changes: 6 additions & 2 deletions plans/add_replica.pp
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,9 @@
# @param replica_host - The hostname and certname of the replica VM
# @param replica_postgresql_host - The hostname and certname of the host with the replica PE-PosgreSQL database.
# @param token_file - (optional) the token file in a different location than the default.
#
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
# Can be a separate host in an XL architecture, or undef in Standard or Large.
plan peadm::add_replica(
# Standard or Large
Expand All @@ -21,6 +23,7 @@

# Common Configuration
Optional[String] $token_file = undef,
String[1] $environment_node_group = peadm::get_node_group_environment($primary_host),
) {
$primary_target = peadm::get_targets($primary_host, 1)
$replica_target = peadm::get_targets($replica_host, 1)
Expand Down Expand Up @@ -94,7 +97,8 @@
server_b_host => $replica_avail_group_letter ? { 'B' => $replica_host, default => undef },
internal_compiler_a_pool_address => $replica_avail_group_letter ? { 'A' => $replica_host, default => undef },
internal_compiler_b_pool_address => $replica_avail_group_letter ? { 'B' => $replica_host, default => undef },
peadm_config => $peadm_config
peadm_config => $peadm_config,
environment_node_group => $environment_node_group,
)

# Source list of files on Primary and synchronize to new Replica
Expand Down
6 changes: 6 additions & 0 deletions plans/convert.pp
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,9 @@
# This plan sets required certificate extensions on PE nodes, and configures
# the required PE node groups to make an existing cluster compatible with
# management using PEAdm.
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::convert (
# Standard
Peadm::SingleTargetSpec $primary_host,
Expand All @@ -26,6 +29,8 @@
'modify-infra-certs',
'convert-node-groups',
'finalize']] $begin_at_step = undef,

String[1] $environment_node_group = peadm::get_node_group_environment($primary_host),
) {
peadm::assert_supported_bolt_version()

Expand Down Expand Up @@ -223,6 +228,7 @@
compiler_pool_address => $compiler_pool_address,
internal_compiler_a_pool_address => $internal_compiler_a_pool_address,
internal_compiler_b_pool_address => $internal_compiler_b_pool_address,
node_group_environment => $node_group_environment,
require => Class['peadm::setup::node_manager_yaml'],
}

Expand Down
4 changes: 4 additions & 0 deletions plans/install.pp
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,8 @@
# Directory the installer tarball will be uploaded to or expected to be in
# for offline usage.
#
# @param node_group_environment environment for the PEADM specific node groups, if not set it will be gathered from pe.conf or production
#
plan peadm::install (
# Standard
Peadm::SingleTargetSpec $primary_host,
Expand Down Expand Up @@ -73,6 +75,7 @@
Enum['direct', 'bolthost'] $download_mode = 'bolthost',
Boolean $permit_unsafe_versions = false,
String $token_lifetime = '1y',
String[1] $environment_node_group = peadm::get_node_group_environment($primary_host),
) {
peadm::assert_supported_bolt_version()

Expand Down Expand Up @@ -134,6 +137,7 @@
internal_compiler_b_pool_address => $internal_compiler_b_pool_address,
deploy_environment => $deploy_environment,
ldap_config => $ldap_config,
environment_node_group => $environment_node_group,

# Other
stagingdir => $stagingdir,
Expand Down
Loading

0 comments on commit 119a48b

Please sign in to comment.