# 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}'", '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_acti'] { $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' } } $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)}.") } }