2015-07-21 19:45:23 +02:00

142 lines
4.3 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'
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]
Chef::Log.warn('This recipe uses search. Chef Solo does not support search.')
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
execute 'correct-debian-grants' do
# Add sensitive true when foodcritic #233 fixed
command 'mysql -r -B -N -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\""
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