229 lines
7.5 KiB
Ruby
229 lines
7.5 KiB
Ruby
#
|
|
# Cookbook Name:: mysql
|
|
# Recipe:: default
|
|
#
|
|
# Copyright 2008-2011, Opscode, Inc.
|
|
#
|
|
# 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.
|
|
#
|
|
|
|
::Chef::Recipe.send(:include, Opscode::OpenSSL::Password)
|
|
|
|
include_recipe "mysql::client"
|
|
|
|
if Chef::Config[:solo]
|
|
missing_attrs = %w{
|
|
server_debian_password server_root_password server_repl_password
|
|
}.select do |attr|
|
|
node["mysql"][attr].nil?
|
|
end.map { |attr| "node['mysql']['#{attr}']" }
|
|
|
|
if !missing_attrs.empty?
|
|
Chef::Application.fatal!([
|
|
"You must set #{missing_attrs.join(', ')} in chef-solo mode.",
|
|
"For more information, see https://github.com/opscode-cookbooks/mysql#chef-solo-note"
|
|
].join(' '))
|
|
end
|
|
else
|
|
# generate all passwords
|
|
# node.override['mysql']['server_debian_password'] = mydata['credential']['mysql']['super']['password']
|
|
# node.override['mysql']['server_root_password'] = mydata['credential']['mysql']['super']['password']
|
|
# node.override['mysql']['server_repl_password'] = mydata['credential']['mysql']['super']['password']
|
|
# node.set_unless['mysql']['server_debian_password'] = secure_password
|
|
# node.set_unless['mysql']['server_root_password'] = item['credential']['service_credential']['password']
|
|
# node.set_unless['mysql']['server_repl_password'] = item['credential']['service_credential']['password']
|
|
# node.save
|
|
# puts "---------------else generate all passwords-----------------------------"
|
|
# puts "['mysql']['server_debian_password']= #{node.['mysql']['server_debian_password']}"
|
|
# puts "['mysql']['server_root_password']=#{node.['mysql']['server_root_password']}"
|
|
# puts "-----------------------------------------------------------------------"
|
|
end
|
|
|
|
if platform_family?(%w{debian})
|
|
|
|
directory "/var/cache/local/preseeding" do
|
|
owner "root"
|
|
group node['mysql']['root_group']
|
|
mode 0755
|
|
recursive true
|
|
end
|
|
|
|
execute "preseed mysql-server" do
|
|
command "debconf-set-selections /var/cache/local/preseeding/mysql-server.seed"
|
|
action :nothing
|
|
end
|
|
|
|
template "/var/cache/local/preseeding/mysql-server.seed" do
|
|
source "mysql-server.seed.erb"
|
|
owner "root"
|
|
group node['mysql']['root_group']
|
|
mode "0600"
|
|
notifies :run, "execute[preseed mysql-server]", :immediately
|
|
end
|
|
|
|
template "#{node['mysql']['conf_dir']}/debian.cnf" do
|
|
source "debian.cnf.erb"
|
|
owner "root"
|
|
group node['mysql']['root_group']
|
|
mode "0600"
|
|
end
|
|
|
|
end
|
|
|
|
if platform_family?('windows')
|
|
package_file = node['mysql']['package_file']
|
|
|
|
remote_file "#{Chef::Config[:file_cache_path]}/#{package_file}" do
|
|
source node['mysql']['url']
|
|
not_if { File.exists? "#{Chef::Config[:file_cache_path]}/#{package_file}" }
|
|
end
|
|
|
|
windows_package node['mysql']['server']['packages'].first do
|
|
source "#{Chef::Config[:file_cache_path]}/#{package_file}"
|
|
end
|
|
|
|
def package(*args, &blk)
|
|
windows_package(*args, &blk)
|
|
end
|
|
end
|
|
|
|
node['mysql']['server']['packages'].each do |package_name|
|
|
package package_name do
|
|
action :install
|
|
notifies :start, "service[mysql]", :immediately
|
|
end
|
|
end
|
|
|
|
unless platform_family?(%w{mac_os_x})
|
|
|
|
[File.dirname(node['mysql']['pid_file']),
|
|
File.dirname(node['mysql']['tunable']['slow_query_log']),
|
|
node['mysql']['conf_dir'],
|
|
node['mysql']['confd_dir'],
|
|
node['mysql']['log_dir'],
|
|
node['mysql']['data_dir']].each do |directory_path|
|
|
directory directory_path do
|
|
owner "mysql" unless platform? 'windows'
|
|
group "mysql" unless platform? 'windows'
|
|
action :create
|
|
recursive true
|
|
end
|
|
end
|
|
|
|
if platform_family? 'windows'
|
|
require 'win32/service'
|
|
|
|
windows_path node['mysql']['bin_dir'] do
|
|
action :add
|
|
end
|
|
|
|
windows_batch "install mysql service" do
|
|
command "\"#{node['mysql']['bin_dir']}\\mysqld.exe\" --install #{node['mysql']['service_name']}"
|
|
not_if { Win32::Service.exists?(node['mysql']['service_name']) }
|
|
end
|
|
end
|
|
|
|
skip_federated = case node['platform']
|
|
when 'fedora', 'ubuntu', 'amazon'
|
|
true
|
|
when 'centos', 'redhat', 'scientific'
|
|
node['platform_version'].to_f < 6.0
|
|
else
|
|
false
|
|
end
|
|
end
|
|
|
|
# Homebrew has its own way to do databases
|
|
if platform_family?(%w{mac_os_x})
|
|
execute "mysql-install-db" do
|
|
command "mysql_install_db --verbose --user=`whoami` --basedir=\"$(brew --prefix mysql)\" --datadir=#{node['mysql']['data_dir']} --tmpdir=/tmp"
|
|
environment('TMPDIR' => nil)
|
|
action :run
|
|
creates "#{node['mysql']['data_dir']}/mysql"
|
|
end
|
|
else
|
|
execute 'mysql-install-db' do
|
|
command "mysql_install_db"
|
|
action :run
|
|
not_if { File.exists?(node['mysql']['data_dir'] + '/mysql/user.frm') }
|
|
end
|
|
|
|
service "mysql" do
|
|
service_name node['mysql']['service_name']
|
|
if node['mysql']['use_upstart']
|
|
provider Chef::Provider::Service::Upstart
|
|
end
|
|
supports :status => true, :restart => true, :reload => true
|
|
action :enable
|
|
end
|
|
end
|
|
|
|
# set the root password for situations that don't support pre-seeding.
|
|
# (eg. platforms other than debian/ubuntu & drop-in mysql replacements)
|
|
execute "assign-root-password" do
|
|
command %Q["#{node['mysql']['mysqladmin_bin']}" -u root password '#{node['mysql']['server_root_password']}']
|
|
action :run
|
|
only_if %Q["#{node['mysql']['mysql_bin']}" -u root -e 'show databases;']
|
|
end
|
|
|
|
unless platform_family?(%w{mac_os_x})
|
|
grants_path = node['mysql']['grants_path']
|
|
|
|
begin
|
|
t = resources("template[#{grants_path}]")
|
|
rescue
|
|
Chef::Log.info("Could not find previously defined grants.sql resource")
|
|
t = template grants_path do
|
|
source "grants.sql.erb"
|
|
owner "root" unless platform_family? 'windows'
|
|
group node['mysql']['root_group'] unless platform_family? 'windows'
|
|
mode "0600"
|
|
action :create
|
|
end
|
|
end
|
|
|
|
if platform_family? 'windows'
|
|
windows_batch "mysql-install-privileges" do
|
|
command "\"#{node['mysql']['mysql_bin']}\" -u root #{node['mysql']['server_root_password'].empty? ? '' : '-p' }\"#{node['mysql']['server_root_password']}\" < \"#{grants_path}\""
|
|
action :nothing
|
|
subscribes :run, resources("template[#{grants_path}]"), :immediately
|
|
end
|
|
else
|
|
execute "mysql-install-privileges" do
|
|
command %Q["#{node['mysql']['mysql_bin']}" -u root #{node['mysql']['server_root_password'].empty? ? '' : '-p' }'#{node['mysql']['server_root_password']}' < "#{grants_path}"]
|
|
action :nothing
|
|
subscribes :run, resources("template[#{grants_path}]"), :immediately
|
|
end
|
|
end
|
|
|
|
template "#{node['mysql']['conf_dir']}/my.cnf" do
|
|
source "my.cnf.erb"
|
|
owner "root" unless platform? 'windows'
|
|
group node['mysql']['root_group'] unless platform? 'windows'
|
|
mode "0644"
|
|
case node['mysql']['reload_action']
|
|
when 'restart'
|
|
notifies :restart, "service[mysql]", :immediately
|
|
when 'reload'
|
|
notifies :reload, "service[mysql]", :immediately
|
|
else
|
|
Chef::Log.info "my.cnf updated but mysql.reload_action is #{node['mysql']['reload_action']}. No action taken."
|
|
end
|
|
variables :skip_federated => skip_federated
|
|
end
|
|
|
|
service "mysql" do
|
|
action :start
|
|
end
|
|
end
|