217 lines
7.7 KiB
Puppet
217 lines
7.7 KiB
Puppet
# profiles::sql::galera_member
|
|
class profiles::sql::galera_member (
|
|
String $cluster_name,
|
|
String $root_password,
|
|
String $status_password,
|
|
Enum[
|
|
'mariabackup',
|
|
'mysqldump',
|
|
'rsync',
|
|
'skip',
|
|
'xtrabackup',
|
|
'xtrabackup-v2'
|
|
] $wsrep_sst_method = 'xtrabackup-v2',
|
|
Integer $mysql_port = 3306,
|
|
Boolean $galera_members_lookup = false,
|
|
String $galera_members_role = undef,
|
|
String $galera_master = undef,
|
|
Array $galera_servers = [],
|
|
Boolean $configure_firewall = false,
|
|
Integer $wsrep_state_transfer_port = 4444,
|
|
Integer $wsrep_inc_state_transfer_port = 4568,
|
|
Integer $wsrep_group_comm_port = 4567,
|
|
String $innodb_buffer_pool_size = '256M',
|
|
Integer $innodb_file_per_table = 1,
|
|
Integer $innodb_autoinc_lock_mode = 2,
|
|
Stdlib::IP::Address $local_ip = $facts['networking']['ip'],
|
|
Stdlib::Absolutepath $datadir = '/var/lib/mysql',
|
|
Hash $override_options_mysqld = {},
|
|
Hash $override_options_galera = {},
|
|
Boolean $package_manage = true,
|
|
String $package_name = 'mariadb-server',
|
|
Boolean $epel_needed = false,
|
|
Boolean $manage_repo = true,
|
|
) {
|
|
|
|
# check that the master is named
|
|
unless !($galera_master == undef) {
|
|
fail("galera_master must be provided for ${title}")
|
|
}
|
|
|
|
# if lookup is enabled
|
|
if $galera_members_lookup {
|
|
|
|
# check that the role is also set
|
|
unless !($galera_members_role == undef) {
|
|
fail("galera_members_role must be provided for ${title} when galera_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='${galera_members_role}' and region='${facts['region']}'", 'networking.fqdn'))
|
|
|
|
# else use provided array from params
|
|
}else{
|
|
$servers_array = $galera_servers
|
|
}
|
|
|
|
# if its not an empty array. Give puppetdb a chance to be populated with data.
|
|
if length($servers_array) >= 3 {
|
|
|
|
# if selinux is defined, manage it
|
|
if $::facts['os']['selinux']['config_mode'] == 'enforcing' {
|
|
|
|
# set permissive on first run, as we need mariadb installed/started at a custom path before adding fcontext
|
|
if $::facts['mariadb_active'] { $selinux_mode = 'enforcing' }else{ $selinux_mode = 'permissive' }
|
|
|
|
# call the mysqld selinux class
|
|
class { 'profiles::selinux::mysqld':
|
|
datadir => $datadir,
|
|
selinux_mode => $selinux_mode,
|
|
require => Class['Mysql::Server'],
|
|
}
|
|
}
|
|
|
|
# check if this is the master_node
|
|
if $galera_master == $::facts['networking']['fqdn'] {
|
|
$galera_master_bool = true
|
|
}else{
|
|
$galera_master_bool = false
|
|
}
|
|
|
|
# find bootstrap status for servers
|
|
$bootstrap_array = puppetdb_query("inventory[certname, facts] { facts.enc_role = '${galera_members_role}' }").map |$node| {
|
|
{
|
|
'fqdn' => $node['certname'],
|
|
'bootstrap' => $node['facts']['mariadb_galera_active'],
|
|
}
|
|
}
|
|
|
|
# determine if the cluster is bootstrapped
|
|
$cluster_bootstrapped = $bootstrap_array.any |$server| {
|
|
$server['fqdn'] == $galera_master and $server['bootstrap'] == true
|
|
}
|
|
|
|
# for setting puppetlabs-mysql params
|
|
# ['mysqld']['datadir'] = /var/lib/mysql
|
|
# TODO move to a params class later, mysql and galera
|
|
$default_override_options_mysqld = {
|
|
'mysqld' => {
|
|
'datadir' => $datadir,
|
|
'innodb_buffer_pool_size' => $innodb_buffer_pool_size,
|
|
'innodb_file_per_table' => $innodb_file_per_table,
|
|
'innodb_autoinc_lock_mode' => $innodb_autoinc_lock_mode,
|
|
'binlog_format' => 'ROW',
|
|
'default-storage-engine' => 'innodb',
|
|
'query_cache_size' => '0',
|
|
'query_cache_type' => '0',
|
|
'bind-address' => $local_ip,
|
|
}
|
|
}
|
|
$default_override_options_galera = {
|
|
'galera' => {
|
|
'wsrep_on' => 'ON',
|
|
'wsrep_node_name' => $::facts['networking']['hostname'],
|
|
'wsrep_provider' => '/usr/lib64/galera/libgalera_smm.so',
|
|
'wsrep_cluster_name' => $cluster_name,
|
|
'wsrep_cluster_address' => "gcomm://${join($servers_array, ',')}",
|
|
'wsrep_sst_method' => $wsrep_sst_method,
|
|
'wsrep_provider_options' => ["ist.recv_addr=${local_ip}:${wsrep_inc_state_transfer_port}", "ist.recv_bind=${local_ip}", ''],
|
|
'wsrep_node_address' => "${local_ip}:${wsrep_group_comm_port}"
|
|
}
|
|
}
|
|
|
|
# merge the mysqld/galera defaults with the $override_options_{mysqld|galera}
|
|
$merged_overrides_mysqld_only = merge($default_override_options_mysqld, $override_options_mysqld)
|
|
$merged_overrides_galera_only = merge($default_override_options_mysqld, $override_options_mysqld)
|
|
|
|
# merge both galera and mariadb
|
|
$merged_overrides_both = merge($default_override_options_galera, $merged_overrides_mysqld_only)
|
|
|
|
# prepare non-master cluster members
|
|
if $::facts['mariadb_installed'] and ! $galera_master_bool {
|
|
|
|
# set service manage/enabled to match $cluster_bootstrapped
|
|
$real_service_manage = $cluster_bootstrapped
|
|
$real_service_enabled = $cluster_bootstrapped
|
|
|
|
# if cluster master is bootstrapped, add these nodes to the cluster
|
|
if $cluster_bootstrapped {
|
|
$merged_overrides = $merged_overrides_both
|
|
}else{
|
|
$merged_overrides = $merged_overrides_mysqld_only
|
|
}
|
|
|
|
# if cluster is boostrapped, but galera is not active on this node, then
|
|
# restart mariadb after mysql class reconfigures mariadb
|
|
if $cluster_bootstrapped and $::facts['mariadb_galera_active'] == false {
|
|
$restart_mariadb = true
|
|
}else{
|
|
$restart_mariadb = false
|
|
}
|
|
}
|
|
|
|
# prepare master cluster member
|
|
if $::facts['mariadb_installed'] and $galera_master_bool{
|
|
|
|
# set restart option for mariadb
|
|
$restart_mariadb = false
|
|
|
|
# check if cluster is already bootstrapped
|
|
if $cluster_bootstrapped {
|
|
|
|
# set service manage/enabled to match $cluster_bootstrapped
|
|
$real_service_manage = true
|
|
$real_service_enabled = true
|
|
|
|
# set overrides
|
|
$merged_overrides = $merged_overrides_both
|
|
|
|
}else{
|
|
|
|
# set overrides
|
|
$merged_overrides = $merged_overrides_both
|
|
|
|
# bootstrap a cluster, as this is the first setup, mariadb should be active
|
|
if $::facts['mariadb_active'] {
|
|
|
|
# stop mariadb before bootstrapping
|
|
exec { 'stop_mariadb_for_bootstrap':
|
|
command => 'systemctl stop mariadb',
|
|
path => ['/bin', '/usr/bin'],
|
|
require => Class['Mysql::server'],
|
|
}
|
|
|
|
# bootstrap galera cluster
|
|
# only run if the cluster is not already bootstrapped
|
|
exec { 'bootstrap_galera_new_cluster':
|
|
command => 'galera_new_cluster',
|
|
path => ['/bin', '/usr/bin'],
|
|
require => Class['Mysql::server'],
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
# prepare for initial run, this will create a single-node mariadb host
|
|
if ! $::facts['mariadb_installed'] {
|
|
$merged_overrides = $merged_overrides_mysqld_only
|
|
$restart_mariadb = true
|
|
}
|
|
|
|
class { 'mysql::server':
|
|
root_password => $root_password,
|
|
remove_default_accounts => true,
|
|
restart => $restart_mariadb,
|
|
service_manage => $real_service_manage,
|
|
service_enabled => $real_service_enabled,
|
|
package_manage => $package_manage,
|
|
package_name => $package_name,
|
|
override_options => $merged_overrides,
|
|
}
|
|
|
|
}else{
|
|
notice("${title} requires the servers_array to have 3 or more, currently it is ${length($servers_array)}.")
|
|
}
|
|
|
|
}
|