from-scratch 0.1.1 → 0.2.0
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.
- checksums.yaml +4 -4
- data/Berksfile +1 -1
- data/Berksfile.lock +7 -4
- data/cookbooks/openssl/CHANGELOG.md +43 -2
- data/cookbooks/openssl/README.md +149 -55
- data/cookbooks/openssl/libraries/helpers.rb +60 -0
- data/cookbooks/openssl/libraries/matchers.rb +13 -0
- data/cookbooks/openssl/libraries/random_password.rb +82 -0
- data/cookbooks/openssl/libraries/secure_password.rb +3 -2
- data/cookbooks/openssl/metadata.json +1 -31
- data/cookbooks/openssl/providers/dhparam.rb +33 -0
- data/cookbooks/openssl/providers/rsa_key.rb +39 -0
- data/cookbooks/openssl/providers/x509.rb +44 -34
- data/cookbooks/openssl/recipes/upgrade.rb +13 -11
- data/cookbooks/openssl/resources/dhparam.rb +10 -0
- data/cookbooks/openssl/resources/rsa_key.rb +10 -0
- data/cookbooks/openssl/resources/x509.rb +11 -11
- data/cookbooks/postgresql/.gitignore +18 -0
- data/cookbooks/postgresql/.kitchen.yml +175 -0
- data/cookbooks/postgresql/.rspec +3 -0
- data/cookbooks/postgresql/CHANGELOG.md +1 -1
- data/cookbooks/postgresql/CONTRIBUTING.md +6 -0
- data/cookbooks/postgresql/Cheffile +6 -0
- data/cookbooks/postgresql/Gemfile +12 -0
- data/cookbooks/postgresql/LICENSE +201 -0
- data/cookbooks/postgresql/Rakefile +22 -0
- data/cookbooks/postgresql/TESTING.md +22 -0
- data/cookbooks/postgresql/attributes/default.rb +72 -1
- data/cookbooks/postgresql/metadata.json +7 -12
- data/cookbooks/postgresql/providers/database.rb +73 -0
- data/cookbooks/postgresql/providers/user.rb +82 -0
- data/cookbooks/postgresql/recipes/setup_databases.rb +36 -0
- data/cookbooks/postgresql/recipes/setup_users.rb +17 -0
- data/cookbooks/postgresql/resources/database.rb +20 -0
- data/cookbooks/postgresql/resources/user.rb +20 -0
- data/cookbooks/postgresql/test/unit/debian_server_spec.rb +72 -0
- data/cookbooks/postgresql/test/unit/default_spec.rb +37 -0
- data/cookbooks/postgresql/test/unit/server_spec.rb +41 -0
- data/cookbooks/postgresql/test/unit/spec_helper.rb +20 -0
- data/cookbooks/scratchify/Berksfile +1 -1
- data/cookbooks/scratchify/Berksfile.lock +5 -4
- data/cookbooks/scratchify/lib/from-scratch.rb +1 -0
- data/cookbooks/scratchify/lib/from-scratch/version.rb +1 -1
- data/cookbooks/scratchify/templates/node.json.erb +17 -0
- data/from-scratch.gemspec +2 -2
- data/lib/from-scratch.rb +7 -3
- data/lib/from-scratch/version.rb +1 -1
- data/templates/node.json.erb +33 -0
- metadata +33 -7
@@ -0,0 +1,82 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: postgresql
|
3
|
+
# Provider:: user
|
4
|
+
#
|
5
|
+
|
6
|
+
# Support whyrun
|
7
|
+
def whyrun_supported?
|
8
|
+
true
|
9
|
+
end
|
10
|
+
|
11
|
+
action :create do
|
12
|
+
unless @current_resource.exists
|
13
|
+
converge_by "Create PostgreSQL User #{new_resource.name}" do
|
14
|
+
execute "create postgresql user #{new_resource.name}" do # ~FC009
|
15
|
+
user "postgres"
|
16
|
+
command %(psql -c "CREATE ROLE #{role_sql}")
|
17
|
+
sensitive true
|
18
|
+
end
|
19
|
+
|
20
|
+
new_resource.updated_by_last_action(true)
|
21
|
+
end
|
22
|
+
end
|
23
|
+
end
|
24
|
+
|
25
|
+
action :update do
|
26
|
+
if @current_resource.exists
|
27
|
+
converge_by "Update PostgreSQL User #{new_resource.name}" do
|
28
|
+
execute "update postgresql user #{new_resource.name}" do
|
29
|
+
user "postgres"
|
30
|
+
command %(psql -c "ALTER ROLE #{role_sql}")
|
31
|
+
sensitive true
|
32
|
+
end
|
33
|
+
|
34
|
+
new_resource.updated_by_last_action(true)
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
action :drop do
|
40
|
+
if @current_resource.exists
|
41
|
+
converge_by "Drop PostgreSQL User #{new_resource.name}" do
|
42
|
+
execute "drop postgresql user #{new_resource.name}" do
|
43
|
+
user "postgres"
|
44
|
+
command %(psql -c 'DROP ROLE IF EXISTS \\\"#{new_resource.name}\\\"')
|
45
|
+
sensitive true
|
46
|
+
end
|
47
|
+
|
48
|
+
new_resource.updated_by_last_action(true)
|
49
|
+
end
|
50
|
+
end
|
51
|
+
end
|
52
|
+
|
53
|
+
def load_current_resource
|
54
|
+
@current_resource = Chef::Resource::PostgresqlUser.new(new_resource.name)
|
55
|
+
@current_resource.name(new_resource.name)
|
56
|
+
|
57
|
+
@current_resource.exists = user_exists?
|
58
|
+
end
|
59
|
+
|
60
|
+
def user_exists?
|
61
|
+
exists = %(psql -c "SELECT rolname FROM pg_roles WHERE rolname='#{new_resource.name}'" | grep '#{new_resource.name}') # rubocop:disable LineLength
|
62
|
+
|
63
|
+
cmd = Mixlib::ShellOut.new(exists, user: "postgres")
|
64
|
+
cmd.run_command
|
65
|
+
cmd.exitstatus.zero?
|
66
|
+
end
|
67
|
+
|
68
|
+
def role_sql # rubocop:disable AbcSize, MethodLength
|
69
|
+
sql = %(\\\"#{new_resource.name}\\\" )
|
70
|
+
|
71
|
+
%w[superuser createdb createrole inherit replication login].each do |perm|
|
72
|
+
sql << "#{"NO" unless new_resource.send(perm)}#{perm.upcase} "
|
73
|
+
end
|
74
|
+
|
75
|
+
sql << if new_resource.encrypted_password
|
76
|
+
"ENCRYPTED PASSWORD '#{new_resource.encrypted_password}'"
|
77
|
+
elsif new_resource.password
|
78
|
+
"PASSWORD '#{new_resource.password}'"
|
79
|
+
else
|
80
|
+
""
|
81
|
+
end
|
82
|
+
end
|
@@ -0,0 +1,36 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: postgresql
|
3
|
+
# Recipe:: setup_databases
|
4
|
+
#
|
5
|
+
|
6
|
+
databases = node["postgresql"]["databases"]
|
7
|
+
|
8
|
+
# setup databases
|
9
|
+
databases.each do |db|
|
10
|
+
db_action = (db["action"] || "create").to_sym
|
11
|
+
db_extensions = Array(db["extensions"])
|
12
|
+
db_languages = Array(db["languages"])
|
13
|
+
|
14
|
+
postgresql_database db["name"] do
|
15
|
+
owner db["owner"]
|
16
|
+
encoding db["encoding"]
|
17
|
+
template db["template"]
|
18
|
+
locale db["locale"]
|
19
|
+
action db_action
|
20
|
+
end
|
21
|
+
|
22
|
+
# check for extensions/languages to install from `databases` attribute key
|
23
|
+
next unless db_action == :create
|
24
|
+
|
25
|
+
db_extensions.each do |extension|
|
26
|
+
postgresql_extension extension do
|
27
|
+
database db["name"]
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
db_languages.each do |language|
|
32
|
+
postgresql_language language do
|
33
|
+
database db["name"]
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: postgresql
|
3
|
+
# Recipe:: setup_users
|
4
|
+
#
|
5
|
+
|
6
|
+
# setup users
|
7
|
+
|
8
|
+
node["postgresql"]["users"].each do |user|
|
9
|
+
postgresql_user user["username"] do
|
10
|
+
superuser user["superuser"]
|
11
|
+
createdb user["createdb"]
|
12
|
+
login user["login"]
|
13
|
+
password user["password"]
|
14
|
+
encrypted_password user["encrypted_password"]
|
15
|
+
action Array(user["action"] || "create").map(&:to_sym)
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: postgresql
|
3
|
+
# Resource:: database
|
4
|
+
#
|
5
|
+
|
6
|
+
actions :create, :drop
|
7
|
+
|
8
|
+
default_action :create
|
9
|
+
|
10
|
+
attribute :name, kind_of: String, name_attribute: true
|
11
|
+
attribute :user, kind_of: String, default: "postgres"
|
12
|
+
attribute :username, kind_of: String
|
13
|
+
attribute :host, kind_of: String
|
14
|
+
attribute :port, kind_of: Integer
|
15
|
+
attribute :encoding, kind_of: String, default: "UTF-8"
|
16
|
+
attribute :locale, kind_of: String, default: "en_US.UTF-8"
|
17
|
+
attribute :template, kind_of: String, default: "template0"
|
18
|
+
attribute :owner, kind_of: String
|
19
|
+
|
20
|
+
attr_accessor :exists
|
@@ -0,0 +1,20 @@
|
|
1
|
+
#
|
2
|
+
# Cookbook Name:: postgresql
|
3
|
+
# Resource:: user
|
4
|
+
#
|
5
|
+
|
6
|
+
actions :create, :update, :drop
|
7
|
+
|
8
|
+
default_action :create
|
9
|
+
|
10
|
+
attribute :name, kind_of: String, name_attribute: true
|
11
|
+
attribute :superuser, kind_of: [TrueClass, FalseClass], default: false
|
12
|
+
attribute :createdb, kind_of: [TrueClass, FalseClass], default: false
|
13
|
+
attribute :createrole, kind_of: [TrueClass, FalseClass], default: false
|
14
|
+
attribute :inherit, kind_of: [TrueClass, FalseClass], default: true
|
15
|
+
attribute :replication, kind_of: [TrueClass, FalseClass], default: false
|
16
|
+
attribute :login, kind_of: [TrueClass, FalseClass], default: true
|
17
|
+
attribute :password, kind_of: String
|
18
|
+
attribute :encrypted_password, kind_of: String
|
19
|
+
|
20
|
+
attr_accessor :exists
|
@@ -0,0 +1,72 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'debian::postgresql::server' do
|
4
|
+
let(:chef_application) do
|
5
|
+
double('Chef::Application',fatal!:false);
|
6
|
+
end
|
7
|
+
let(:chef_run) do
|
8
|
+
runner = ChefSpec::SoloRunner.new(
|
9
|
+
platform: 'debian', version: '7.4'
|
10
|
+
) do |node|
|
11
|
+
node.automatic['memory']['total'] = '2048kB'
|
12
|
+
node.automatic['ipaddress'] = '1.1.1.1'
|
13
|
+
node.set['postgresql']['version'] = '9.1'
|
14
|
+
node.set['postgresql']['password']['postgres'] = 'password'
|
15
|
+
end
|
16
|
+
runner.converge('postgresql::server')
|
17
|
+
end
|
18
|
+
before do
|
19
|
+
stub_const('Chef::Application',chef_application)
|
20
|
+
allow(File).to receive(:directory?).and_call_original
|
21
|
+
allow(File).to receive(:directory?).with('/etc/postgresql/9.1/main').and_return(false)
|
22
|
+
stub_command("ls /var/lib/postgresql/9.1/main/recovery.conf").and_return(false)
|
23
|
+
end
|
24
|
+
|
25
|
+
it 'Install postgresql 9.1' do
|
26
|
+
expect(chef_run).to install_package('postgresql-9.1')
|
27
|
+
end
|
28
|
+
|
29
|
+
it 'Install postgresql 9.1 client' do
|
30
|
+
expect(chef_run).to install_package('postgresql-client-9.1')
|
31
|
+
end
|
32
|
+
|
33
|
+
it 'Install postgresql 9.1 dev files' do
|
34
|
+
expect(chef_run).to install_package('libpq-dev')
|
35
|
+
end
|
36
|
+
|
37
|
+
it 'Enable and start service postgresql' do
|
38
|
+
expect(chef_run).to enable_service('postgresql')
|
39
|
+
expect(chef_run).to start_service('postgresql')
|
40
|
+
end
|
41
|
+
|
42
|
+
it 'Create configuration files' do
|
43
|
+
expect(chef_run).to create_template('/etc/postgresql/9.1/main/postgresql.conf')
|
44
|
+
expect(chef_run).to create_template('/etc/postgresql/9.1/main/pg_hba.conf')
|
45
|
+
end
|
46
|
+
|
47
|
+
it 'Assign Postgres Password' do
|
48
|
+
expect(chef_run).to run_bash('assign-postgres-password')
|
49
|
+
end
|
50
|
+
|
51
|
+
context 'when running as a standby host' do
|
52
|
+
it 'does not assign the Postgres password' do
|
53
|
+
stub_command("ls /var/lib/postgresql/9.1/main/recovery.conf").and_return(false)
|
54
|
+
expect(chef_run).to_not run_bash('assign_postgres_password')
|
55
|
+
end
|
56
|
+
end
|
57
|
+
|
58
|
+
it 'Launch Cluster Creation' do
|
59
|
+
expect(chef_run).to run_execute('Set locale and Create cluster')
|
60
|
+
end
|
61
|
+
|
62
|
+
context 'Directory /etc/postgresql/9.1/main exist' do
|
63
|
+
before do
|
64
|
+
allow(File).to receive(:directory?).and_call_original
|
65
|
+
allow(File).to receive(:directory?).with('/etc/postgresql/9.1/main').and_return(true)
|
66
|
+
end
|
67
|
+
|
68
|
+
it 'Don\'t launch Cluster Creation' do
|
69
|
+
expect(chef_run).to_not run_execute('Set locale and Create cluster')
|
70
|
+
end
|
71
|
+
end
|
72
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'postgresql::default' do
|
4
|
+
platforms = {
|
5
|
+
'ubuntu' => {
|
6
|
+
'versions' => ['10.04', '12.04', '14.04']
|
7
|
+
},
|
8
|
+
'centos' => {
|
9
|
+
'versions' => ['6.4', '7.0']
|
10
|
+
},
|
11
|
+
'redhat' => {
|
12
|
+
'versions' => ['6.5', '7.0']
|
13
|
+
},
|
14
|
+
'debian' => {
|
15
|
+
'versions' => ['7.6']
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
platforms.each do |platform, config|
|
20
|
+
config['versions'].each do |version|
|
21
|
+
context "on #{platform} #{version}" do
|
22
|
+
let(:chef_run) {
|
23
|
+
ChefSpec::SoloRunner.new(
|
24
|
+
:platform => platform.to_s,
|
25
|
+
:version => version.to_s
|
26
|
+
) do |node|
|
27
|
+
node.set['postgresql']['password']['postgres'] = 'ilikewaffles'
|
28
|
+
end.converge(described_recipe)
|
29
|
+
}
|
30
|
+
|
31
|
+
it 'runs no tests' do
|
32
|
+
expect(chef_run)
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
describe 'postgresql::server' do
|
4
|
+
platforms = {
|
5
|
+
'ubuntu' => {
|
6
|
+
'versions' => ['10.04', '12.04', '14.04']
|
7
|
+
},
|
8
|
+
'centos' => {
|
9
|
+
'versions' => ['6.4', '7.0']
|
10
|
+
},
|
11
|
+
'redhat' => {
|
12
|
+
'versions' => ['6.5', '7.0']
|
13
|
+
},
|
14
|
+
'debian' => {
|
15
|
+
'versions' => ['7.6']
|
16
|
+
}
|
17
|
+
}
|
18
|
+
|
19
|
+
platforms.each do |platform, config|
|
20
|
+
config['versions'].each do |version|
|
21
|
+
context "on #{platform} #{version}" do
|
22
|
+
let(:chef_run) {
|
23
|
+
ChefSpec::SoloRunner.new(
|
24
|
+
:platform => platform.to_s,
|
25
|
+
:version => version.to_s
|
26
|
+
) do |node|
|
27
|
+
node.set['postgresql']['password']['postgres'] = 'ilikewaffles'
|
28
|
+
end.converge(described_recipe)
|
29
|
+
}
|
30
|
+
|
31
|
+
before do
|
32
|
+
stub_command(/ls \/.*\/recovery.conf/).and_return(false)
|
33
|
+
end
|
34
|
+
|
35
|
+
it 'runs no tests' do
|
36
|
+
expect(chef_run)
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
@@ -0,0 +1,20 @@
|
|
1
|
+
COOKBOOK_RESOLVERS = {
|
2
|
+
'batali' => ['Batali', 'batali/chefspec'],
|
3
|
+
'berkshelf' => ['Berksfile', 'chefspec/berkshelf'],
|
4
|
+
'librarian' => ['Cheffile', 'chefspec/librarian']
|
5
|
+
}
|
6
|
+
|
7
|
+
require 'chefspec'
|
8
|
+
|
9
|
+
if ENV['COOKBOOK_RESOLVER']
|
10
|
+
require COOKBOOK_RESOLVERS[ENV['COOKBOOK_RESOLVER']]
|
11
|
+
else
|
12
|
+
resolver_lib = COOKBOOK_RESOLVERS.values.detect do |r_file, _r_lib|
|
13
|
+
File.exist?(File.join(File.dirname(__FILE__), '..', '..', r_file))
|
14
|
+
end
|
15
|
+
fail 'Failed to locate valid cookbook resolver files!' unless resolver_lib
|
16
|
+
puts "Resolving cookbooks from #{resolver_lib.first}"
|
17
|
+
require resolver_lib.last
|
18
|
+
end
|
19
|
+
|
20
|
+
at_exit { ChefSpec::Coverage.report! }
|
@@ -7,7 +7,7 @@ metadata
|
|
7
7
|
|
8
8
|
cookbook 'user'
|
9
9
|
cookbook 'rvm', github: 'fnichol/chef-rvm'
|
10
|
-
cookbook 'postgresql'
|
10
|
+
cookbook 'postgresql', path: '../postgresql'
|
11
11
|
|
12
12
|
# cookbook 'dpkg_packages', git: "https://gitlab.acid.cl/acidlabs/chef-dpkg-packages.git"
|
13
13
|
# cookbook 'nginx', git: "https://gitlab.acid.cl/acidlabs/chef-nginx.git"
|
@@ -1,5 +1,6 @@
|
|
1
1
|
DEPENDENCIES
|
2
2
|
postgresql
|
3
|
+
path: ../postgresql
|
3
4
|
rvm
|
4
5
|
git: git://github.com/fnichol/chef-rvm.git
|
5
6
|
revision: 08ec265f277e112a5a2e4b201bd32ddfe1bb968c
|
@@ -14,12 +15,12 @@ GRAPH
|
|
14
15
|
chef-sugar (3.1.1)
|
15
16
|
chef_gem (0.1.0)
|
16
17
|
java (1.35.0)
|
17
|
-
openssl (4.
|
18
|
-
chef-sugar (>=
|
19
|
-
postgresql (3.4.
|
18
|
+
openssl (4.4.0)
|
19
|
+
chef-sugar (>= 3.1.1)
|
20
|
+
postgresql (3.4.21)
|
20
21
|
apt (>= 1.9.0)
|
21
22
|
build-essential (>= 0.0.0)
|
22
|
-
openssl (~> 4.0
|
23
|
+
openssl (~> 4.0)
|
23
24
|
rvm (0.10.1)
|
24
25
|
chef_gem (>= 0.0.0)
|
25
26
|
java (>= 0.0.0)
|
@@ -7,6 +7,7 @@ module FromScratch
|
|
7
7
|
app_name, host = ARGV
|
8
8
|
ssh_pub_key = `cat ~/.ssh/id_rsa.pub`.strip
|
9
9
|
postgresql_admin_password = `echo -n '#{SecureRandom.hex(64)}''postgres' | openssl md5 | sed -e 's/.* /md5/'`.strip
|
10
|
+
postgresql_user_password = SecureRandom.hex(16)
|
10
11
|
|
11
12
|
{ node: ['nodes', host], user: ['data_bags/users', 'deploy'] }.each do |from, to|
|
12
13
|
FileUtils.mkdir_p File.expand_path("../../tmp/#{to[0]}", __FILE__)
|
@@ -3,6 +3,8 @@
|
|
3
3
|
"recipe[rvm::system]",
|
4
4
|
"recipe[postgresql::server]",
|
5
5
|
"recipe[postgresql::config_pgtune]",
|
6
|
+
"recipe[postgresql::setup_users]",
|
7
|
+
"recipe[postgresql::setup_databases]",
|
6
8
|
"recipe[user::data_bag]",
|
7
9
|
"recipe[scratchify]"
|
8
10
|
],
|
@@ -23,6 +25,21 @@
|
|
23
25
|
"password": {
|
24
26
|
"postgres": "<%= postgresql_admin_password %>"
|
25
27
|
},
|
28
|
+
"users": [
|
29
|
+
{
|
30
|
+
"username": "<%= app_name %>",
|
31
|
+
"superuser": false,
|
32
|
+
"createdb": false,
|
33
|
+
"login": true,
|
34
|
+
"password": "<%= postgresql_user_password %>"
|
35
|
+
}
|
36
|
+
],
|
37
|
+
"databases": [
|
38
|
+
{
|
39
|
+
"name": "<%= app_name %>",
|
40
|
+
"owner": "<%= app_name %>"
|
41
|
+
}
|
42
|
+
],
|
26
43
|
"config_pgtune": {
|
27
44
|
"db_type": "web"
|
28
45
|
}
|
data/from-scratch.gemspec
CHANGED
@@ -20,8 +20,8 @@ Gem::Specification.new do |spec|
|
|
20
20
|
|
21
21
|
spec.add_development_dependency "bundler", "~> 1.10"
|
22
22
|
spec.add_development_dependency "rake", "~> 10.0"
|
23
|
-
spec.add_development_dependency 'rspec', "~> 3.3
|
24
|
-
spec.add_development_dependency 'pry'
|
23
|
+
spec.add_development_dependency 'rspec', "~> 3.3"
|
24
|
+
spec.add_development_dependency 'pry', "~> 0.10"
|
25
25
|
|
26
26
|
spec.add_dependency 'knife-solo'
|
27
27
|
spec.add_dependency 'knife-solo_data_bag'
|