Knife-Zero doesn't include Berkshelf support, so vendoring everything in the repo is convenient again
		
			
				
	
	
		
			180 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			Ruby
		
	
	
	
	
	
			
		
		
	
	
			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
 |