fhcap-cli 0.4.2 → 0.4.3
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/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
|