puppet-prod/site/profiles/manifests/etcd/node.pp
Ben Vincent afd3405c98 feat: add etcd module/role (#215)
- add etcd module
- add etcd role, profile and hieradata

Reviewed-on: https://git.query.consul/unkinben/puppet-prod/pulls/215
2025-01-26 20:00:20 +11:00

59 lines
2.0 KiB
Puppet

# manage the use of the etcd module
class profiles::etcd::node (
Sensitive[String[1]] $initial_cluster_token,
Boolean $members_lookup = false,
String $members_role = undef,
Array $servers = [],
Stdlib::Port $client_port = 2379,
Stdlib::Port $peer_port = 2380,
Hash $config = {},
){
# if lookup is enabled
if $members_lookup {
# check that the role is also set
unless !($members_role == undef) {
fail("members_role must be provided for ${title} when members_lookup is True")
}
# if it is, find hosts, sort them so they dont cause changes every run
$servers_array = sort(query_nodes("enc_role='${members_role}' and region='${facts['region']}'", 'networking.fqdn'))
# else use provided array from params
}else{
$servers_array = sort($servers)
}
if length($servers_array) >= 3 {
# construct the initial-cluster string
$initial_cluster = $servers_array.map |$fqdn| {
# lookup the ip address for the current fqdn
$ip = query_nodes("networking.fqdn='${fqdn}'", 'networking.ip')[0]
# construct the string for this server
"${fqdn}=https://${ip}:${peer_port}"
}.join(',')
$defaults = {
'data-dir' => '/var/lib/etcd',
'name' => $facts['networking']['fqdn'],
'listen-client-urls' => "https://${facts['networking']['ip']}:${client_port}",
'listen-peer-urls' => "https://${facts['networking']['ip']}:${peer_port}",
'advertise-client-urls' => "https://${facts['networking']['ip']}:${client_port}",
'initial-advertise-peer-urls' => "https://${facts['networking']['ip']}:${peer_port}",
'initial-cluster-token' => $initial_cluster_token.unwrap,
'initial-cluster' => $initial_cluster,
'initial-cluster-state' => 'new',
}
$merged_config = merge($defaults, $config)
class { 'etcd':
config => $merged_config,
}
}
}