fhcap-cli 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/.gitignore +10 -0
- data/.rakeTasks +7 -0
- data/.rspec +1 -0
- data/CHANGELOG.md +15 -0
- data/Gemfile +4 -0
- data/LICENSE.txt +21 -0
- data/README.md +150 -0
- data/Rakefile +2 -0
- data/bin/fhcap +6 -0
- data/fhcap-cli.gemspec +44 -0
- data/lib/cookbooks/provision/libraries/provision.rb +140 -0
- data/lib/cookbooks/provision/metadata.rb +7 -0
- data/lib/cookbooks/provision/recipes/aws.rb +15 -0
- data/lib/cookbooks/provision/recipes/aws_cluster_create.rb +59 -0
- data/lib/cookbooks/provision/recipes/aws_cluster_create_elb.rb +61 -0
- data/lib/cookbooks/provision/recipes/aws_cluster_destroy.rb +52 -0
- data/lib/cookbooks/provision/recipes/cluster_create.rb +2 -0
- data/lib/cookbooks/provision/recipes/cluster_destroy.rb +2 -0
- data/lib/cookbooks/provision/recipes/cluster_destroy_instances.rb +11 -0
- data/lib/cookbooks/provision/recipes/cluster_provision.rb +4 -0
- data/lib/cookbooks/provision/recipes/cluster_provision_instances.rb +55 -0
- data/lib/cookbooks/provision/recipes/cluster_status.rb +24 -0
- data/lib/cookbooks/provision/recipes/common.rb +9 -0
- data/lib/cookbooks/provision/recipes/default.rb +5 -0
- data/lib/cookbooks/provision/recipes/openstack.rb +11 -0
- data/lib/cookbooks/provision/recipes/openstack_cluster_create.rb +11 -0
- data/lib/cookbooks/provision/recipes/openstack_cluster_destroy.rb +4 -0
- data/lib/cookbooks/provision/recipes/reset_rabbitmq.rb +49 -0
- data/lib/cookbooks/provision/recipes/restart_services.rb +24 -0
- data/lib/extensions/chef/provisioning.rb +21 -0
- data/lib/extensions/chef/provisioning/aws_driver/driver.rb +46 -0
- data/lib/extensions/chef/provisioning/chef_run_data.rb +18 -0
- data/lib/extensions/cheffish/merged_config.rb +9 -0
- data/lib/fhcap.rb +14 -0
- data/lib/fhcap/chef-dk/chef_runner.rb +94 -0
- data/lib/fhcap/cli.rb +75 -0
- data/lib/fhcap/cluster.rb +112 -0
- data/lib/fhcap/config.rb +104 -0
- data/lib/fhcap/cookbook.rb +75 -0
- data/lib/fhcap/dummy_node.rb +80 -0
- data/lib/fhcap/fhcap_helper.rb +9 -0
- data/lib/fhcap/kitchen.rb +235 -0
- data/lib/fhcap/knife.rb +74 -0
- data/lib/fhcap/knife_helper.rb +38 -0
- data/lib/fhcap/misc.rb +103 -0
- data/lib/fhcap/provider.rb +41 -0
- data/lib/fhcap/providers_helper.rb +60 -0
- data/lib/fhcap/repo.rb +52 -0
- data/lib/fhcap/repos_helper.rb +217 -0
- data/lib/fhcap/tasks/chef/chef_task_base.rb +82 -0
- data/lib/fhcap/tasks/chef/cookbook/list.rb +37 -0
- data/lib/fhcap/tasks/chef/cookbook/update_changelog.rb +63 -0
- data/lib/fhcap/tasks/chef/cookbook/update_metadata.rb +57 -0
- data/lib/fhcap/tasks/chef/cookbook/update_readme.rb +30 -0
- data/lib/fhcap/tasks/chef/cookbook/update_version.rb +90 -0
- data/lib/fhcap/tasks/chef/environments/create.rb +115 -0
- data/lib/fhcap/tasks/chef/environments/destroy.rb +37 -0
- data/lib/fhcap/tasks/chef/environments/promote_cookbooks.rb +47 -0
- data/lib/fhcap/tasks/chef/provisioning/chef_provisioning_task.rb +27 -0
- data/lib/fhcap/tasks/chef/provisioning/chef_provisioning_task_base.rb +38 -0
- data/lib/fhcap/tasks/chef/provisioning/create.rb +22 -0
- data/lib/fhcap/tasks/chef/provisioning/destroy.rb +21 -0
- data/lib/fhcap/tasks/chef/provisioning/provision.rb +19 -0
- data/lib/fhcap/tasks/chef/server/bootstrap.rb +165 -0
- data/lib/fhcap/tasks/chef/server/create_user.rb +97 -0
- data/lib/fhcap/tasks/chef/server/info.rb +82 -0
- data/lib/fhcap/tasks/chef/server/provision.rb +45 -0
- data/lib/fhcap/tasks/clean.rb +34 -0
- data/lib/fhcap/tasks/cluster/cluster_task_base.rb +57 -0
- data/lib/fhcap/tasks/cluster/create.rb +243 -0
- data/lib/fhcap/tasks/cluster/create_environment.rb +171 -0
- data/lib/fhcap/tasks/cluster/destroy.rb +30 -0
- data/lib/fhcap/tasks/cluster/destroy_environment.rb +28 -0
- data/lib/fhcap/tasks/cluster/info.rb +67 -0
- data/lib/fhcap/tasks/cluster/list.rb +40 -0
- data/lib/fhcap/tasks/cluster/provision.rb +46 -0
- data/lib/fhcap/tasks/cluster/status.rb +17 -0
- data/lib/fhcap/tasks/cluster/test.rb +15 -0
- data/lib/fhcap/tasks/knife/add.rb +111 -0
- data/lib/fhcap/tasks/knife/list.rb +22 -0
- data/lib/fhcap/tasks/knife/remove.rb +39 -0
- data/lib/fhcap/tasks/misc/create_dns_record.rb +100 -0
- data/lib/fhcap/tasks/misc/create_ssl_cert.rb +82 -0
- data/lib/fhcap/tasks/provider/add.rb +136 -0
- data/lib/fhcap/tasks/provider/list.rb +31 -0
- data/lib/fhcap/tasks/provider/remove.rb +28 -0
- data/lib/fhcap/tasks/repo/add.rb +57 -0
- data/lib/fhcap/tasks/repo/checkout.rb +144 -0
- data/lib/fhcap/tasks/repo/list.rb +22 -0
- data/lib/fhcap/tasks/repo/remove.rb +34 -0
- data/lib/fhcap/tasks/setup.rb +59 -0
- data/lib/fhcap/tasks/task_base.rb +89 -0
- data/lib/fhcap/thor_base.rb +121 -0
- data/lib/fhcap/version.rb +3 -0
- data/spec/fhcap/cli_spec.rb +6 -0
- data/spec/fhcap/tasks/cluster/create_spec.rb +46 -0
- data/spec/fhcap/tasks/knife/add_spec.rb +35 -0
- data/spec/fhcap/tasks/knife/remove_spec.rb +25 -0
- data/spec/fhcap/tasks/provider/add_spec.rb +61 -0
- data/spec/fhcap/tasks/provider/remove_spec.rb +25 -0
- data/spec/fhcap/tasks/repo/add_spec.rb +32 -0
- data/spec/fhcap/tasks/repo/remove_spec.rb +25 -0
- data/spec/fhcap/tasks/task_base_spec.rb +51 -0
- data/spec/fhcap/thor_base_spec.rb +9 -0
- data/spec/spec_helper.rb +23 -0
- data/spec/support/dummy_config.rb +7 -0
- data/spec/support/dummy_thor.rb +3 -0
- data/templates/chef/cookbook/changelog.md.erb +12 -0
- data/templates/chef/cookbook/metadata.erb +45 -0
- data/templates/chef/environment_core.json.erb +278 -0
- data/templates/chef/environment_empty.json.erb +10 -0
- data/templates/chef/environment_mbaas.json.erb +120 -0
- data/templates/chef/environment_single.json.erb +300 -0
- data/templates/cluster/aws/common.json.erb +43 -0
- data/templates/cluster/aws/core-3node.json.erb +106 -0
- data/templates/cluster/aws/core-small-9node.json.erb +333 -0
- data/templates/cluster/aws/mbaas-3node.json.erb +116 -0
- data/templates/cluster/aws/nginx-test.json.erb +93 -0
- data/templates/cluster/aws/single-blank.json.erb +41 -0
- data/templates/cluster/aws/single.json.erb +88 -0
- data/templates/cluster/core-3node.json.erb +8 -0
- data/templates/cluster/core-mbaas-6node.json.erb +13 -0
- data/templates/cluster/core-small-9node.json.erb +8 -0
- data/templates/cluster/mbaas-3node.json.erb +9 -0
- data/templates/cluster/nginx-test.json.erb +8 -0
- data/templates/cluster/openstack/common.json.erb +7 -0
- data/templates/cluster/openstack/core-3node.json.erb +14 -0
- data/templates/cluster/openstack/core-small-9node.json.erb +32 -0
- data/templates/cluster/openstack/mbaas-3node.json.erb +14 -0
- data/templates/cluster/openstack/nginx-test.json.erb +11 -0
- data/templates/cluster/openstack/single-blank.json.erb +10 -0
- data/templates/cluster/openstack/single.json.erb +10 -0
- data/templates/cluster/single-blank.json.erb +8 -0
- data/templates/cluster/single.json.erb +8 -0
- data/templates/init/knife.rb.erb +13 -0
- data/templates/kitchen/Cheffile.erb +11 -0
- data/templates/kitchen/kitchen.aws.yml.erb +35 -0
- data/templates/kitchen/kitchen.docker.yml.erb +24 -0
- data/templates/kitchen/kitchen.generate.yml.erb +2 -0
- data/templates/kitchen/kitchen.openstack.yml.erb +31 -0
- metadata +506 -0
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
|
3
|
+
module Fhcap
|
4
|
+
module Tasks
|
5
|
+
module Chef
|
6
|
+
module Cookbook
|
7
|
+
class List < ChefTaskBase
|
8
|
+
|
9
|
+
def run
|
10
|
+
thor.say "Chef::Cookbook::List", :yellow
|
11
|
+
cookbooks = get_cookbooks(options, nil, repo_cookbook_paths('-cookbooks'))
|
12
|
+
|
13
|
+
table_contents = [table_header("Cookbook", "Version", "Artifact Version", "Artifact Build")]
|
14
|
+
|
15
|
+
cookbooks.each do |name|
|
16
|
+
cookbook = cookbook_loader.cookbooks_by_name[name]
|
17
|
+
meta = get_cookbook_meta(name)
|
18
|
+
artifact_attribute_filepath = cookbook.attribute_filenames.find { |e| /artifact.rb/ =~ e }
|
19
|
+
artifact_version = "N/A"
|
20
|
+
artifact_build = "N/A"
|
21
|
+
artifact_path = "N/A"
|
22
|
+
if artifact_attribute_filepath
|
23
|
+
node = ::Chef::Node.new
|
24
|
+
node.from_file(artifact_attribute_filepath)
|
25
|
+
artifact_version = node.default[name]['version']
|
26
|
+
artifact_build = node.default[name]['build']
|
27
|
+
end
|
28
|
+
table_contents << table_row(name, meta.version, artifact_version, artifact_build)
|
29
|
+
end
|
30
|
+
thor.print_table table_contents
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,63 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
|
3
|
+
module Fhcap
|
4
|
+
module Tasks
|
5
|
+
module Chef
|
6
|
+
module Cookbook
|
7
|
+
class UpdateChangelog < ChefTaskBase
|
8
|
+
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
def initialize(options)
|
12
|
+
super
|
13
|
+
@name = options[:cookbook]
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
thor.say "Chef::Cookbook::UpdateChangelog cookbook = #{name}", :yellow
|
18
|
+
cookbook = cookbook_loader.cookbooks_by_name[name]
|
19
|
+
meta = get_cookbook_meta(name)
|
20
|
+
|
21
|
+
version = meta.version
|
22
|
+
changelog_file = cookbook.root_filenames.find { |e| /CHANGELOG.md/ =~ e }
|
23
|
+
|
24
|
+
if changelog_file
|
25
|
+
changelog = parse_changelog(changelog_file)
|
26
|
+
|
27
|
+
if changelog[version]
|
28
|
+
thor.say_status("error", "Already a Changelog entry for #{name} version #{version}", :red)
|
29
|
+
else
|
30
|
+
changelog[version] = options[:'changelog-entries'] || []
|
31
|
+
thor.template(File.join('templates', 'chef', 'cookbook', 'changelog.md.erb'), changelog_file, {:cookbook => name, :changelog => changelog})
|
32
|
+
end
|
33
|
+
else
|
34
|
+
thor.say_status("error", "No Changelog found for #{name}", :red)
|
35
|
+
end
|
36
|
+
|
37
|
+
end
|
38
|
+
|
39
|
+
private
|
40
|
+
|
41
|
+
def parse_changelog(file)
|
42
|
+
changelog = {}
|
43
|
+
lines = File.readlines(file)
|
44
|
+
current_version = nil
|
45
|
+
lines.each do |line|
|
46
|
+
if match = line.match(/^## (\d+.\d+.\d+):/)
|
47
|
+
current_version = version = match[1]
|
48
|
+
changelog[version] = []
|
49
|
+
elsif match = line.match(/^* (.+)$/)
|
50
|
+
entry = match[1]
|
51
|
+
if current_version
|
52
|
+
changelog[current_version] << entry
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
changelog
|
57
|
+
end
|
58
|
+
|
59
|
+
end
|
60
|
+
end
|
61
|
+
end
|
62
|
+
end
|
63
|
+
end
|
@@ -0,0 +1,57 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
require 'fhcap/dummy_node'
|
3
|
+
|
4
|
+
module Fhcap
|
5
|
+
module Tasks
|
6
|
+
module Chef
|
7
|
+
module Cookbook
|
8
|
+
class UpdateMetadata < ChefTaskBase
|
9
|
+
|
10
|
+
attr_reader :name
|
11
|
+
|
12
|
+
def initialize(options)
|
13
|
+
super
|
14
|
+
@name = options[:cookbook]
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
thor.say "Chef::Cookbook::UpdateMetadata cookbook = #{name}", :yellow
|
19
|
+
cookbook = cookbook_loader.cookbooks_by_name[name]
|
20
|
+
generate_metadata(cookbook)
|
21
|
+
end
|
22
|
+
|
23
|
+
private
|
24
|
+
|
25
|
+
def generate_metadata(cookbook)
|
26
|
+
|
27
|
+
meta = get_cookbook_meta(name)
|
28
|
+
|
29
|
+
metadata_filepath = cookbook.metadata_filenames.first
|
30
|
+
attribute_filepaths = cookbook.attribute_filenames
|
31
|
+
|
32
|
+
attribute_filepaths.each() do |file|
|
33
|
+
node = Fhcap::DummyNode.new
|
34
|
+
node.from_file(file)
|
35
|
+
node_attrs = node.metadata_attributes
|
36
|
+
|
37
|
+
node_attrs.each() do |k, v|
|
38
|
+
if meta.attributes[k]
|
39
|
+
node_attrs[k] = meta.attributes[k].merge(v)
|
40
|
+
end
|
41
|
+
node_attrs[k]["description"] = "" if node_attrs[k]['description'].nil? || node_attrs[k]['description'].empty?
|
42
|
+
meta.attribute(k, node_attrs[k])
|
43
|
+
end
|
44
|
+
end
|
45
|
+
meta_hash = meta.to_hash().merge({cookbook: name})
|
46
|
+
|
47
|
+
template_filepath = File.join(Fhcap.source_root, 'templates', 'chef', 'cookbook', 'metadata.erb')
|
48
|
+
eruby = Erubis::Eruby.new(File.read(template_filepath))
|
49
|
+
result = eruby.result(meta_hash)
|
50
|
+
thor.create_file(metadata_filepath, result, {force: true})
|
51
|
+
end
|
52
|
+
|
53
|
+
end
|
54
|
+
end
|
55
|
+
end
|
56
|
+
end
|
57
|
+
end
|
@@ -0,0 +1,30 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
|
3
|
+
module Fhcap
|
4
|
+
module Tasks
|
5
|
+
module Chef
|
6
|
+
module Cookbook
|
7
|
+
class UpdateReadme < ChefTaskBase
|
8
|
+
|
9
|
+
attr_reader :name
|
10
|
+
|
11
|
+
def initialize(options)
|
12
|
+
super
|
13
|
+
@name = options[:cookbook]
|
14
|
+
end
|
15
|
+
|
16
|
+
def run
|
17
|
+
thor.say "Chef::Cookbook::UpdateReadme cookbook = #{name}", :yellow
|
18
|
+
cookbook = cookbook_loader.cookbooks_by_name[name]
|
19
|
+
metadata_file = cookbook.metadata_filenames.first
|
20
|
+
readme_file = cookbook.root_filenames.find { |e| /README/ =~ e }
|
21
|
+
cmd = "knife cookbook readme from #{metadata_file} > #{readme_file}"
|
22
|
+
thor.run(cmd)
|
23
|
+
end
|
24
|
+
|
25
|
+
end
|
26
|
+
|
27
|
+
end
|
28
|
+
end
|
29
|
+
end
|
30
|
+
end
|
@@ -0,0 +1,90 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
|
3
|
+
module Fhcap
|
4
|
+
module Tasks
|
5
|
+
module Chef
|
6
|
+
module Cookbook
|
7
|
+
class UpdateVersion < ChefTaskBase
|
8
|
+
|
9
|
+
attr_reader :name, :version, :level
|
10
|
+
|
11
|
+
def initialize(options)
|
12
|
+
super
|
13
|
+
@name = options[:cookbook]
|
14
|
+
@version = options[:version]
|
15
|
+
@level = ('manual' if @version) || ('patch' if options[:wip]) || options[:level] || 'minor'
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
thor.say "Chef::Cookbook::UpdateVersion cookbook = #{name}", :yellow
|
20
|
+
cookbook = cookbook_loader.cookbooks_by_name[name]
|
21
|
+
metadata_file = cookbook.metadata_filenames.first
|
22
|
+
|
23
|
+
if is_dirty?(metadata_file)
|
24
|
+
thor.say_status("error", "#{metadata_file} has uncommitted changes. Please reset this file or commit any changes before continuing!", :red)
|
25
|
+
else
|
26
|
+
bump(cookbook, metadata_file)
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
### Modified version of https://github.com/jonlives/knife-spork/blob/master/lib/chef/knife/spork-bump.rb
|
33
|
+
|
34
|
+
TYPE_INDEX = {:major => 0, :minor => 1, :patch => 2, :manual => 3}.freeze
|
35
|
+
|
36
|
+
def bump(cookbook, metadata_file)
|
37
|
+
old_version = cookbook.version
|
38
|
+
|
39
|
+
if bump_type == 3
|
40
|
+
# manual bump
|
41
|
+
version_array = manual_bump_version.split('.')
|
42
|
+
else
|
43
|
+
# major, minor, or patch bump
|
44
|
+
version_array = old_version.split('.').collect { |i| i.to_i }
|
45
|
+
version_array[bump_type] += 1
|
46
|
+
((bump_type+1)..2).each { |i| version_array[i] = 0 } # reset all lower version numbers to 0
|
47
|
+
end
|
48
|
+
|
49
|
+
new_version = version_array.join('.')
|
50
|
+
|
51
|
+
new_contents = File.read(metadata_file).gsub(/(version\s+['"])[0-9\.]+(['"])/, "\\1#{new_version}\\2")
|
52
|
+
File.open(metadata_file, 'w') { |f| f.write(new_contents) }
|
53
|
+
|
54
|
+
thor.say "Successfully bumped #{cookbook.name} to v#{new_version}!"
|
55
|
+
end
|
56
|
+
|
57
|
+
def bump_type
|
58
|
+
TYPE_INDEX[(level || 'patch').to_sym]
|
59
|
+
end
|
60
|
+
|
61
|
+
def manual_bump_version
|
62
|
+
validate_version!(version)
|
63
|
+
version
|
64
|
+
end
|
65
|
+
|
66
|
+
def valid_version?(version)
|
67
|
+
version_keys = version.split('.')
|
68
|
+
return false unless version_keys.size == 3 && version_keys.any? { |k|
|
69
|
+
begin
|
70
|
+
Float(k);
|
71
|
+
rescue false;
|
72
|
+
else
|
73
|
+
true;
|
74
|
+
end }
|
75
|
+
true
|
76
|
+
end
|
77
|
+
|
78
|
+
def validate_version!(version)
|
79
|
+
if version && !valid_version?(version)
|
80
|
+
thor.say_status("error", "#{version} is not a valid version!", :red)
|
81
|
+
end
|
82
|
+
end
|
83
|
+
|
84
|
+
###
|
85
|
+
|
86
|
+
end
|
87
|
+
end
|
88
|
+
end
|
89
|
+
end
|
90
|
+
end
|
@@ -0,0 +1,115 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
require 'sshkey'
|
3
|
+
|
4
|
+
module Fhcap
|
5
|
+
module Tasks
|
6
|
+
module Chef
|
7
|
+
module Environments
|
8
|
+
class Create < ChefTaskBase
|
9
|
+
|
10
|
+
def initialize(options)
|
11
|
+
super
|
12
|
+
@name = options[:name]
|
13
|
+
@domain = options[:domain]
|
14
|
+
@type = options[:type]
|
15
|
+
@repo = options[:repo]
|
16
|
+
@passwords = {}
|
17
|
+
end
|
18
|
+
|
19
|
+
def run
|
20
|
+
thor.say "Chef::Environments::Create name = #{@name}, type = #{@type}, domain = #{@domain}", :yellow
|
21
|
+
env_config = {
|
22
|
+
name: @name,
|
23
|
+
domain: @domain,
|
24
|
+
skip: true
|
25
|
+
}
|
26
|
+
create_environment(env_config)
|
27
|
+
create_data_bag(env_config)
|
28
|
+
end
|
29
|
+
|
30
|
+
private
|
31
|
+
|
32
|
+
def create_environment(env_config)
|
33
|
+
environment_template = "environment_#{@type}.json.erb"
|
34
|
+
environment_file = File.join(repo_dir(@repo), 'environments', "#{@name}.json")
|
35
|
+
thor.template(File.join('templates', 'chef', environment_template), environment_file, env_config)
|
36
|
+
end
|
37
|
+
|
38
|
+
def create_data_bag(env_config)
|
39
|
+
environment_data_bag_file = File.join(repo_dir(@repo), 'data_bags', 'environments', "#{@name}.json")
|
40
|
+
env_data_bag_conf = generate_template_config(env_config)
|
41
|
+
current_config = File.exists?(environment_data_bag_file) ? JSON.parse(IO.read(environment_data_bag_file), {:symbolize_names => true}) : {}
|
42
|
+
env_data_bag_conf.merge!(current_config)
|
43
|
+
thor.create_file(environment_data_bag_file, JSON.pretty_generate(env_data_bag_conf))
|
44
|
+
passwords_file = File.join(repo_dir(@repo), repo_clusters_dir(@repo), "#{@name}_passwords.json")
|
45
|
+
thor.create_file(passwords_file, JSON.pretty_generate(@passwords), skip: true)
|
46
|
+
end
|
47
|
+
|
48
|
+
def random_password(name)
|
49
|
+
unless @passwords[name]
|
50
|
+
@passwords[name] = SecureRandom.urlsafe_base64(6)
|
51
|
+
end
|
52
|
+
@passwords[name]
|
53
|
+
end
|
54
|
+
|
55
|
+
def hashed_password(name)
|
56
|
+
`openssl passwd -1 #{random_password(name)}`.strip
|
57
|
+
end
|
58
|
+
|
59
|
+
def generate_template_config(env_config)
|
60
|
+
config = {
|
61
|
+
id: env_config[:name]
|
62
|
+
}
|
63
|
+
|
64
|
+
#users
|
65
|
+
users = %w{hadmin henryd}
|
66
|
+
config[:users] = {}
|
67
|
+
|
68
|
+
users.each do |user|
|
69
|
+
config[:users][user.to_sym] = {}
|
70
|
+
key = SSHKey.generate(:comment => "#{user}@feedhenry")
|
71
|
+
config[:users][user.to_sym][:ssh_public_key] = key.ssh_public_key
|
72
|
+
config[:users][user.to_sym][:ssh_private_key] = key.private_key
|
73
|
+
end
|
74
|
+
|
75
|
+
config[:users][:hadmin][:password] = hashed_password('users.hadmin')
|
76
|
+
config[:users][:hadmin][:ssh_keys] = []
|
77
|
+
|
78
|
+
#ssh keys
|
79
|
+
ssh_key_users = %w{gitolite gitlab_shell repoadmin nagios_user}
|
80
|
+
ssh_key_users.each do |user|
|
81
|
+
config[user.to_sym] = {}
|
82
|
+
key = SSHKey.generate(:comment => "#{user}@feedhenry")
|
83
|
+
config[user.to_sym][:ssh_public_key] = key.ssh_public_key
|
84
|
+
config[user.to_sym][:ssh_private_key] = key.private_key
|
85
|
+
end
|
86
|
+
config[:users][:hadmin][:ssh_keys] << config[:nagios_user][:ssh_public_key]
|
87
|
+
|
88
|
+
#root_user
|
89
|
+
config[:root_user] = {password: hashed_password('root_user')}
|
90
|
+
|
91
|
+
#henry_users
|
92
|
+
config[:henry_users] = []
|
93
|
+
|
94
|
+
config[:henry_users] << {name: 'team.ops', password: hashed_password('henry_users.teamops')}
|
95
|
+
config[:henry_users] << {name: 'team.eng', password: hashed_password('henry_users.teameng')}
|
96
|
+
config[:henry_users] << {name: 'team.support', password: hashed_password('henry_users.teamsupport')}
|
97
|
+
config[:henry_users] << {name: 'team.qe', password: hashed_password('henry_users.qe')}
|
98
|
+
config[:henry_users] << {name: 'team.ps', password: hashed_password('henry_users.ps')}
|
99
|
+
config[:henry_users].uniq! { |u| u[:name] }
|
100
|
+
|
101
|
+
config[:mongodb] = {}
|
102
|
+
config[:mongodb][:shared_key] = "bim4jSl3AL0Dna7gU/4YOOIZtDOl4HmTFXR8Jz8EHnm7qTSRxm3NrvDIyvQmz3FZVHdyi9BgSBVmm2Yti74aOIbHLsX3l+tN+gNnu265uSC3o9qIVDNxwOFLTZc3TNtxgBD7BGCkwKMI/T4LVADuDlmZEcUHddZcpYbzmwMT47af3VzoN91yiRLXM/cwsU2ZtWCgg8gAbE1tOZ0pOUPLvXuJvREz7cena6cP0OaA/yvJ9V2sWaTPj3dr3tApPdRW5a2fPrVW/Q9k9krvEd/6+cabSNaIsIK1P1E1qvxNE+WfY2M6TwVN69o/0IfE9TbJp+n1kQzrOudYiI0r793uXAMFfVEqrhFKhs/q9gkZFOcgx0f8LnxLTGeV4umJJ4vs0wtaJoRBQzsDhZ7c0+Itw7jNTNu3mmAYqcVE3k4hTRZGKKH9r+f1l3s4H2esLQ6VFkRJ++wMKu6Rku1FR4c8d4/g74C+GPWjrexUhgTJZWgvqGwA4NsgCfV3rkybHnhOvph3B+dKwJYc3QegeN5fk2ct4EIaRIKsArd+SNJbRkXSkmCunkiZwzcWEqbxXHbsqXRH/DT2/03aDvA9qUUH08/J1ILdJxIbjiOKG6pCT0cWgyn2DqLYh9XB7JyofJYDsUThZYKEFnnSnqgcHKbajKUuQMX82Znj50g2Dfry9SQK5E/zMKF2XE56+cvOowcqziel08Oyc/poH78t6izpKoVT98CjPuaj7CYB6qgUr4xFFToTDHDYI9kQ0cLLmIUcYYkCNXciFCcViC0EatUcaNduA25lIYO7Zy1t5BN3gLtt1fgMhvqWqM37EjcJuGcSdiOaShlFnb4cbHKFFmcJy05/NkA3GwZAWJ37sm27vxt1g08JXwqMdrAjnaPp31v03N10PgGSDa2PjZa2AG9Hg44ZwrfLU5ftaluClhZQYUtCmS0OHeuonULicQWHF3qxUYx5w668HP5QyvXyzlYGkw1WhY9i"
|
103
|
+
|
104
|
+
config[:admin_contacts] = []
|
105
|
+
|
106
|
+
nocAlerts = {email: 'noc.alerts@example.com', nagios: true, syslog_ng_watchdog: true, backup_watchdog: true, forward: true, crons: true}
|
107
|
+
config[:admin_contacts] << nocAlerts
|
108
|
+
config
|
109
|
+
end
|
110
|
+
|
111
|
+
end
|
112
|
+
end
|
113
|
+
end
|
114
|
+
end
|
115
|
+
end
|
@@ -0,0 +1,37 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
|
3
|
+
module Fhcap
|
4
|
+
module Tasks
|
5
|
+
module Chef
|
6
|
+
module Environments
|
7
|
+
class Destroy < ChefTaskBase
|
8
|
+
|
9
|
+
attr_reader :name, :chef_server
|
10
|
+
|
11
|
+
def initialize(options)
|
12
|
+
super
|
13
|
+
@name = options[:name]
|
14
|
+
@repo = options[:repo]
|
15
|
+
@chef_server = options[:chef_server]
|
16
|
+
end
|
17
|
+
|
18
|
+
def run
|
19
|
+
thor.say "Chef::Environments::Destroy #{@name}", :yellow
|
20
|
+
|
21
|
+
if @chef_server
|
22
|
+
if thor.yes? "Remove all environments and config from the chef server (#{@chef_server})?"
|
23
|
+
run_knife_cmd("environment delete #{@name} -y", @chef_server)
|
24
|
+
run_knife_cmd("data bag delete environments #{@name} -y", @chef_server)
|
25
|
+
end
|
26
|
+
end
|
27
|
+
|
28
|
+
thor.remove_file find_data_bag_item('environments', @name)
|
29
|
+
thor.remove_file find_environment(@name)
|
30
|
+
thor.remove_file find_repo_item(repo_clusters_dir(@repo), "#{@name}_passwords.json").first
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
34
|
+
end
|
35
|
+
end
|
36
|
+
end
|
37
|
+
end
|
@@ -0,0 +1,47 @@
|
|
1
|
+
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
+
|
3
|
+
module Fhcap
|
4
|
+
module Tasks
|
5
|
+
module Chef
|
6
|
+
module Environments
|
7
|
+
class PromoteCookbooks < ChefTaskBase
|
8
|
+
|
9
|
+
attr_reader :environments, :cookbooks
|
10
|
+
|
11
|
+
def initialize(options)
|
12
|
+
super
|
13
|
+
@environments = options[:environments] || []
|
14
|
+
@cookbooks = options[:cookbooks] || []
|
15
|
+
end
|
16
|
+
|
17
|
+
def run
|
18
|
+
cookbooks = get_cookbooks(options)
|
19
|
+
thor.say "Chef::Environments::PromoteCookbooks: environments = #{environments}", :yellow
|
20
|
+
if environments.empty?
|
21
|
+
exit_with_error("You must specify at least one environment during promote!")
|
22
|
+
else
|
23
|
+
repo_cookbook_versions = get_cookbook_versions(options) do |cookbook, version|
|
24
|
+
thor.say("Adding version constraint #{cookbook} = #{version}") if verbose
|
25
|
+
end
|
26
|
+
|
27
|
+
environments.each do |environment|
|
28
|
+
environment_filepath = find_environment(environment)
|
29
|
+
if environment_filepath
|
30
|
+
environment_data = JSON.parse(IO.read(environment_filepath))
|
31
|
+
env_cookbook_versions = environment_data['cookbook_versions'] || {}
|
32
|
+
cookbooks.each do |cookbook|
|
33
|
+
env_cookbook_versions[cookbook] = "= #{repo_cookbook_versions[cookbook]}"
|
34
|
+
end
|
35
|
+
thor.create_file(environment_filepath, JSON.pretty_generate(environment_data), :force => true)
|
36
|
+
else
|
37
|
+
thor.say "Unknown environment #{environment}", :red
|
38
|
+
end
|
39
|
+
end
|
40
|
+
end
|
41
|
+
end
|
42
|
+
|
43
|
+
end
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|