elzar 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- data/.chef/knife.rb +3 -0
- data/.gitignore +1 -0
- data/.rvmrc +1 -0
- data/Gemfile +11 -0
- data/Gemfile.lock +96 -0
- data/README.md +42 -0
- data/Rakefile +1 -0
- data/Vagrantfile +16 -0
- data/cookbooks/.gitkeep +0 -0
- data/cookbooks/apt/README.md +122 -0
- data/cookbooks/apt/files/default/apt-cacher +9 -0
- data/cookbooks/apt/files/default/apt-cacher.conf +144 -0
- data/cookbooks/apt/files/default/apt-proxy-v2.conf +50 -0
- data/cookbooks/apt/metadata.rb +13 -0
- data/cookbooks/apt/providers/repository.rb +73 -0
- data/cookbooks/apt/recipes/cacher-client.rb +44 -0
- data/cookbooks/apt/recipes/cacher.rb +45 -0
- data/cookbooks/apt/recipes/default.rb +50 -0
- data/cookbooks/apt/resources/repository.rb +30 -0
- data/cookbooks/build-essential/README.md +24 -0
- data/cookbooks/build-essential/metadata.rb +10 -0
- data/cookbooks/build-essential/recipes/default.rb +45 -0
- data/cookbooks/database/README.md +403 -0
- data/cookbooks/database/libraries/provider_database_mysql.rb +97 -0
- data/cookbooks/database/libraries/provider_database_mysql_user.rb +76 -0
- data/cookbooks/database/libraries/provider_database_postgresql.rb +126 -0
- data/cookbooks/database/libraries/provider_database_postgresql_user.rb +78 -0
- data/cookbooks/database/libraries/provider_database_sql_server.rb +109 -0
- data/cookbooks/database/libraries/provider_database_sql_server_user.rb +106 -0
- data/cookbooks/database/libraries/resource_database.rb +111 -0
- data/cookbooks/database/libraries/resource_database_user.rb +90 -0
- data/cookbooks/database/libraries/resource_mysql_database.rb +34 -0
- data/cookbooks/database/libraries/resource_mysql_database_user.rb +34 -0
- data/cookbooks/database/libraries/resource_postgresql_database.rb +35 -0
- data/cookbooks/database/libraries/resource_postgresql_database_user.rb +35 -0
- data/cookbooks/database/libraries/resource_sql_server_database.rb +34 -0
- data/cookbooks/database/libraries/resource_sql_server_database_user.rb +34 -0
- data/cookbooks/database/metadata.rb +21 -0
- data/cookbooks/database/recipes/default.rb +20 -0
- data/cookbooks/database/recipes/ebs_backup.rb +89 -0
- data/cookbooks/database/recipes/ebs_volume.rb +196 -0
- data/cookbooks/database/recipes/master.rb +78 -0
- data/cookbooks/database/recipes/snapshot.rb +62 -0
- data/cookbooks/database/templates/default/app_grants.sql.erb +8 -0
- data/cookbooks/database/templates/default/aws_config.erb +3 -0
- data/cookbooks/database/templates/default/chef-solo-database-snapshot.cron.erb +10 -0
- data/cookbooks/database/templates/default/chef-solo-database-snapshot.json.erb +1 -0
- data/cookbooks/database/templates/default/chef-solo-database-snapshot.rb.erb +6 -0
- data/cookbooks/database/templates/default/ebs-backup-cron.erb +2 -0
- data/cookbooks/database/templates/default/ebs-db-backup.sh.erb +8 -0
- data/cookbooks/database/templates/default/ebs-db-restore.sh.erb +10 -0
- data/cookbooks/database/templates/default/s3cfg.erb +27 -0
- data/cookbooks/mysql/README.md +148 -0
- data/cookbooks/mysql/attributes/server.rb +68 -0
- data/cookbooks/mysql/libraries/database.rb +19 -0
- data/cookbooks/mysql/libraries/helpers.rb +33 -0
- data/cookbooks/mysql/metadata.rb +90 -0
- data/cookbooks/mysql/recipes/client.rb +51 -0
- data/cookbooks/mysql/recipes/default.rb +20 -0
- data/cookbooks/mysql/recipes/server.rb +133 -0
- data/cookbooks/mysql/recipes/server_ec2.rb +49 -0
- data/cookbooks/mysql/templates/default/debian.cnf.erb +12 -0
- data/cookbooks/mysql/templates/default/grants.sql.erb +15 -0
- data/cookbooks/mysql/templates/default/my.cnf.erb +176 -0
- data/cookbooks/mysql/templates/default/mysql-server.seed.erb +10 -0
- data/cookbooks/mysql/templates/default/port_mysql.erb +3 -0
- data/cookbooks/openssl/README.md +37 -0
- data/cookbooks/openssl/libraries/secure_password.rb +37 -0
- data/cookbooks/openssl/metadata.rb +8 -0
- data/cookbooks/openssl/recipes/default.rb +19 -0
- data/cookbooks/passenger_enterprise/README.rdoc +8 -0
- data/cookbooks/passenger_enterprise/attributes/default.rb +28 -0
- data/cookbooks/passenger_enterprise/cc.gemspec +36 -0
- data/cookbooks/passenger_enterprise/metadata.json +44 -0
- data/cookbooks/passenger_enterprise/metadata.rb +16 -0
- data/cookbooks/passenger_enterprise/recipes/apache2.rb +54 -0
- data/cookbooks/passenger_enterprise/recipes/default.rb +30 -0
- data/cookbooks/passenger_enterprise/recipes/nginx.rb +50 -0
- data/cookbooks/passenger_enterprise/templates/default/passenger.conf.erb +2 -0
- data/cookbooks/passenger_enterprise/templates/default/passenger.load.erb +1 -0
- data/cookbooks/passenger_enterprise/templates/default/passenger_nginx.conf.erb +2 -0
- data/cookbooks/ruby_enterprise/README.rdoc +55 -0
- data/cookbooks/ruby_enterprise/attributes/default.rb +33 -0
- data/cookbooks/ruby_enterprise/cc.gemspec +36 -0
- data/cookbooks/ruby_enterprise/definitions/ree_gem.rb +28 -0
- data/cookbooks/ruby_enterprise/metadata.json +45 -0
- data/cookbooks/ruby_enterprise/metadata.rb +13 -0
- data/cookbooks/ruby_enterprise/recipes/default.rb +67 -0
- data/data_bags/deploy/authorized_keys.json +9 -0
- data/dna.json +25 -0
- data/elzar.gemspec +22 -0
- data/lib/elzar.rb +21 -0
- data/lib/elzar/assistant.rb +77 -0
- data/lib/elzar/chef_dna.rb +48 -0
- data/lib/elzar/template.rb +24 -0
- data/lib/elzar/templates/Gemfile +11 -0
- data/lib/elzar/templates/Vagrantfile.erb +16 -0
- data/lib/elzar/templates/dna.json +25 -0
- data/lib/elzar/templates/solo.rb.erb +6 -0
- data/lib/elzar/version.rb +3 -0
- data/roles/enterprise_appstack.rb +4 -0
- data/roles/plumbing.rb +11 -0
- data/roles/postgres_database.rb +4 -0
- data/roles/ruby_appstack.rb +4 -0
- data/script/install_cookbook +6 -0
- data/script/new_cookbook +5 -0
- data/site-cookbooks/.gitkeep +0 -0
- data/site-cookbooks/curl/README.md +17 -0
- data/site-cookbooks/curl/metadata.rb +6 -0
- data/site-cookbooks/curl/recipes/default.rb +11 -0
- data/site-cookbooks/nginx/CHANGELOG.md +11 -0
- data/site-cookbooks/nginx/CONTRIBUTING +29 -0
- data/site-cookbooks/nginx/LICENSE +201 -0
- data/site-cookbooks/nginx/README.md +76 -0
- data/site-cookbooks/nginx/attributes/default.rb +65 -0
- data/site-cookbooks/nginx/definitions/nginx_site.rb +35 -0
- data/site-cookbooks/nginx/files/default/mime.types +73 -0
- data/site-cookbooks/nginx/metadata.rb +89 -0
- data/site-cookbooks/nginx/recipes/default.rb +57 -0
- data/site-cookbooks/nginx/recipes/source.rb +126 -0
- data/site-cookbooks/nginx/templates/default/default-site.erb +11 -0
- data/site-cookbooks/nginx/templates/default/nginx.conf.erb +42 -0
- data/site-cookbooks/nginx/templates/default/nginx.init.erb +91 -0
- data/site-cookbooks/nginx/templates/default/nxdissite.erb +29 -0
- data/site-cookbooks/nginx/templates/default/nxensite.erb +38 -0
- data/site-cookbooks/passenger/README.md +12 -0
- data/site-cookbooks/passenger/attributes/default.rb +3 -0
- data/site-cookbooks/passenger/metadata.rb +6 -0
- data/site-cookbooks/passenger/recipes/default.rb +39 -0
- data/site-cookbooks/passenger/templates/default/passenger_nginx.conf.erb +2 -0
- data/site-cookbooks/postgresql/README.md +150 -0
- data/site-cookbooks/postgresql/attributes/default.rb +72 -0
- data/site-cookbooks/postgresql/metadata.rb +21 -0
- data/site-cookbooks/postgresql/recipes/client.rb +40 -0
- data/site-cookbooks/postgresql/recipes/default.rb +20 -0
- data/site-cookbooks/postgresql/recipes/server.rb +74 -0
- data/site-cookbooks/postgresql/recipes/server_debian.rb +62 -0
- data/site-cookbooks/postgresql/recipes/server_redhat.rb +82 -0
- data/site-cookbooks/postgresql/templates/default/debian.postgresql.conf.erb +499 -0
- data/site-cookbooks/postgresql/templates/default/pg_hba.conf.erb +83 -0
- data/site-cookbooks/postgresql/templates/default/redhat.postgresql.conf.erb +501 -0
- data/site-cookbooks/rails_app/README.md +15 -0
- data/site-cookbooks/rails_app/attributes/default.rb +2 -0
- data/site-cookbooks/rails_app/files/default/sudoers +26 -0
- data/site-cookbooks/rails_app/metadata.rb +6 -0
- data/site-cookbooks/rails_app/recipes/default.rb +143 -0
- data/site-cookbooks/rails_app/recipes/system_libraries.rb +12 -0
- data/site-cookbooks/rails_app/templates/default/pg_hba.conf.erb +84 -0
- data/site-cookbooks/rails_app/templates/default/rails_app_nginx.erb +10 -0
- data/site-cookbooks/ruby/README.md +12 -0
- data/site-cookbooks/ruby/attributes/default.rb +6 -0
- data/site-cookbooks/ruby/metadata.rb +6 -0
- data/site-cookbooks/ruby/recipes/default.rb +54 -0
- data/solo.rb +7 -0
- data/upgrade-chef.sh +8 -0
- metadata +272 -0
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2011 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require File.join(File.dirname(__FILE__), 'resource_database')
|
|
20
|
+
require File.join(File.dirname(__FILE__), 'provider_database_sql_server')
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Resource
|
|
24
|
+
class SqlServerDatabase < Chef::Resource::Database
|
|
25
|
+
|
|
26
|
+
def initialize(name, run_context=nil)
|
|
27
|
+
super
|
|
28
|
+
@resource_name = :sql_server_database
|
|
29
|
+
@provider = Chef::Provider::Database::SqlServer
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Seth Chisamore (<schisamo@opscode.com>)
|
|
3
|
+
# Copyright:: Copyright (c) 2011 Opscode, Inc.
|
|
4
|
+
# License:: Apache License, Version 2.0
|
|
5
|
+
#
|
|
6
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
7
|
+
# you may not use this file except in compliance with the License.
|
|
8
|
+
# You may obtain a copy of the License at
|
|
9
|
+
#
|
|
10
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
11
|
+
#
|
|
12
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
13
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
14
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
15
|
+
# See the License for the specific language governing permissions and
|
|
16
|
+
# limitations under the License.
|
|
17
|
+
#
|
|
18
|
+
|
|
19
|
+
require File.join(File.dirname(__FILE__), 'resource_database_user')
|
|
20
|
+
require File.join(File.dirname(__FILE__), 'provider_database_sql_server_user')
|
|
21
|
+
|
|
22
|
+
class Chef
|
|
23
|
+
class Resource
|
|
24
|
+
class SqlServerDatabaseUser < Chef::Resource::DatabaseUser
|
|
25
|
+
|
|
26
|
+
def initialize(name, run_context=nil)
|
|
27
|
+
super
|
|
28
|
+
@resource_name = :sql_server_database_user
|
|
29
|
+
@provider = Chef::Provider::Database::SqlServerUser
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
end
|
|
33
|
+
end
|
|
34
|
+
end
|
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
maintainer "Opscode, Inc."
|
|
2
|
+
maintainer_email "cookbooks@opscode.com"
|
|
3
|
+
license "Apache 2.0"
|
|
4
|
+
description "Sets up the database master or slave"
|
|
5
|
+
long_description IO.read(File.join(File.dirname(__FILE__), 'README.md'))
|
|
6
|
+
version "1.1.0"
|
|
7
|
+
|
|
8
|
+
recipe "database", "Empty placeholder"
|
|
9
|
+
recipe "database::ebs_backup", "Considered deprecated, older way of backing up EBS volumes"
|
|
10
|
+
recipe "database::ebs_volume", "Sets up an EBS volume in EC2 for the database"
|
|
11
|
+
recipe "database::master", "Creates application specific user and database"
|
|
12
|
+
recipe "database::snapshot", "Locks tables and freezes XFS filesystem for replication, assumes EC2 + EBS"
|
|
13
|
+
|
|
14
|
+
depends "mysql", ">= 1.2.0"
|
|
15
|
+
depends "postgresql"
|
|
16
|
+
depends "aws"
|
|
17
|
+
depends "xfs"
|
|
18
|
+
|
|
19
|
+
%w{ debian ubuntu centos suse fedora redhat scientific }.each do |os|
|
|
20
|
+
supports os
|
|
21
|
+
end
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Joshua Timberman (<joshua@opscode.com>)
|
|
3
|
+
# Cookbook Name:: database
|
|
4
|
+
# Recipe:: default
|
|
5
|
+
#
|
|
6
|
+
# Copyright 2009, Opscode, Inc.
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
#
|
|
20
|
+
|
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Joshua Timberman (<joshua@opscode.com>)
|
|
3
|
+
# Cookbook Name:: database
|
|
4
|
+
# Recipe:: ebs_backup
|
|
5
|
+
#
|
|
6
|
+
# Copyright 2009, Opscode, Inc.
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
#
|
|
20
|
+
|
|
21
|
+
begin
|
|
22
|
+
aws = Chef::DataBagItem.load('aws', 'main')
|
|
23
|
+
Chef::Log.info("Loaded AWS information from DataBagItem aws[#{aws['id']}]")
|
|
24
|
+
rescue
|
|
25
|
+
Chef::Log.fatal("Could not find the 'main' item in the 'aws' data bag")
|
|
26
|
+
raise
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
db_role = String.new
|
|
30
|
+
db_master_role = String.new
|
|
31
|
+
db_type = node[:database][:type]
|
|
32
|
+
|
|
33
|
+
search(:apps) do |app|
|
|
34
|
+
db_role = app["database_#{db_type}_role"] & node.run_list.roles
|
|
35
|
+
db_master_role = app["database_master_role"]
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
ebs_info = Chef::DataBagItem.load(:aws, "ebs_#{db_master_role}_#{node.chef_environment}")
|
|
39
|
+
|
|
40
|
+
gem_package "dbi"
|
|
41
|
+
gem_package "dbd-mysql"
|
|
42
|
+
|
|
43
|
+
directory "/mnt/aws-config" do
|
|
44
|
+
mode 0700
|
|
45
|
+
owner "root"
|
|
46
|
+
group "root"
|
|
47
|
+
end
|
|
48
|
+
|
|
49
|
+
template "/mnt/aws-config/config" do
|
|
50
|
+
source "aws_config.erb"
|
|
51
|
+
variables(
|
|
52
|
+
:access_key => aws['aws_access_key_id'],
|
|
53
|
+
:secret_key => aws['aws_secret_access_key']
|
|
54
|
+
)
|
|
55
|
+
owner "root"
|
|
56
|
+
group "root"
|
|
57
|
+
mode 0600
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
git "/opt/ec2_mysql" do
|
|
61
|
+
repository "git://github.com/jtimberman/ec2_mysql.git"
|
|
62
|
+
reference "HEAD"
|
|
63
|
+
action :sync
|
|
64
|
+
not_if { ::FileTest.directory?("/opt/ec2_mysql/.git") }
|
|
65
|
+
end
|
|
66
|
+
|
|
67
|
+
%w{backup restore}.each do |file|
|
|
68
|
+
template "/usr/local/bin/db-#{file}.sh" do
|
|
69
|
+
source "ebs-db-#{file}.sh.erb"
|
|
70
|
+
owner "root"
|
|
71
|
+
group "root"
|
|
72
|
+
mode 0700
|
|
73
|
+
variables(
|
|
74
|
+
:mysql_root_passwd => node['mysql']['server_root_password'],
|
|
75
|
+
:mysql_device => node['mysql']['ebs_vol_dev'],
|
|
76
|
+
:ebs_vol_id => ebs_info['volume_id']
|
|
77
|
+
)
|
|
78
|
+
end
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
if db_type == "master" && node.chef_environment == "production"
|
|
82
|
+
template "/etc/cron.d/db-backup" do
|
|
83
|
+
source "ebs-backup-cron.erb"
|
|
84
|
+
owner "root"
|
|
85
|
+
group "root"
|
|
86
|
+
mode 0644
|
|
87
|
+
backup false
|
|
88
|
+
end
|
|
89
|
+
end
|
|
@@ -0,0 +1,196 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Joshua Timberman (<joshua@opscode.com>)
|
|
3
|
+
# Author:: AJ Christensen (<aj@opscode.com>)
|
|
4
|
+
# Cookbook Name:: database
|
|
5
|
+
# Recipe:: ebs_volume
|
|
6
|
+
#
|
|
7
|
+
# Copyright 2009-2010, Opscode, Inc.
|
|
8
|
+
#
|
|
9
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
10
|
+
# you may not use this file except in compliance with the License.
|
|
11
|
+
# You may obtain a copy of the License at
|
|
12
|
+
#
|
|
13
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
14
|
+
#
|
|
15
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
16
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
17
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
18
|
+
# See the License for the specific language governing permissions and
|
|
19
|
+
# limitations under the License.
|
|
20
|
+
#
|
|
21
|
+
|
|
22
|
+
if node[:ec2]
|
|
23
|
+
include_recipe "aws"
|
|
24
|
+
include_recipe "xfs"
|
|
25
|
+
|
|
26
|
+
begin
|
|
27
|
+
aws = Chef::DataBagItem.load(:aws, :main)
|
|
28
|
+
Chef::Log.info("Loaded AWS information from DataBagItem aws[#{aws['id']}]")
|
|
29
|
+
rescue
|
|
30
|
+
Chef::Log.fatal("Could not find the 'main' item in the 'aws' data bag")
|
|
31
|
+
raise
|
|
32
|
+
end
|
|
33
|
+
|
|
34
|
+
ebs_vol_dev = node['mysql']['ebs_vol_dev']
|
|
35
|
+
ebs_vol_id = String.new
|
|
36
|
+
db_type = String.new
|
|
37
|
+
db_role = String.new
|
|
38
|
+
master_role = String.new
|
|
39
|
+
slave_role = String.new
|
|
40
|
+
root_pw = String.new
|
|
41
|
+
snapshots_to_keep = String.new
|
|
42
|
+
|
|
43
|
+
search(:apps) do |app|
|
|
44
|
+
if (app["database_master_role"] & node.run_list.roles).length == 1 || (app["database_slave_role"] & node.run_list.roles).length == 1
|
|
45
|
+
master_role = app["database_master_role"]
|
|
46
|
+
slave_role = app["database_slave_role"]
|
|
47
|
+
root_pw = app["mysql_root_password"][node.chef_environment]
|
|
48
|
+
snapshots_to_keep = app["snapshots_to_keep"][node.chef_environment]
|
|
49
|
+
|
|
50
|
+
if (master_role & node.run_list.roles).length == 1
|
|
51
|
+
db_type = "master"
|
|
52
|
+
db_role = master_role
|
|
53
|
+
elsif (slave_role & node.run_list.roles).length == 1
|
|
54
|
+
db_type = "slave"
|
|
55
|
+
db_role = slave_role
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
Chef::Log.info "database::ebs_volume - db_role: #{db_role} db_type: #{db_type}"
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
begin
|
|
63
|
+
ebs_info = Chef::DataBagItem.load(:aws, "ebs_#{db_role}_#{node.chef_environment}")
|
|
64
|
+
Chef::Log.info("Loaded #{ebs_info['volume_id']} from DataBagItem aws[#{ebs_info['id']}]")
|
|
65
|
+
rescue
|
|
66
|
+
Chef::Log.warn("Could not find the 'ebs_#{db_role}_#{node.chef_environment}' item in the 'aws' data bag")
|
|
67
|
+
ebs_info = Hash.new
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
begin
|
|
71
|
+
master_info = Chef::DataBagItem.load(:aws, "ebs_#{master_role}_#{node.chef_environment}")
|
|
72
|
+
Chef::Log.info "Loaded #{master_info['volume_id']} from DataBagItem aws[#{master_info['id']}]"
|
|
73
|
+
rescue
|
|
74
|
+
Chef::Application.fatal! "Could not load replication masters snapshot details", -41 if db_type == "slave"
|
|
75
|
+
end
|
|
76
|
+
|
|
77
|
+
ruby_block "store_#{db_role}_#{node.chef_environment}_volid" do
|
|
78
|
+
block do
|
|
79
|
+
ebs_vol_id = node[:aws][:ebs_volume]["#{db_role}_#{node.chef_environment}"][:volume_id]
|
|
80
|
+
|
|
81
|
+
unless ebs_info['volume_id']
|
|
82
|
+
item = {
|
|
83
|
+
"id" => "ebs_#{db_role}_#{node.chef_environment}",
|
|
84
|
+
"volume_id" => ebs_vol_id
|
|
85
|
+
}
|
|
86
|
+
Chef::Log.info "Storing volume_id #{item.inspect}"
|
|
87
|
+
databag_item = Chef::DataBagItem.new
|
|
88
|
+
databag_item.data_bag("aws")
|
|
89
|
+
databag_item.raw_data = item
|
|
90
|
+
databag_item.save
|
|
91
|
+
Chef::Log.info("Created #{item['id']} in #{databag_item.data_bag}")
|
|
92
|
+
end
|
|
93
|
+
end
|
|
94
|
+
action :nothing
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
aws_ebs_volume "#{db_role}_#{node.chef_environment}" do
|
|
98
|
+
aws_access_key aws['aws_access_key_id']
|
|
99
|
+
aws_secret_access_key aws['aws_secret_access_key']
|
|
100
|
+
size 50
|
|
101
|
+
device ebs_vol_dev
|
|
102
|
+
snapshots_to_keep snapshots_to_keep
|
|
103
|
+
case db_type
|
|
104
|
+
when "master"
|
|
105
|
+
if ebs_info['volume_id'] && ebs_info['volume_id'] =~ /vol/
|
|
106
|
+
volume_id ebs_info['volume_id']
|
|
107
|
+
action :attach
|
|
108
|
+
elsif ebs_info['volume_id'] && ebs_info['volume_id'] =~ /snap/
|
|
109
|
+
snapshot_id ebs_info['volume_id']
|
|
110
|
+
action [ :create, :attach ]
|
|
111
|
+
else
|
|
112
|
+
action [ :create, :attach ]
|
|
113
|
+
end
|
|
114
|
+
notifies :create, resources(:ruby_block => "store_#{db_role}_#{node.chef_environment}_volid")
|
|
115
|
+
when "slave"
|
|
116
|
+
if master_info['volume_id']
|
|
117
|
+
snapshot_id master_info['volume_id']
|
|
118
|
+
action [:create, :attach]
|
|
119
|
+
else
|
|
120
|
+
Chef::Log.warn("Couldn't detect snapshot ID.")
|
|
121
|
+
action :nothing
|
|
122
|
+
end
|
|
123
|
+
end
|
|
124
|
+
provider "aws_ebs_volume"
|
|
125
|
+
end
|
|
126
|
+
|
|
127
|
+
if db_type == "master"
|
|
128
|
+
Chef::Log.info "Setting up templates for chef-solo snapshots"
|
|
129
|
+
template "/etc/chef/chef-solo-database-snapshot.rb" do
|
|
130
|
+
source "chef-solo-database-snapshot.rb.erb"
|
|
131
|
+
variables :cookbook_path => Chef::Config[:cookbook_path]
|
|
132
|
+
owner "root"
|
|
133
|
+
group "root"
|
|
134
|
+
mode 0600
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
template "/etc/chef/chef-solo-database-snapshot.json" do
|
|
138
|
+
source "chef-solo-database-snapshot.json.erb"
|
|
139
|
+
variables(
|
|
140
|
+
:output => {
|
|
141
|
+
'db_snapshot' => {
|
|
142
|
+
'ebs_vol_dev' => node.mysql.ec2_path,
|
|
143
|
+
'db_role' => db_role,
|
|
144
|
+
'app_environment' => node.chef_environment,
|
|
145
|
+
'username' => 'root',
|
|
146
|
+
'password' => root_pw,
|
|
147
|
+
'aws_access_key_id' => aws['aws_access_key_id'],
|
|
148
|
+
'aws_secret_access_key' => aws['aws_secret_access_key'],
|
|
149
|
+
'snapshots_to_keep' => snapshots_to_keep,
|
|
150
|
+
'volume_id' => ebs_info['volume_id']
|
|
151
|
+
},
|
|
152
|
+
'run_list' => [
|
|
153
|
+
"recipe[database::snapshot]"
|
|
154
|
+
]
|
|
155
|
+
}
|
|
156
|
+
)
|
|
157
|
+
owner "root"
|
|
158
|
+
group "root"
|
|
159
|
+
mode 0600
|
|
160
|
+
end
|
|
161
|
+
|
|
162
|
+
template "/etc/cron.d/chef-solo-database-snapshot" do
|
|
163
|
+
source "chef-solo-database-snapshot.cron.erb"
|
|
164
|
+
variables(
|
|
165
|
+
:json_attribs => "/etc/chef/chef-solo-database-snapshot.json",
|
|
166
|
+
:config_file => "/etc/chef/chef-solo-database-snapshot.rb"
|
|
167
|
+
)
|
|
168
|
+
owner "root"
|
|
169
|
+
group "root"
|
|
170
|
+
mode 0600
|
|
171
|
+
end
|
|
172
|
+
end
|
|
173
|
+
|
|
174
|
+
execute "mkfs.xfs #{ebs_vol_dev}" do
|
|
175
|
+
only_if "xfs_admin -l #{ebs_vol_dev} 2>&1 | grep -qx 'xfs_admin: #{ebs_vol_dev} is not a valid XFS filesystem (unexpected SB magic number 0x00000000)'"
|
|
176
|
+
end
|
|
177
|
+
|
|
178
|
+
%w{ec2_path data_dir}.each do |dir|
|
|
179
|
+
directory node['mysql'][dir] do
|
|
180
|
+
mode 0755
|
|
181
|
+
end
|
|
182
|
+
end
|
|
183
|
+
|
|
184
|
+
mount node['mysql']['ec2_path'] do
|
|
185
|
+
device ebs_vol_dev
|
|
186
|
+
fstype "xfs"
|
|
187
|
+
action :mount
|
|
188
|
+
end
|
|
189
|
+
|
|
190
|
+
mount node['mysql']['data_dir'] do
|
|
191
|
+
device node['mysql']['ec2_path']
|
|
192
|
+
fstype "none"
|
|
193
|
+
options "bind,rw"
|
|
194
|
+
action :mount
|
|
195
|
+
end
|
|
196
|
+
end
|
|
@@ -0,0 +1,78 @@
|
|
|
1
|
+
#
|
|
2
|
+
# Author:: Joshua Timberman (<joshua@opscode.com>)
|
|
3
|
+
# Cookbook Name:: database
|
|
4
|
+
# Recipe:: master
|
|
5
|
+
#
|
|
6
|
+
# Copyright 2009-2010, Opscode, Inc.
|
|
7
|
+
#
|
|
8
|
+
# Licensed under the Apache License, Version 2.0 (the "License");
|
|
9
|
+
# you may not use this file except in compliance with the License.
|
|
10
|
+
# You may obtain a copy of the License at
|
|
11
|
+
#
|
|
12
|
+
# http://www.apache.org/licenses/LICENSE-2.0
|
|
13
|
+
#
|
|
14
|
+
# Unless required by applicable law or agreed to in writing, software
|
|
15
|
+
# distributed under the License is distributed on an "AS IS" BASIS,
|
|
16
|
+
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
17
|
+
# See the License for the specific language governing permissions and
|
|
18
|
+
# limitations under the License.
|
|
19
|
+
#
|
|
20
|
+
# This is potentially destructive to the nodes mysql password attributes, since
|
|
21
|
+
# we iterate over all the app databags. If this database server provides
|
|
22
|
+
# databases for multiple applications, the last app found in the databags
|
|
23
|
+
# will win out, so make sure the databags have the same passwords set for
|
|
24
|
+
# the root, repl, and debian-sys-maint users.
|
|
25
|
+
#
|
|
26
|
+
|
|
27
|
+
db_info = Hash.new
|
|
28
|
+
root_pw = String.new
|
|
29
|
+
|
|
30
|
+
search(:apps) do |app|
|
|
31
|
+
(app['database_master_role'] & node.run_list.roles).each do |dbm_role|
|
|
32
|
+
%w{ root repl debian }.each do |user|
|
|
33
|
+
user_pw = app["mysql_#{user}_password"]
|
|
34
|
+
if !user_pw.nil? and user_pw[node.chef_environment]
|
|
35
|
+
Chef::Log.debug("Saving password for #{user} as node attribute node['mysql']['server_#{user}_password'")
|
|
36
|
+
node.set['mysql']["server_#{user}_password"] = user_pw[node.chef_environment]
|
|
37
|
+
node.save
|
|
38
|
+
else
|
|
39
|
+
log "A password for MySQL user #{user} was not found in DataBag 'apps' item '#{app["id"]}' for environment ' for #{node.chef_environment}'." do
|
|
40
|
+
level :warn
|
|
41
|
+
end
|
|
42
|
+
log "A random password will be generated by the mysql cookbook and added as 'node.mysql.server_#{user}_password'. Edit the DataBag item to ensure it is set correctly on new nodes" do
|
|
43
|
+
level :warn
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
app['databases'].each do |env,db|
|
|
48
|
+
db_info[env] = db
|
|
49
|
+
end
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
include_recipe "mysql::server"
|
|
54
|
+
|
|
55
|
+
connection_info = {:host => "localhost", :username => 'root', :password => node['mysql']['server_root_password']}
|
|
56
|
+
|
|
57
|
+
search(:apps) do |app|
|
|
58
|
+
(app['database_master_role'] & node.run_list.roles).each do |dbm_role|
|
|
59
|
+
app['databases'].each do |env,db|
|
|
60
|
+
if env =~ /#{node.chef_environment}/
|
|
61
|
+
mysql_database "create #{db['database']}" do
|
|
62
|
+
database_name db['database']
|
|
63
|
+
connection connection_info
|
|
64
|
+
action :create
|
|
65
|
+
end
|
|
66
|
+
%W{ % #{node['fqdn']} localhost }.each do |h|
|
|
67
|
+
mysql_database_user db['username'] do
|
|
68
|
+
connection connection_info
|
|
69
|
+
password db['password']
|
|
70
|
+
database_name db['database']
|
|
71
|
+
host h
|
|
72
|
+
action :grant
|
|
73
|
+
end
|
|
74
|
+
end
|
|
75
|
+
end
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|