fhcap-cli 0.4.2 → 0.4.3
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +8 -0
- data/README.md +2 -0
- data/lib/cookbooks/provision/libraries/provision.rb +24 -0
- data/lib/cookbooks/provision/recipes/aws_cluster_create.rb +1 -2
- data/lib/cookbooks/provision/recipes/cluster_create_instances.rb +14 -0
- data/lib/cookbooks/provision/recipes/cluster_destroy_instances.rb +6 -6
- data/lib/cookbooks/provision/recipes/cluster_provision_instances.rb +7 -47
- data/lib/cookbooks/provision/recipes/openstack_cluster_create.rb +9 -9
- data/lib/cookbooks/provision/recipes/seed_cookbooks.rb +38 -0
- data/lib/fhcap/cli.rb +4 -0
- data/lib/fhcap/cluster.rb +13 -1
- data/lib/fhcap/config.rb +4 -0
- data/lib/fhcap/cookbook.rb +10 -0
- data/lib/fhcap/dns.rb +60 -0
- data/lib/fhcap/misc.rb +17 -24
- data/lib/fhcap/tasks/chef/chef_server_task.rb +105 -0
- data/lib/fhcap/tasks/chef/chef_task_base.rb +2 -40
- data/lib/fhcap/tasks/chef/chef_zero_server.rb +35 -0
- data/lib/fhcap/tasks/chef/cookbook/archive.rb +42 -0
- data/lib/fhcap/tasks/chef/cookbook/update_metadata.rb +1 -1
- data/lib/fhcap/tasks/chef/environments/destroy.rb +10 -10
- data/lib/fhcap/tasks/chef/provisioning/chef_provisioning_task.rb +3 -1
- data/lib/fhcap/tasks/chef/provisioning/chef_provisioning_task_base.rb +14 -7
- data/lib/fhcap/tasks/chef/provisioning/create.rb +12 -3
- data/lib/fhcap/tasks/chef/provisioning/destroy.rb +5 -2
- data/lib/fhcap/tasks/chef/provisioning/provision.rb +4 -2
- data/lib/fhcap/tasks/chef/server/bootstrap.rb +47 -122
- data/lib/fhcap/tasks/chef/server/info.rb +8 -7
- data/lib/fhcap/tasks/chef/server/provision.rb +17 -17
- data/lib/fhcap/tasks/cluster/chef_provisioning_task.rb +16 -0
- data/lib/fhcap/tasks/cluster/cluster_task_base.rb +8 -0
- data/lib/fhcap/tasks/cluster/create.rb +6 -5
- data/lib/fhcap/tasks/cluster/destroy.rb +15 -4
- data/lib/fhcap/tasks/cluster/destroy_environment.rb +1 -1
- data/lib/fhcap/tasks/cluster/info.rb +1 -1
- data/lib/fhcap/tasks/cluster/provision.rb +3 -3
- data/lib/fhcap/tasks/cluster/status.rb +1 -1
- data/lib/fhcap/tasks/dns/create_record.rb +79 -0
- data/lib/fhcap/tasks/dns/delete_record.rb +55 -0
- data/lib/fhcap/tasks/dns/list.rb +37 -0
- data/lib/fhcap/tasks/dns/route53_helper.rb +48 -0
- data/lib/fhcap/tasks/knife/add.rb +43 -8
- data/lib/fhcap/tasks/repo/checkout.rb +1 -0
- data/lib/fhcap/tasks/task_base.rb +25 -0
- data/lib/fhcap/version.rb +1 -1
- data/spec/fhcap/tasks/dns/create_record_spec.rb +34 -0
- data/spec/fhcap/tasks/dns/delete_record_spec.rb +30 -0
- data/templates/chef/environment_core.json.erb +1 -1
- data/templates/cluster/aws/common.json.erb +1 -1
- data/templates/cluster/aws/core-small-9node.json.erb +3 -3
- data/templates/cluster/aws/single-blank.json.erb +2 -1
- data/templates/cluster/openstack/core-3node.json.erb +1 -1
- data/templates/cluster/openstack/core-small-9node.json.erb +4 -4
- data/templates/cluster/openstack/mbaas-3node.json.erb +2 -2
- data/templates/cluster/openstack/single-blank.json.erb +0 -1
- data/templates/init/knife_local.rb.erb +9 -0
- metadata +19 -4
- data/lib/fhcap/tasks/misc/create_dns_record.rb +0 -100
@@ -45,7 +45,7 @@ module Fhcap
|
|
45
45
|
meta_hash = meta.to_hash().merge({cookbook: name})
|
46
46
|
|
47
47
|
template_filepath = File.join(Fhcap.source_root, 'templates', 'chef', 'cookbook', 'metadata.erb')
|
48
|
-
eruby = Erubis::Eruby.new(File.read(template_filepath))
|
48
|
+
eruby = ::Erubis::Eruby.new(File.read(template_filepath))
|
49
49
|
result = eruby.result(meta_hash)
|
50
50
|
thor.create_file(metadata_filepath, result, {force: true})
|
51
51
|
end
|
@@ -1,33 +1,33 @@
|
|
1
|
-
require 'fhcap/tasks/chef/
|
1
|
+
require 'fhcap/tasks/chef/chef_server_task'
|
2
2
|
|
3
3
|
module Fhcap
|
4
4
|
module Tasks
|
5
5
|
module Chef
|
6
6
|
module Environments
|
7
|
-
class Destroy <
|
7
|
+
class Destroy < ChefServerTask
|
8
8
|
|
9
|
-
attr_reader :name
|
9
|
+
attr_reader :name
|
10
10
|
|
11
11
|
def initialize(options)
|
12
12
|
super
|
13
13
|
@name = options[:name]
|
14
|
-
@repo = options[:repo]
|
15
|
-
@chef_server = options[:chef_server]
|
16
14
|
end
|
17
15
|
|
18
16
|
def run
|
19
17
|
thor.say "Chef::Environments::Destroy #{@name}", :yellow
|
20
18
|
|
21
|
-
if
|
22
|
-
if thor.yes? "Remove all environments and config from the chef server (#{
|
23
|
-
|
24
|
-
|
19
|
+
if chef_server
|
20
|
+
if thor.yes? "Remove all environments and config from the chef server (#{chef_server})?"
|
21
|
+
with_chef_server do
|
22
|
+
run_knife_cmd("environment delete #{@name} -y", chef_server)
|
23
|
+
run_knife_cmd("data bag delete environments #{@name} -y", chef_server)
|
24
|
+
end
|
25
25
|
end
|
26
26
|
end
|
27
27
|
|
28
28
|
thor.remove_file find_data_bag_item('environments', @name)
|
29
29
|
thor.remove_file find_environment(@name)
|
30
|
-
thor.remove_file find_repo_item(repo_clusters_dir(
|
30
|
+
thor.remove_file find_repo_item(repo_clusters_dir(chef_repo), "#{@name}_passwords.json").first
|
31
31
|
end
|
32
32
|
|
33
33
|
end
|
@@ -1,13 +1,14 @@
|
|
1
|
-
require 'fhcap/tasks/chef/
|
1
|
+
require 'fhcap/tasks/chef/chef_server_task'
|
2
|
+
require 'fhcap/tasks/chef/cookbook/archive'
|
2
3
|
require 'fhcap/chef-dk/chef_runner'
|
3
4
|
|
4
5
|
module Fhcap
|
5
6
|
module Tasks
|
6
7
|
module Chef
|
7
8
|
module Provisioning
|
8
|
-
class ChefProvisioningTaskBase <
|
9
|
+
class ChefProvisioningTaskBase < ChefServerTask
|
9
10
|
|
10
|
-
attr_reader :name, :cluster_config, :cluster_filepath
|
11
|
+
attr_reader :name, :cluster_config, :cluster_filepath
|
11
12
|
|
12
13
|
def initialize(options)
|
13
14
|
super
|
@@ -16,17 +17,23 @@ module Fhcap
|
|
16
17
|
if @cluster_filepath
|
17
18
|
@cluster_config = JSON.parse(IO.read(@cluster_filepath), {:symbolize_names => true})
|
18
19
|
@cluster_config.merge!({
|
19
|
-
local_repo_path: repo_dir(@
|
20
|
-
local_repo_clusters_dir: repo_clusters_dir(@
|
21
|
-
chef_server_config: chef_server_config_hash_for(@
|
20
|
+
local_repo_path: repo_dir(@chef_repo),
|
21
|
+
local_repo_clusters_dir: repo_clusters_dir(@chef_repo),
|
22
|
+
chef_server_config: chef_server_config_hash_for(@chef_server),
|
22
23
|
provider_credentials: provider_credentials(@cluster_config[:provider_id])
|
23
24
|
})
|
24
|
-
@chef_server = @cluster_config[:chef_server]
|
25
25
|
else
|
26
26
|
exit_with_error("Unknown cluster #{@name}")
|
27
27
|
end
|
28
28
|
end
|
29
29
|
|
30
|
+
def seed_cookbooks
|
31
|
+
archive_task = Chef::Cookbook::Archive.new(@options.dup.merge({:'skip-repo-checkout' => true}))
|
32
|
+
archive_task.run
|
33
|
+
@cluster_config[:local_cookbook_archive] = archive_task.archive
|
34
|
+
do_chef_run("provision::seed_cookbooks")
|
35
|
+
end
|
36
|
+
|
30
37
|
def do_chef_run(run_list)
|
31
38
|
cookbook_path = File.join(Fhcap.source_root, 'lib', 'cookbooks')
|
32
39
|
private_key_paths = [File.join(cluster_config[:local_repo_path], cluster_config[:local_repo_clusters_dir], 'key_pairs')]
|
@@ -8,9 +8,18 @@ module Fhcap
|
|
8
8
|
|
9
9
|
def run
|
10
10
|
thor.say "Chef::Provisioning::Create #{@name}", :yellow
|
11
|
-
|
12
|
-
|
13
|
-
|
11
|
+
with_chef_server do
|
12
|
+
do_chef_run("provision::cluster_create")
|
13
|
+
|
14
|
+
knife_download(repo_dir(chef_repo), chef_server, ['/nodes']) if local_chef_server?
|
15
|
+
|
16
|
+
unless options[:'skip-provision']
|
17
|
+
seed_cookbooks if local_chef_server?
|
18
|
+
do_chef_run("provision::cluster_provision")
|
19
|
+
do_chef_run("provision::reset_rabbitmq")
|
20
|
+
do_chef_run("provision::restart_services")
|
21
|
+
end
|
22
|
+
end
|
14
23
|
end
|
15
24
|
|
16
25
|
end
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fhcap/tasks/chef/provisioning/chef_provisioning_task_base'
|
2
|
+
require 'fileutils'
|
2
3
|
|
3
4
|
module Fhcap
|
4
5
|
module Tasks
|
@@ -9,8 +10,10 @@ module Fhcap
|
|
9
10
|
def run
|
10
11
|
thor.say "Chef::Provisioning::Destroy #{@name}", :yellow
|
11
12
|
if thor.yes? "Destroy cluster #{@name}? (y/n)"
|
12
|
-
|
13
|
-
|
13
|
+
with_chef_server do
|
14
|
+
run_list = "provision::cluster_destroy"
|
15
|
+
do_chef_run(run_list)
|
16
|
+
end
|
14
17
|
end
|
15
18
|
end
|
16
19
|
|
@@ -8,8 +8,10 @@ module Fhcap
|
|
8
8
|
|
9
9
|
def run
|
10
10
|
thor.say "Chef::Provisioning::Provision #{@name}", :yellow
|
11
|
-
|
12
|
-
|
11
|
+
with_chef_server do
|
12
|
+
seed_cookbooks if local_chef_server?
|
13
|
+
do_chef_run("provision::cluster_provision")
|
14
|
+
end
|
13
15
|
end
|
14
16
|
|
15
17
|
end
|
@@ -1,161 +1,86 @@
|
|
1
|
-
require 'fhcap/tasks/chef/
|
1
|
+
require 'fhcap/tasks/chef/chef_server_task'
|
2
2
|
require 'chef/knife/diff'
|
3
|
+
require 'chef/knife/cookbook_upload'
|
3
4
|
|
4
5
|
module Fhcap
|
5
6
|
module Tasks
|
6
7
|
module Chef
|
7
8
|
module Server
|
8
|
-
class Bootstrap <
|
9
|
+
class Bootstrap < ChefServerTask
|
9
10
|
|
10
11
|
attr_reader :environments
|
11
12
|
|
12
13
|
def initialize(options)
|
13
14
|
super
|
14
15
|
@environments = options[:environments]
|
15
|
-
@chef_server = options[:chef_server]
|
16
|
-
@diff_strategy = options[:'diff-strategy'] || 'knife'
|
17
16
|
@skip_roles = options[:'skip-roles']
|
17
|
+
@skip_nodes = options[:'skip-roles'] || !local_chef_server?
|
18
18
|
@skip_data_bags = options[:'skip-data-bags']
|
19
19
|
@skip_environments = options[:'skip-environments']
|
20
20
|
@skip_cookbooks = options[:'skip-cookbooks']
|
21
21
|
end
|
22
22
|
|
23
23
|
def run
|
24
|
-
thor.say "Chef::Server::Bootstrap: environments = #{environments}", :yellow
|
25
|
-
|
26
|
-
|
27
|
-
|
28
|
-
|
29
|
-
|
30
|
-
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
-
|
24
|
+
thor.say "Chef::Server::Bootstrap: environments = #{environments}, server = #{chef_server}", :yellow
|
25
|
+
with_chef_server do
|
26
|
+
repos.each do |repo|
|
27
|
+
repo_path = repo_dir(repo)
|
28
|
+
|
29
|
+
upload_patterns = []
|
30
|
+
upload_patterns << '/roles' unless @skip_roles
|
31
|
+
upload_patterns << '/nodes' unless @skip_nodes
|
32
|
+
upload_patterns |= environments.collect { |env| ["/environments/#{env}*", "/data_bags/environments/#{env}*"] } unless @skip_environments
|
33
|
+
upload_patterns |= data_bag_pattern_for(repo_path, environments) unless @skip_data_bags
|
34
|
+
upload_patterns.flatten!
|
35
|
+
|
36
|
+
knife_upload(repo_path, chef_server, upload_patterns)
|
37
|
+
end
|
38
|
+
knife_upload_cookbooks(chef_server)
|
38
39
|
end
|
39
40
|
end
|
40
41
|
|
41
42
|
private
|
42
43
|
|
43
|
-
def
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
-
|
48
|
-
|
49
|
-
|
50
|
-
end
|
51
|
-
end
|
52
|
-
|
53
|
-
def sync_data_bags(options, bag_created_cache=[])
|
54
|
-
requires_resync = false
|
55
|
-
sync_items('data_bags', options) do |local_repo, sync_items|
|
56
|
-
sync_items.each do |item|
|
57
|
-
if include_data_bag_item?(item, options)
|
58
|
-
tmp, bag, bag_item = item.split('/')
|
59
|
-
if bag
|
60
|
-
unless bag_created_cache.include? bag
|
61
|
-
output = run_knife_cmd("data bag create #{bag}", options[:server])
|
62
|
-
requires_resync = requires_resync || output =~ /Created/
|
63
|
-
bag_created_cache << bag
|
64
|
-
end
|
65
|
-
if bag_item
|
66
|
-
run_knife_cmd("data bag from file #{bag} #{File.join(local_repo, item)}", options[:server])
|
67
|
-
end
|
68
|
-
end
|
44
|
+
def data_bag_pattern_for(repo_path, environments)
|
45
|
+
pattern = []
|
46
|
+
data_bags_path = File.join(repo_path, 'data_bags')
|
47
|
+
if Dir.exists? data_bags_path
|
48
|
+
Dir[File.join(data_bags_path, '*')].map { |a| File.basename(a) }.each do |name|
|
49
|
+
if include_data_bag?(name, environments)
|
50
|
+
pattern << "/data_bags/#{name}"
|
69
51
|
end
|
70
52
|
end
|
71
53
|
end
|
72
|
-
|
54
|
+
pattern
|
73
55
|
end
|
74
56
|
|
75
|
-
def
|
57
|
+
def include_data_bag?(name, environments)
|
76
58
|
include = true
|
77
|
-
|
78
|
-
|
79
|
-
if
|
80
|
-
|
81
|
-
|
82
|
-
#
|
83
|
-
|
84
|
-
allowed = ['fheng', 'production']
|
85
|
-
allowed |= environments
|
86
|
-
allowed |= environments.collect { |env| env.gsub('-', '_') } # Prod data bags are named incorrectly for some reason
|
87
|
-
include = allowed.any? { |val| nagios_data_bag_name =~ /#{val}/ }
|
88
|
-
end
|
89
|
-
elsif item =~ /environments\//
|
90
|
-
include = environments.any? { |val| item =~ /#{val}/ }
|
59
|
+
if name =~ /nagios_/
|
60
|
+
#Default nagios data bags will only be 2 in length, check everything else
|
61
|
+
if name.split('_').length > 2
|
62
|
+
allowed = ['fheng', 'production']
|
63
|
+
allowed |= environments
|
64
|
+
allowed |= environments.collect { |env| env.gsub('-', '_') } # Prod data bags are named incorrectly for some reason
|
65
|
+
include = allowed.any? { |val| name =~ /#{val}/ }
|
91
66
|
end
|
67
|
+
elsif name =~ /environments/
|
68
|
+
include = false
|
92
69
|
end
|
93
70
|
include
|
94
71
|
end
|
95
72
|
|
96
|
-
def
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
105
|
-
|
106
|
-
else
|
107
|
-
#thor.say "No environments specified!!"
|
108
|
-
end
|
109
|
-
end
|
110
|
-
|
111
|
-
def sync_cookbooks(options)
|
112
|
-
#sync_items('cookbooks', options) do |local_repo, sync_items|
|
113
|
-
# modified_cookbooks = sync_items.collect do |cookbook|
|
114
|
-
# cookbook.split('/')[1]
|
115
|
-
# end.uniq
|
116
|
-
# run_knife_cmd("cookbook upload #{modified_cookbooks.join(' ')} --force", options[:server]) unless modified_cookbooks.empty?
|
117
|
-
#end
|
118
|
-
run_knife_cmd("cookbook upload -a --force", options[:server], !verbose)
|
119
|
-
end
|
120
|
-
|
121
|
-
def sync_items(item, options)
|
122
|
-
repo_paths.each do |local_repo|
|
123
|
-
#thor.say "Syncing #{item} in #{local_repo} based on #{@diff_strategy} diff", :yellow
|
124
|
-
if @diff_strategy == 'git'
|
125
|
-
item = %w{cookbooks site-cookbooks wrapper-cookbooks} if item == 'cookbooks'
|
126
|
-
yield local_repo, git_diff(item, local_repo)
|
127
|
-
else
|
128
|
-
yield local_repo, knife_diff(item, local_repo, options[:server])
|
129
|
-
end
|
130
|
-
end
|
131
|
-
#thor.say "All #{item} synced successfully!"
|
132
|
-
end
|
133
|
-
|
134
|
-
def git_diff(item, local_repo)
|
135
|
-
result = ''
|
136
|
-
Dir.chdir local_repo do
|
137
|
-
paths = item.is_a?(Array) ? item : [item]
|
138
|
-
paths.each do |path|
|
139
|
-
if Dir.exists? File.join(local_repo, path)
|
140
|
-
result += `git diff --name-only origin/master -- #{path}`
|
141
|
-
end
|
142
|
-
end
|
143
|
-
end
|
144
|
-
result.split
|
145
|
-
end
|
146
|
-
|
147
|
-
def knife_diff(item, local_repo, server)
|
148
|
-
result = ''
|
149
|
-
if Dir.exists? File.join(local_repo, item)
|
150
|
-
thor.inside local_repo do
|
151
|
-
cmd = "knife diff #{item} --chef-repo-path #{local_repo} --repo-mode static --name-only --diff-filter=[AM] --config #{knife_config_file_for(server)}"
|
152
|
-
result = thor.run(cmd, :capture => true)
|
153
|
-
thor.say result if verbose
|
154
|
-
end
|
155
|
-
else
|
156
|
-
#thor.say "No #{item} in #{local_repo}"
|
73
|
+
def knife_upload_cookbooks(server)
|
74
|
+
knife_config_file = knife_config_file_for(server)
|
75
|
+
thor.say " * uploading cookbooks from #{knife_config_file} ..."
|
76
|
+
suppress_stdout(!options[:verbose], !options[:verbose]) do
|
77
|
+
::Chef::Knife::CookbookUpload.load_deps
|
78
|
+
knife_command = ::Chef::Knife::CookbookUpload.new
|
79
|
+
knife_command.config[:config_file] = knife_config_file
|
80
|
+
knife_command.configure_chef
|
81
|
+
knife_command.config[:all] = true
|
82
|
+
knife_command.run
|
157
83
|
end
|
158
|
-
result.split
|
159
84
|
end
|
160
85
|
|
161
86
|
end
|
@@ -1,27 +1,28 @@
|
|
1
|
-
require 'fhcap/tasks/chef/
|
1
|
+
require 'fhcap/tasks/chef/chef_server_task'
|
2
2
|
|
3
3
|
module Fhcap
|
4
4
|
module Tasks
|
5
5
|
module Chef
|
6
6
|
module Server
|
7
|
-
class Info <
|
7
|
+
class Info < ChefServerTask
|
8
8
|
|
9
|
-
attr_reader :environments, :node_names, :roles, :
|
9
|
+
attr_reader :environments, :node_names, :roles, :urls
|
10
10
|
|
11
11
|
def initialize(options)
|
12
12
|
super
|
13
13
|
@environments = options[:environments]
|
14
14
|
@node_names = options[:nodes]
|
15
15
|
@roles = options[:roles]
|
16
|
-
@chef_server = options[:chef_server]
|
17
16
|
@urls = {}
|
18
17
|
end
|
19
18
|
|
20
19
|
def run
|
21
20
|
thor.say "Chef::Server::Info: environments = #{environments}", :yellow
|
22
|
-
|
23
|
-
|
24
|
-
|
21
|
+
with_chef_server do
|
22
|
+
environments.each do |env|
|
23
|
+
ip_addresses(env) unless options[:only] && options[:only] != 'ips'
|
24
|
+
management_dashboards(env) unless options[:only] && options[:only] != 'urls'
|
25
|
+
end
|
25
26
|
end
|
26
27
|
end
|
27
28
|
|
@@ -1,10 +1,10 @@
|
|
1
|
-
require 'fhcap/tasks/chef/
|
1
|
+
require 'fhcap/tasks/chef/chef_server_task'
|
2
2
|
|
3
3
|
module Fhcap
|
4
4
|
module Tasks
|
5
5
|
module Chef
|
6
6
|
module Server
|
7
|
-
class Provision <
|
7
|
+
class Provision < ChefServerTask
|
8
8
|
|
9
9
|
attr_reader :environments, :node_names, :roles
|
10
10
|
|
@@ -13,27 +13,27 @@ module Fhcap
|
|
13
13
|
@environments = options[:environments]
|
14
14
|
@node_names = options[:nodes]
|
15
15
|
@roles = options[:roles]
|
16
|
-
@chef_server = options[:chef_server]
|
17
16
|
end
|
18
17
|
|
19
18
|
def run
|
20
19
|
thor.say "Chef::Server::Provision: environments = #{environments}", :yellow
|
21
20
|
|
22
|
-
|
23
|
-
|
24
|
-
chef_server = select_chef_server(environment, @chef_server)
|
25
|
-
chef_server_environments[chef_server] = chef_server_environments[chef_server] || []
|
26
|
-
chef_server_environments[chef_server] << environment
|
27
|
-
end
|
28
|
-
|
29
|
-
chef_server_environments.each do |server, environments|
|
21
|
+
with_chef_server do
|
22
|
+
chef_server_environments = {}
|
30
23
|
environments.each do |environment|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
36
|
-
|
24
|
+
chef_server_environments[chef_server] = chef_server_environments[chef_server] || []
|
25
|
+
chef_server_environments[chef_server] << environment
|
26
|
+
end
|
27
|
+
|
28
|
+
chef_server_environments.each do |server, environments|
|
29
|
+
environments.each do |environment|
|
30
|
+
query = ["chef_environment:#{environment}"]
|
31
|
+
query << "AND name:#{node_names}" if node_names
|
32
|
+
query << "AND roles:#{roles}" if roles
|
33
|
+
query = query.join(' ')
|
34
|
+
cmd = "sudo chef-client"
|
35
|
+
run_knife_ssh_cmd(query, cmd, server, options)
|
36
|
+
end
|
37
37
|
end
|
38
38
|
end
|
39
39
|
end
|
@@ -0,0 +1,16 @@
|
|
1
|
+
require 'fhcap/tasks/cluster/cluster_task_base'
|
2
|
+
require 'fhcap/tasks/chef/provisioning/chef_provisioning_task'
|
3
|
+
|
4
|
+
module Fhcap
|
5
|
+
module Tasks
|
6
|
+
module Cluster
|
7
|
+
class ChefProvisioningTask < ClusterTaskBase
|
8
|
+
|
9
|
+
def run
|
10
|
+
Tasks::Chef::Provisioning::ChefProvisioningTask.new(@options.dup.merge(chef_task_options)).run
|
11
|
+
end
|
12
|
+
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
@@ -23,6 +23,14 @@ module Fhcap
|
|
23
23
|
end
|
24
24
|
end
|
25
25
|
|
26
|
+
def chef_task_options
|
27
|
+
{
|
28
|
+
:'chef-server' => cluster_config[:chef_server],
|
29
|
+
:'chef-repo' => cluster_config[:repo],
|
30
|
+
:repos => ['fhcap', cluster_config[:repo]].uniq
|
31
|
+
}
|
32
|
+
end
|
33
|
+
|
26
34
|
def template_as_object(template_file, config)
|
27
35
|
template = File.read(template_file)
|
28
36
|
eruby = Erubis::Eruby.new(template)
|
@@ -5,7 +5,7 @@ require 'fhcap/tasks/chef/environments/promote_cookbooks'
|
|
5
5
|
require 'fhcap/tasks/chef/environments/create'
|
6
6
|
require 'fhcap/tasks/chef/server/bootstrap'
|
7
7
|
require 'fhcap/tasks/repo/checkout'
|
8
|
-
require "fhcap/tasks/
|
8
|
+
require "fhcap/tasks/dns/create_record"
|
9
9
|
|
10
10
|
module Fhcap
|
11
11
|
module Tasks
|
@@ -30,6 +30,7 @@ module Fhcap
|
|
30
30
|
@skip_server_bootstrap = options[:'skip-server-bootstrap']
|
31
31
|
@skip_dns_record = options[:'skip-dns-record']
|
32
32
|
@skip_create = options[:'skip-create']
|
33
|
+
@skip_provision = options[:'skip-provision']
|
33
34
|
|
34
35
|
@cluster_config = {
|
35
36
|
id: @name,
|
@@ -66,10 +67,10 @@ module Fhcap
|
|
66
67
|
Chef::Environments::PromoteCookbooks.new(@options.dup.merge({:environments => cluster_environments})).run unless @skip_cookbook_promote
|
67
68
|
|
68
69
|
#Bootstrap Server
|
69
|
-
Chef::Server::Bootstrap.new(@options.dup.merge({:environments => cluster_environments
|
70
|
+
Chef::Server::Bootstrap.new(@options.dup.merge(chef_task_options.merge({:environments => cluster_environments}))).run unless @skip_server_bootstrap
|
70
71
|
|
71
72
|
#Provisioning create
|
72
|
-
Chef::Provisioning::Create.new(options).run unless @skip_create
|
73
|
+
Chef::Provisioning::Create.new(@options.dup.merge(chef_task_options)).run unless @skip_create
|
73
74
|
|
74
75
|
create_dns_record unless @skip_dns_record
|
75
76
|
end
|
@@ -188,7 +189,7 @@ module Fhcap
|
|
188
189
|
hosted_zone_id: elb.canonical_hosted_zone_name_id
|
189
190
|
}
|
190
191
|
}
|
191
|
-
|
192
|
+
Dns::CreateRecord.new(@options.dup.merge(dns_record_cfg)).run
|
192
193
|
rescue Aws::ElasticLoadBalancing::Errors::LoadBalancerNotFound => e
|
193
194
|
thor.say_status 'error', "LoadBalancer #{lb} not found, unable to create DNS Entry", :red
|
194
195
|
rescue Aws::ElasticLoadBalancing::Errors::ServiceError => e
|
@@ -216,7 +217,7 @@ module Fhcap
|
|
216
217
|
domain: "*.#{env_cfg[:domain]}",
|
217
218
|
ipaddress: lb_node['cloud.public_ipv4']
|
218
219
|
}
|
219
|
-
|
220
|
+
Dns::CreateRecord.new(@options.dup.merge(dns_record_cfg)).run
|
220
221
|
else
|
221
222
|
thor.say "Found lb node '#{lb_node['name']}', but was unable to retrieve it's IP!!}"
|
222
223
|
end
|
@@ -1,6 +1,7 @@
|
|
1
1
|
require 'fhcap/tasks/cluster/cluster_task_base'
|
2
2
|
require 'fhcap/tasks/chef/provisioning/destroy'
|
3
3
|
require 'fhcap/tasks/chef/environments/destroy'
|
4
|
+
require 'fhcap/tasks/dns/delete_record'
|
4
5
|
|
5
6
|
module Fhcap
|
6
7
|
module Tasks
|
@@ -8,20 +9,30 @@ module Fhcap
|
|
8
9
|
class Destroy < ClusterTaskBase
|
9
10
|
|
10
11
|
def initialize(options)
|
11
|
-
super
|
12
|
+
super
|
12
13
|
@skip_destroy = options[:'skip-destroy']
|
13
14
|
end
|
14
15
|
|
15
16
|
def run
|
16
17
|
thor.say "Cluster::Destroy: name = #{@name}", :yellow
|
17
|
-
Chef::Provisioning::Destroy.new(options).run unless @skip_destroy
|
18
|
+
Chef::Provisioning::Destroy.new(@options.dup.merge(chef_task_options)).run unless @skip_destroy
|
18
19
|
|
19
|
-
if thor.yes? "Delete all local repo files?"
|
20
|
+
if thor.yes? "Delete all local repo files? (y/n)"
|
20
21
|
cluster_environments.each do |env_name, cfg|
|
21
|
-
Chef::Environments::Destroy.new(@options.dup.merge({:name => env_name
|
22
|
+
Chef::Environments::Destroy.new(@options.dup.merge({:name => env_name}.merge(chef_task_options))).run
|
22
23
|
end
|
23
24
|
thor.remove_file find_cluster(@name)
|
24
25
|
end
|
26
|
+
|
27
|
+
if thor.yes? "Delete all DNS entries? (y/n)"
|
28
|
+
@cluster_config[:environments].each do |env_name, cfg|
|
29
|
+
if cfg[:domain]
|
30
|
+
domain = ['*', cfg[:domain]].join('.')
|
31
|
+
Dns::DeleteRecord.new(@options.dup.merge({:domain => domain})).run
|
32
|
+
end
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
25
36
|
end
|
26
37
|
|
27
38
|
end
|
@@ -19,7 +19,7 @@ module Fhcap
|
|
19
19
|
cluster_config[:environments].delete environment_name.to_sym
|
20
20
|
thor.create_file(cluster_file, JSON.pretty_generate(cluster_config), force: true)
|
21
21
|
|
22
|
-
Chef::Environments::Destroy.new(@options.dup.merge({:name => environment_name
|
22
|
+
Chef::Environments::Destroy.new(@options.dup.merge({:name => environment_name}.merge(chef_task_options))).run
|
23
23
|
end
|
24
24
|
|
25
25
|
end
|
@@ -26,7 +26,7 @@ module Fhcap
|
|
26
26
|
|
27
27
|
def run
|
28
28
|
thor.say "Cluster::Info: name = #{@name}", :yellow
|
29
|
-
info_task = Chef::Server::Info.new(@options.dup.merge({:environments => cluster_environments
|
29
|
+
info_task = Chef::Server::Info.new(@options.dup.merge({:environments => cluster_environments}.merge(chef_task_options)))
|
30
30
|
info_task.run
|
31
31
|
cluster_environments.each do |env|
|
32
32
|
passwords(env) unless options[:only] && options[:only] != 'passwords'
|
@@ -28,12 +28,12 @@ module Fhcap
|
|
28
28
|
thor.say "Cluster::Provision: name = #{name}, strategy = #{strategy}", :yellow
|
29
29
|
checkout_repos unless @skip_repo_checkout
|
30
30
|
Chef::Environments::PromoteCookbooks.new(@options.dup.merge({:environments => cluster_environments})).run unless @skip_cookbook_promote
|
31
|
-
Chef::Server::Bootstrap.new(@options.dup.merge({:environments => cluster_environments
|
31
|
+
Chef::Server::Bootstrap.new(@options.dup.merge({:environments => cluster_environments}.merge(chef_task_options))).run unless @skip_server_bootstrap
|
32
32
|
unless @skip_provision
|
33
33
|
if strategy == 'chef'
|
34
|
-
Chef::Provisioning::Provision.new(@options).run
|
34
|
+
Chef::Provisioning::Provision.new(@options.dup.merge(chef_task_options)).run
|
35
35
|
elsif strategy == 'knife'
|
36
|
-
Chef::Server::Provision.new(@options.dup.merge({:environments => cluster_environments
|
36
|
+
Chef::Server::Provision.new(@options.dup.merge({:environments => cluster_environments}.merge(chef_task_options))).run
|
37
37
|
else
|
38
38
|
thor.say_status :error, "Unsupported provision strategy #{strategy}"
|
39
39
|
end
|
@@ -8,7 +8,7 @@ module Fhcap
|
|
8
8
|
|
9
9
|
def run
|
10
10
|
thor.say "Cluster::Status: name = #{@name}", :yellow
|
11
|
-
Tasks::Chef::Provisioning::ChefProvisioningTask.new(@options.dup.merge({:'run-list' => 'recipe[provision::cluster_status]'})).run
|
11
|
+
Tasks::Chef::Provisioning::ChefProvisioningTask.new(@options.dup.merge({:'run-list' => 'recipe[provision::cluster_status]'}.merge(chef_task_options))).run
|
12
12
|
end
|
13
13
|
|
14
14
|
end
|