2016-02-19 18:09:49 +01:00

180 lines
5.6 KiB
Ruby

#
# Cookbook Name:: mariadb
# Recipe:: galera
#
# Copyright 2014, blablacar.com
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
#
case node['mariadb']['install']['type']
when 'package'
# include MariaDB repositories
include_recipe "#{cookbook_name}::repository"
case node['platform']
when 'debian', 'ubuntu'
include_recipe "#{cookbook_name}::_debian_galera"
when 'redhat', 'centos', 'fedora', 'scientific', 'amazon'
include_recipe "#{cookbook_name}::_redhat_galera"
end
when 'from_source'
# To be filled as soon as possible
end
if node['mariadb']['galera']['wsrep_sst_method'] == 'rsync'
package 'rsync' do
action :install
end
else
if node['mariadb']['galera']['wsrep_sst_method'] =~ /^xtrabackup(-v2)?/
package 'percona-xtrabackup' do
action :install
end
package 'socat' do
action :install
end
end
end
include_recipe "#{cookbook_name}::config"
galera_cluster_nodes = []
if !node['mariadb'].attribute?('rspec') && Chef::Config[:solo]
if node['mariadb']['galera']['cluster_nodes'].empty?
Chef::Log.warn('By default this recipe uses search (unsupported by Chef Solo).' \
' Nodes may manually be configured as attributes.')
else
galera_cluster_nodes = node['mariadb']['galera']['cluster_nodes']
end
else
if node['mariadb']['galera']['cluster_search_query'].empty?
galera_cluster_nodes = search(
:node, \
"mariadb_galera_cluster_name:#{node['mariadb']['galera']['cluster_name']}"
)
else
galera_cluster_nodes = search 'node', node['mariadb']['galera']['cluster_search_query']
log 'Chef search results' do
message "Searching for \"#{node['mariadb']['galera']['cluster_search_query']}\" \
resulted in \"#{galera_cluster_nodes}\" ..."
end
end
# Sort Nodes by fqdn
galera_cluster_nodes.sort! { |x, y| x[:fqdn] <=> y[:fqdn] }
end
first = true
gcomm = 'gcomm://'
galera_cluster_nodes.each do |lnode|
next unless lnode.name != node.name
gcomm += ',' unless first
gcomm += lnode['fqdn']
first = false
end
galera_options = {}
galera_options['wsrep_cluster_address'] = gcomm
galera_options['wsrep_cluster_name'] = \
node['mariadb']['galera']['cluster_name']
galera_options['wsrep_sst_method'] = \
node['mariadb']['galera']['wsrep_sst_method']
if node['mariadb']['galera'].attribute?('wsrep_sst_auth')
galera_options['wsrep_sst_auth'] = \
node['mariadb']['galera']['wsrep_sst_auth']
end
galera_options['wsrep_provider'] = \
node['mariadb']['galera']['wsrep_provider']
galera_options['wsrep_slave_threads'] = node['cpu']['total'] * 4
node['mariadb']['galera']['options'].each do |key, value|
galera_options[key] = value
end
mariadb_configuration 'galera' do
section 'mysqld'
option galera_options
action :add
end
#
# Under debian system we have to change the debian-sys-maint default password.
# This password is the same for the overall cluster.
#
if platform?('debian', 'ubuntu')
template '/etc/mysql/debian.cnf' do
sensitive true
source 'debian.cnf.erb'
owner 'root'
group 'root'
mode '0600'
end
grants_command = 'mysql -r -B -N -u root '
if node['mariadb']['server_root_password'].is_a?(String)
grants_command += '--password=\'' + \
node['mariadb']['server_root_password'] + '\' '
end
grants_command += '-e "GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, ' \
'DROP, RELOAD, SHUTDOWN, PROCESS, FILE, REFERENCES, ' \
'INDEX, ALTER, SHOW DATABASES, SUPER, CREATE TEMPORARY ' \
'TABLES, LOCK TABLES, EXECUTE, REPLICATION SLAVE, ' \
'REPLICATION CLIENT, CREATE VIEW, SHOW VIEW, CREATE ' \
'ROUTINE, ALTER ROUTINE, CREATE USER, EVENT, TRIGGER ON ' \
' *.* TO \'' + node['mariadb']['debian']['user'] + \
'\'@\'' + node['mariadb']['debian']['host'] + '\' ' \
'IDENTIFIED BY \'' + \
node['mariadb']['debian']['password'] + '\' WITH GRANT ' \
'OPTION"'
execute 'correct-debian-grants' do
# Add sensitive true when foodcritic #233 fixed
command grants_command
action :run
only_if do
cmd = Mixlib::ShellOut.new("/usr/bin/mysql --user=\"" + \
node['mariadb']['debian']['user'] + \
"\" --password=\"" + node['mariadb']['debian']['password'] + \
"\" -r -B -N -e \"SELECT 1\"")
cmd.run_command
cmd.error?
end
ignore_failure true
end
end
#
# NOTE: You cannot use the following code to restart Mariadb when in Galera mode.
# When your SST is longer than a chef run...
# ==> chef-client try to restart the service each time it run <==
#
# restart the service if needed
# workaround idea from https://github.com/stissot
#
# Chef::Resource::Execute.send(:include, MariaDB::Helper)
# execute 'mariadb-service-restart-needed' do
# command 'true'
# only_if do
# mariadb_service_restart_required?(
# node['mariadb']['mysqld']['bind-address'],
# node['mariadb']['mysqld']['port'],
# node['mariadb']['mysqld']['socket']
# )
# end
# notifies :restart, 'service[mysql]', :immediately
# end