221 lines
6.6 KiB
Puppet
221 lines
6.6 KiB
Puppet
# ## Class: pacemaker::new::setup::pcsd
|
|
#
|
|
# A class to setup a pacemaker cluster using
|
|
# the "pcsd" service.
|
|
#
|
|
# ### Parameters
|
|
#
|
|
# [*cluster_nodes*]
|
|
# (required) A list cluster nodes to be authenticated by the PCSD daemon and
|
|
# be used in the cluster creation.
|
|
# This data can be provided in several forms:
|
|
#
|
|
# * String: `'node1 node2 node3'`
|
|
# * Array: `['node1', 'node2', 'node3']`
|
|
# * Hash:
|
|
# ```
|
|
# {
|
|
# 'node1' => {
|
|
# 'host' => 'my_node',
|
|
# },
|
|
# 'node2' => {
|
|
# 'host' => 'other_node',
|
|
# 'ring0' => '192.168.0.1',
|
|
# },
|
|
# 'node3' => {}
|
|
# }
|
|
# # Will be converted to:
|
|
# ['my_node', '192.168.0.1', 'node3']
|
|
# ```
|
|
#
|
|
# Elements in the hash are used in this priority:
|
|
# 1. *ring0, ring1, ...* have the highest priority.
|
|
# They can be given either IP addresses or hostnames.
|
|
# 2. *ip* will be used if there is no *ring0*
|
|
# 2. *host* will be used if there is no *ip*
|
|
# 3. Hash keys will be used if there is no *host*
|
|
#
|
|
# [*cluster_rrp_nodes*]
|
|
# (optional) A list of nodes that will be actually used to create the cluster.
|
|
# It will be equal to the *cluster_nodes* if not provided or can be set using
|
|
# the same ways as the *cluster_nodes* does.
|
|
# This can be used o either just override the list of cluster nodes and make
|
|
# it different from nodes used for **pcsd** authentication, or to make a
|
|
# Redundant Ring Protocol (RRP) enabled cluster.
|
|
#
|
|
# RRP nodes can be specified by providing all node's interfaces as a
|
|
# comma-separated list. For example, *node1* has interface *node1a* in the
|
|
# first ring and node1b in the second ring. Node2 has the same interfaces.
|
|
# In this case, RRP nodes can be provided like this:
|
|
#
|
|
# * String: `'node1a,node1b node2a,node2b'`
|
|
# * Array: `['node1a,node1b', 'node2a,node2b']`
|
|
# * Hash:
|
|
# ```
|
|
# {
|
|
# 'node1' => {
|
|
# 'host' => 'my_node',
|
|
# 'ip' => '192.168.0.1',
|
|
# },
|
|
# 'node2' => {
|
|
# 'host' => 'other_node',
|
|
# 'ring0' => '192.168.0.2',
|
|
# 'ring1' => '172.16.0.2',
|
|
# },
|
|
# 'node3' => {}
|
|
# }
|
|
# # Will be converted to:
|
|
# ['192.168.0.1', '192.168.0.2,172.16.0.2', 'node3']
|
|
# ```
|
|
#
|
|
# [*cluster_name*]
|
|
# (optional) The name of the cluster (no whitespace)
|
|
# Default: clustername
|
|
#
|
|
# [*cluster_setup*]
|
|
# (optional) If your cluster includes **pcsd**, this should be set to true for
|
|
# just one node in cluster. Else set to true for all nodes.
|
|
# Default: true
|
|
#
|
|
# [*cluster_options*]
|
|
# (optional) Hash additional cluster configuration options.
|
|
# Can be specified like this:
|
|
#
|
|
# * String: `'--token 10000 --ipv6 --join 100`
|
|
# * Array: `['--token', '10000', '--ipv6', '', '--join', '100']`
|
|
# * Hash:
|
|
# ```
|
|
# {
|
|
# '--token' => '10000',
|
|
# '--ipv6' => '',
|
|
# '--join' => '100',
|
|
# }
|
|
# # Or:
|
|
# {
|
|
# 'token' => '10000',
|
|
# 'ipv6' => '',
|
|
# 'join' => '100',
|
|
# }
|
|
# ```
|
|
#
|
|
# Supported cluster options:
|
|
# * transport udpu|udp
|
|
# * rrpmode active|passive
|
|
# * addr0 <addr/net>
|
|
# * mcast0 <address>
|
|
# * mcastport0 <port>
|
|
# * ttl0 <ttl>
|
|
# * broadcast0
|
|
# * addr1 <addr/net>
|
|
# * mcast1 <address>
|
|
# * mcastport1 <port>
|
|
# * ttl1 <ttl>
|
|
# * broadcast1
|
|
# * wait_for_all=<0|1>
|
|
# * auto_tie_breaker=<0|1>
|
|
# * last_man_standing=<0|1>
|
|
# * last_man_standing_window=<time in ms>
|
|
# * ipv6
|
|
# * token <timeout>
|
|
# * token_coefficient <timeout>
|
|
# * join <timeout>
|
|
# * consensus <timeout>
|
|
# * miss_count_const <count>
|
|
# * fail_recv_const <failures>
|
|
#
|
|
# [*cluster_user*]
|
|
# The user used by PCSD to authenticate nodes
|
|
#
|
|
# [*cluster_group*]
|
|
# The group of the user used by PCSD to authenticate nodes
|
|
#
|
|
# [*cluster_password*]
|
|
# Plaintext password of the user used by PCSD to authenticate nodes
|
|
#
|
|
# [*pcs_bin_path*]
|
|
# Path to the 'pcs' command
|
|
#
|
|
class pacemaker::new::setup::pcsd (
|
|
$cluster_nodes = $::pacemaker::new::params::cluster_nodes,
|
|
$cluster_rrp_nodes = $::pacemaker::new::params::cluster_rrp_nodes,
|
|
$cluster_name = $::pacemaker::new::params::cluster_name,
|
|
$cluster_setup = $::pacemaker::new::params::cluster_setup,
|
|
$cluster_options = $::pacemaker::new::params::cluster_options,
|
|
$cluster_user = $::pacemaker::new::params::cluster_user,
|
|
$cluster_group = $::pacemaker::new::params::cluster_group,
|
|
$cluster_password = $::pacemaker::new::params::cluster_password,
|
|
$pcs_bin_path = $::pacemaker::new::params::pcs_bin_path,
|
|
) inherits pacemaker::new::params {
|
|
validate_string($cluster_name)
|
|
validate_bool($cluster_setup)
|
|
validate_string($cluster_user)
|
|
validate_string($cluster_group)
|
|
validate_string($cluster_password)
|
|
validate_absolute_path($pcs_bin_path)
|
|
|
|
$cluster_nodes_array = pacemaker_cluster_nodes($cluster_nodes, 'array')
|
|
$cluster_setup_nodes = pick($cluster_rrp_nodes, $cluster_nodes, [])
|
|
$cluster_setup_nodes_list = pacemaker_cluster_nodes($cluster_setup_nodes, 'list')
|
|
|
|
user { 'hacluster' :
|
|
name => $cluster_user,
|
|
password => pw_hash($cluster_password, 'SHA-512', fqdn_rand_string(10)),
|
|
groups => $cluster_group,
|
|
}
|
|
|
|
pacemaker_pcsd_auth { 'setup' :
|
|
success => true,
|
|
nodes => $cluster_nodes_array,
|
|
username => $cluster_user,
|
|
password => $cluster_password,
|
|
whole => true,
|
|
local => false,
|
|
force => false,
|
|
}
|
|
|
|
if $cluster_setup {
|
|
$cluster_options_list = pacemaker_cluster_options($cluster_options)
|
|
|
|
exec { 'create-cluster' :
|
|
creates => '/etc/cluster/cluster.conf',
|
|
command => "${pcs_bin_path} cluster setup --name ${cluster_name} ${cluster_setup_nodes_list} ${cluster_options_list}",
|
|
unless => '/usr/bin/test -f /etc/corosync/corosync.conf',
|
|
tag => 'pacemaker-setup',
|
|
}
|
|
|
|
exec { 'start-cluster' :
|
|
unless => "${pcs_bin_path} status >/dev/null 2>&1",
|
|
command => "${pcs_bin_path} cluster start --all",
|
|
tag => 'pacemaker-setup',
|
|
}
|
|
|
|
# the cluster should first be created and then started
|
|
Exec['create-cluster'] ->
|
|
Exec['start-cluster']
|
|
}
|
|
|
|
pacemaker_online { 'setup' :}
|
|
|
|
# hacluster user is required to run auth
|
|
# and should notify it to reauth if its password changes
|
|
User['hacluster'] ~>
|
|
Pacemaker_pcsd_auth['setup']
|
|
|
|
# online check should always be after the auth commands
|
|
Pacemaker_pcsd_auth['setup'] ->
|
|
Pacemaker_online['setup']
|
|
|
|
# always run auth before setup commands
|
|
Pacemaker_pcsd_auth['setup'] ->
|
|
Exec <|tag == 'pacemaker-setup'|> ->
|
|
Pacemaker_online['setup']
|
|
|
|
# run the cluster services after they have
|
|
# already been setup and enabled by the pcsd
|
|
# it should be an idempotent action
|
|
# all cluster services should go before online check
|
|
Exec <| tag == 'pacemaker-setup' |> ->
|
|
Service <| tag == 'cluster-service' |> ->
|
|
Pacemaker_online['setup']
|
|
}
|