fhcap-cli 0.4.6 → 0.4.7
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +4 -4
- data/CHANGELOG.md +6 -0
- data/lib/cookbooks/provision/libraries/provision.rb +3 -4
- data/lib/cookbooks/provision/recipes/aws.rb +4 -1
- data/lib/cookbooks/provision/recipes/aws_cluster_create.rb +37 -30
- data/lib/cookbooks/provision/recipes/aws_cluster_create_eip.rb +19 -0
- data/lib/cookbooks/provision/recipes/aws_cluster_destroy.rb +20 -15
- data/lib/cookbooks/provision/recipes/aws_cluster_destroy_eip.rb +15 -0
- data/lib/cookbooks/provision/recipes/ose_install.rb +25 -0
- data/lib/cookbooks/provision/recipes/ose_post_install.rb +30 -0
- data/lib/fhcap/knife_helper.rb +118 -0
- data/lib/fhcap/tasks/chef/chef_server_task.rb +4 -108
- data/lib/fhcap/tasks/chef/environments/create.rb +1 -0
- data/lib/fhcap/tasks/chef/provisioning/create.rb +2 -1
- data/lib/fhcap/tasks/cluster/create_dns_records.rb +30 -12
- data/lib/fhcap/tasks/cluster/create_environment.rb +2 -1
- data/lib/fhcap/tasks/cluster/generate.rb +20 -6
- data/lib/fhcap/version.rb +1 -1
- data/lib/fhcap.rb +1 -1
- data/templates/chef/environment_ose-single.json.erb +30 -0
- data/templates/cluster/aws/common.json.erb +7 -1
- data/templates/cluster/aws/ose-single.json.erb +78 -0
- data/templates/cluster/aws/single.json.erb +0 -13
- data/templates/cluster/openstack/ose-single.json.erb +11 -0
- data/templates/cluster/ose-single.json.erb +8 -0
- metadata +11 -3
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA1:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 7442c785069713ce88491a3c794e162190f0d168
|
4
|
+
data.tar.gz: c84d4ad6ef141c6204822b10bf7ff022b18491c3
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: bd8af02970b9092f546fe75419c14e65b0c1ecc665a6071ad89108a968c4f78f0fdb61a2d2426bb30941e90bb4bc112e233d85c360f20a4c335a734c106f0850
|
7
|
+
data.tar.gz: 3aacd843308e099f9c8e302f27eead3776410727e62b636acbe7fd00ae4b2ba19f932e68939346aa7fc0aee49788151b97a70f7e543cb51e2ce4eb79f61f5975
|
data/CHANGELOG.md
CHANGED
@@ -1,4 +1,10 @@
|
|
1
1
|
|
2
|
+
## 0.4.7
|
3
|
+
|
4
|
+
* [RHMAP-6559] - Add ose-single template for AWS and OpenStack, creates a single node OpenShift Enterprise 3 instance.
|
5
|
+
* Make VPC optional on AWS clusters, will use the default VPC for the region if not specified.
|
6
|
+
* Removed self signed SSL cert creation during cluster generate.
|
7
|
+
|
2
8
|
## 0.4.6
|
3
9
|
|
4
10
|
* [RHMAP-3031] - Add aws-tags (Name, Organisationm, Environment and Role) to all instances
|
@@ -54,13 +54,12 @@ def aws_bootstrap_options(org_name, environment, instance_options)
|
|
54
54
|
image_id: instance_options[:image_id],
|
55
55
|
instance_type: instance_options[:instance_type],
|
56
56
|
key_name: key_pair_name_for(org_name)
|
57
|
-
#key_path: "~/.chef/keys/chef_default"
|
58
57
|
}
|
59
|
-
bootstrap_options[:subnet] = subnet_name_for(org_name, environment, instance_options[:subnet])
|
58
|
+
bootstrap_options[:subnet] = subnet_name_for(org_name, environment, instance_options[:subnet]) if instance_options[:subnet]
|
60
59
|
bootstrap_options[:security_group_ids] = instance_options[:security_groups].collect do |security_group|
|
61
60
|
security_group_name_for(org_name, security_group)
|
62
|
-
end
|
63
|
-
bootstrap_options[:block_device_mappings] = instance_options[:block_device_mappings]
|
61
|
+
end if instance_options[:security_groups]
|
62
|
+
bootstrap_options[:block_device_mappings] = instance_options[:block_device_mappings] if instance_options[:block_device_mappings]
|
64
63
|
bootstrap_options
|
65
64
|
end
|
66
65
|
|
@@ -4,7 +4,10 @@ require 'chef/provisioning/aws_driver'
|
|
4
4
|
require 'extensions/chef/provisioning/aws_driver/driver.rb'
|
5
5
|
|
6
6
|
cluster_config = cluster_config_for(node)
|
7
|
-
|
7
|
+
|
8
|
+
raise "Missing aws region" unless cluster_config[:provider_config][:region]
|
9
|
+
|
10
|
+
region = cluster_config[:provider_config][:region]
|
8
11
|
with_driver("aws:default:#{region}", {
|
9
12
|
:aws_credentials => {
|
10
13
|
"default" => {
|
@@ -12,53 +12,60 @@ aws_key_pair key_pair_name do
|
|
12
12
|
public_key_path File.join(local_key_pairs_dir, "#{key_pair_name}.pub")
|
13
13
|
end
|
14
14
|
|
15
|
+
vpc_name = nil
|
16
|
+
if cluster_config[:vpc]
|
15
17
|
#Create VPC
|
16
|
-
vpc_name = vpc_name_for(org_name)
|
18
|
+
vpc_name = vpc_name_for(org_name)
|
17
19
|
|
18
|
-
aws_vpc vpc_name do
|
19
|
-
|
20
|
-
|
21
|
-
|
20
|
+
aws_vpc vpc_name do
|
21
|
+
cidr_block cluster_config[:vpc][:cidr]
|
22
|
+
internet_gateway true
|
23
|
+
main_routes '0.0.0.0/0' => :internet_gateway
|
24
|
+
end
|
22
25
|
end
|
23
26
|
|
27
|
+
if cluster_config[:security_groups]
|
24
28
|
# Create Security Groups with empty rules first to avoid group dependent rule conflicts
|
25
|
-
cluster_config[:security_groups].each do |sg_name, sg_config|
|
26
|
-
|
27
|
-
|
29
|
+
cluster_config[:security_groups].each do |sg_name, sg_config|
|
30
|
+
aws_security_group security_group_name_for(org_name, sg_name) do
|
31
|
+
vpc vpc_name
|
32
|
+
end
|
28
33
|
end
|
29
|
-
end
|
30
34
|
|
31
|
-
|
32
|
-
|
33
|
-
|
34
|
-
|
35
|
-
|
35
|
+
cluster_config[:security_groups].each do |sg_name, sg_config|
|
36
|
+
aws_security_group security_group_name_for(org_name, sg_name) do
|
37
|
+
vpc vpc_name
|
38
|
+
inbound_rules inbound_rules_for(org_name, sg_config[:authorize_ingress])
|
39
|
+
end
|
36
40
|
end
|
37
41
|
end
|
38
42
|
|
43
|
+
if vpc_name
|
39
44
|
# Create Route Tables
|
40
|
-
cluster_config[:environments].each do |env, env_config|
|
45
|
+
cluster_config[:environments].each do |env, env_config|
|
41
46
|
|
42
|
-
|
43
|
-
|
44
|
-
|
45
|
-
|
46
|
-
|
47
|
+
env_route_table = route_table_name_for(org_name, env)
|
48
|
+
aws_route_table env_route_table do
|
49
|
+
vpc vpc_name
|
50
|
+
routes '0.0.0.0/0' => :internet_gateway
|
51
|
+
end
|
47
52
|
|
48
|
-
|
53
|
+
env_config[:subnets].each do |subnet_suffix, subnet_config|
|
54
|
+
|
55
|
+
subnet_name = subnet_name_for(org_name, env, subnet_suffix)
|
56
|
+
aws_subnet subnet_name do
|
57
|
+
vpc vpc_name
|
58
|
+
cidr_block subnet_config[:cidr]
|
59
|
+
availability_zone subnet_config[:availability_zone]
|
60
|
+
route_table env_route_table
|
61
|
+
map_public_ip_on_launch true
|
62
|
+
end
|
49
63
|
|
50
|
-
subnet_name = subnet_name_for(org_name, env, subnet_suffix)
|
51
|
-
aws_subnet subnet_name do
|
52
|
-
vpc vpc_name
|
53
|
-
cidr_block subnet_config[:cidr]
|
54
|
-
availability_zone subnet_config[:availability_zone]
|
55
|
-
route_table env_route_table
|
56
|
-
map_public_ip_on_launch true
|
57
64
|
end
|
58
65
|
|
59
66
|
end
|
60
|
-
|
61
67
|
end
|
62
68
|
|
63
69
|
include_recipe "provision::cluster_create_instances"
|
64
|
-
include_recipe "provision::aws_cluster_create_elb"
|
70
|
+
include_recipe "provision::aws_cluster_create_elb"
|
71
|
+
include_recipe "provision::aws_cluster_create_eip"
|
@@ -0,0 +1,19 @@
|
|
1
|
+
include_recipe 'provision::common'
|
2
|
+
include_recipe "provision::aws"
|
3
|
+
|
4
|
+
with_cluster_instances(node) do |cluster_instances|
|
5
|
+
cluster_instances.each do |chef_environment, instances|
|
6
|
+
with_chef_environment chef_environment do
|
7
|
+
|
8
|
+
instances.each do |name, cfg|
|
9
|
+
|
10
|
+
aws_eip_address "#{name}-eip" do
|
11
|
+
machine name
|
12
|
+
associate_to_vpc true
|
13
|
+
end
|
14
|
+
|
15
|
+
end
|
16
|
+
|
17
|
+
end
|
18
|
+
end
|
19
|
+
end
|
@@ -5,6 +5,7 @@ cluster_config = cluster_config_for(node)
|
|
5
5
|
|
6
6
|
org_name = cluster_config[:id]
|
7
7
|
|
8
|
+
include_recipe "provision::aws_cluster_destroy_eip"
|
8
9
|
include_recipe "provision::cluster_destroy_instances"
|
9
10
|
|
10
11
|
cluster_config[:environments].each do |env, env_config|
|
@@ -16,24 +17,28 @@ cluster_config[:environments].each do |env, env_config|
|
|
16
17
|
end if env_config[:load_balancers]
|
17
18
|
end
|
18
19
|
|
19
|
-
|
20
|
-
|
21
|
-
|
22
|
-
|
23
|
-
|
24
|
-
end
|
20
|
+
if cluster_config[:security_groups]
|
21
|
+
# Clear all rules from Security Groups so that all dependent objects are cleared. This can potentially re-create security groups, so we have to force the destroy again below.
|
22
|
+
cluster_config[:security_groups].each do |sg_name, sg_config|
|
23
|
+
aws_security_group security_group_name_for(org_name, sg_name) do
|
24
|
+
inbound_rules []
|
25
|
+
end
|
26
|
+
end if cluster_config[:security_groups]
|
25
27
|
|
26
|
-
# Destroy all security groups. vpc purge would do this, but since we could have potentially re-created the group above, we do it here to be sure its removed.
|
27
|
-
cluster_config[:security_groups].each do |sg_name, sg_config|
|
28
|
-
|
29
|
-
|
30
|
-
|
28
|
+
# Destroy all security groups. vpc purge would do this, but since we could have potentially re-created the group above, we do it here to be sure its removed.
|
29
|
+
cluster_config[:security_groups].each do |sg_name, sg_config|
|
30
|
+
aws_security_group security_group_name_for(org_name, sg_name) do
|
31
|
+
action :destroy
|
32
|
+
ignore_failure true
|
33
|
+
end
|
31
34
|
end
|
32
35
|
end
|
33
36
|
|
34
|
-
|
35
|
-
|
36
|
-
|
37
|
+
if cluster_config[:vpc]
|
38
|
+
vpc_name = vpc_name_for(org_name)
|
39
|
+
aws_vpc vpc_name do
|
40
|
+
action :purge
|
41
|
+
end
|
37
42
|
end
|
38
43
|
|
39
44
|
cluster_config[:environments].each do |env, env_config|
|
@@ -45,7 +50,7 @@ cluster_config[:environments].each do |env, env_config|
|
|
45
50
|
aws_subnet subnet_name_for(org_name, env, subnet_suffix) do
|
46
51
|
action :destroy
|
47
52
|
end
|
48
|
-
end
|
53
|
+
end if env_config[:subnets]
|
49
54
|
end
|
50
55
|
|
51
56
|
aws_key_pair key_pair_name_for(org_name) do
|
@@ -0,0 +1,15 @@
|
|
1
|
+
include_recipe 'provision::common'
|
2
|
+
include_recipe "provision::aws"
|
3
|
+
|
4
|
+
with_cluster_instances(node) do |cluster_instances|
|
5
|
+
cluster_instances.each do |chef_environment, instances|
|
6
|
+
with_chef_environment chef_environment do
|
7
|
+
|
8
|
+
instances.each do |name, cfg|
|
9
|
+
aws_eip_address "#{name}-eip" do
|
10
|
+
action :destroy
|
11
|
+
end
|
12
|
+
end
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
@@ -0,0 +1,25 @@
|
|
1
|
+
include_recipe 'provision::common'
|
2
|
+
include_recipe "provision::#{node['driver']}"
|
3
|
+
|
4
|
+
cluster_config = cluster_config_for(node)
|
5
|
+
org_name = cluster_config[:id]
|
6
|
+
|
7
|
+
cluster_config[:environments].each do |env, env_config|
|
8
|
+
chef_environment = fh_name_for(org_name, env)
|
9
|
+
|
10
|
+
installer_node = search(:node, "recipes:openshift\\:\\:installer AND chef_environment:#{chef_environment}").first
|
11
|
+
|
12
|
+
with_chef_environment chef_environment do
|
13
|
+
|
14
|
+
machine_execute "#{installer_node.name} run ose installer" do
|
15
|
+
command "su hadmin -c 'yes '' | atomic-openshift-installer --unattended --configuration /home/hadmin/.config/openshift/installer.cfg.yml install --force'"
|
16
|
+
live_stream true
|
17
|
+
machine installer_node.name
|
18
|
+
only_if { installer_node }
|
19
|
+
end
|
20
|
+
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
|
25
|
+
include_recipe 'provision::ose_post_install'
|
@@ -0,0 +1,30 @@
|
|
1
|
+
include_recipe 'provision::common'
|
2
|
+
include_recipe "provision::#{node['driver']}"
|
3
|
+
|
4
|
+
cluster_config = cluster_config_for(node)
|
5
|
+
org_name = cluster_config[:id]
|
6
|
+
|
7
|
+
cluster_config[:environments].each do |env, env_config|
|
8
|
+
chef_environment = fh_name_for(org_name, env)
|
9
|
+
|
10
|
+
installer_node = search(:node, "recipes:openshift\\:\\:installer AND chef_environment:#{chef_environment}").first
|
11
|
+
|
12
|
+
if installer_node
|
13
|
+
with_chef_environment chef_environment do
|
14
|
+
machine_execute "#{installer_node.name} create registry" do
|
15
|
+
command "oadm registry --service-account=registry --credentials=/etc/origin/master/openshift-registry.kubeconfig --images='registry.access.redhat.com/openshift3/ose-${component}:${version}'"
|
16
|
+
live_stream true
|
17
|
+
machine installer_node.name
|
18
|
+
only_if { installer_node }
|
19
|
+
end
|
20
|
+
|
21
|
+
machine_execute "#{installer_node.name} create router" do
|
22
|
+
command "oadm router default-router --service-account=router --credentials='/etc/origin/master/openshift-router.kubeconfig' --images='registry.access.redhat.com/openshift3/ose-${component}:${version}'"
|
23
|
+
live_stream true
|
24
|
+
machine installer_node.name
|
25
|
+
only_if { installer_node }
|
26
|
+
end
|
27
|
+
end
|
28
|
+
end
|
29
|
+
|
30
|
+
end
|
data/lib/fhcap/knife_helper.rb
CHANGED
@@ -1,3 +1,8 @@
|
|
1
|
+
require 'chef'
|
2
|
+
require 'chef/knife'
|
3
|
+
require 'fhcap/tasks/chef/chef_zero_server'
|
4
|
+
require 'chef/knife/upload'
|
5
|
+
require 'chef/knife/download'
|
1
6
|
require 'chef/config'
|
2
7
|
|
3
8
|
module Fhcap
|
@@ -34,5 +39,118 @@ module Fhcap
|
|
34
39
|
}
|
35
40
|
end
|
36
41
|
|
42
|
+
def with_chef_server(cfg, &block)
|
43
|
+
::Chef::Config.solo = false
|
44
|
+
if local_chef_server? cfg
|
45
|
+
with_local_chef_server(repo_dir(cfg[:repo]), &block)
|
46
|
+
else
|
47
|
+
block.call
|
48
|
+
end
|
49
|
+
end
|
50
|
+
|
51
|
+
def with_local_chef_server(local_repo, &block)
|
52
|
+
begin
|
53
|
+
::Chef::Config.from_file(knife_config_file_for('local'))
|
54
|
+
uri = URI(::Chef::Config[:chef_server_url])
|
55
|
+
host = uri.hostname
|
56
|
+
port = uri.port
|
57
|
+
rescue
|
58
|
+
host = '127.0.0.1'
|
59
|
+
port = 7799
|
60
|
+
end
|
61
|
+
|
62
|
+
zero_server = Fhcap::Tasks::Chef::ChefZeroServer.new({host: host, port: port})
|
63
|
+
|
64
|
+
begin
|
65
|
+
zero_server.start_chef_zero_server
|
66
|
+
if zero_server.running?
|
67
|
+
thor.say "[Chef Zero Server] - running at #{zero_server.url}"
|
68
|
+
else
|
69
|
+
thor.say "[Chef Zero Server] - Failed to start server", :red
|
70
|
+
exit(-1)
|
71
|
+
end
|
72
|
+
rescue Errno::EADDRINUSE => e
|
73
|
+
thor.say "[Chef Zero Server] - Address in use (#{host}:#{port}), assuming this is ok"
|
74
|
+
end
|
75
|
+
|
76
|
+
thor.say "[Chef Zero Server] - Syncing nodes from #{local_repo}"
|
77
|
+
knife_upload(local_repo, 'local', ['/nodes'])
|
78
|
+
knife_upload(local_repo, 'local', ['/data_bags/aws_*'])
|
79
|
+
begin
|
80
|
+
block.call
|
81
|
+
ensure
|
82
|
+
thor.say "[Chef Zero Server] - Syncing nodes to #{local_repo}"
|
83
|
+
FileUtils.rm_rf(File.join(local_repo, 'nodes'))
|
84
|
+
FileUtils.rm_rf Dir.glob(File.join(local_repo, 'data_bags/aws_*'))
|
85
|
+
knife_download(local_repo, 'local', ['/nodes'])
|
86
|
+
knife_download(local_repo, 'local', ['/data_bags/aws_*'])
|
87
|
+
end
|
88
|
+
end
|
89
|
+
|
90
|
+
def local_chef_server?(cfg={})
|
91
|
+
cfg[:chef_server] && cfg[:chef_server] == 'local'
|
92
|
+
end
|
93
|
+
|
94
|
+
def knife_upload(repo, server, pattern)
|
95
|
+
thor.say " * uploading local repo items from #{repo} - #{pattern} ..."
|
96
|
+
suppress_stdout(!options[:verbose]) do
|
97
|
+
Dir.chdir(repo) do
|
98
|
+
::Chef::Knife::Upload.load_deps
|
99
|
+
knife_command = ::Chef::Knife::Upload.new(pattern)
|
100
|
+
knife_command.config[:config_file] = knife_config_file_for(server)
|
101
|
+
knife_command.config[:chef_repo_path] = repo
|
102
|
+
knife_command.configure_chef
|
103
|
+
knife_command.config[:recurse] = true
|
104
|
+
knife_command.run
|
105
|
+
end
|
106
|
+
end
|
107
|
+
end
|
108
|
+
|
109
|
+
def knife_download(repo, server, pattern)
|
110
|
+
thor.say " * downloading server items to #{repo} - #{pattern} ..."
|
111
|
+
suppress_stdout(!options[:verbose]) do
|
112
|
+
Dir.chdir(repo) do
|
113
|
+
::Chef::Knife::Download.load_deps
|
114
|
+
knife_command = ::Chef::Knife::Download.new(pattern)
|
115
|
+
knife_command.config[:config_file] = knife_config_file_for(server)
|
116
|
+
knife_command.config[:chef_repo_path] = repo
|
117
|
+
knife_command.configure_chef
|
118
|
+
knife_command.config[:recurse] = true
|
119
|
+
knife_command.run
|
120
|
+
end
|
121
|
+
end
|
122
|
+
end
|
123
|
+
|
124
|
+
def knife_environment_delete(env, server)
|
125
|
+
thor.say " * deleting environment '#{env}' from #{server}"
|
126
|
+
delete_chef_object(::Chef::Knife::EnvironmentDelete, server, env)
|
127
|
+
end
|
128
|
+
|
129
|
+
def knife_data_bag_delete(data_bag, item, server)
|
130
|
+
thor.say " * deleting data bag '#{data_bag} #{item}' from #{server}"
|
131
|
+
delete_chef_object(::Chef::Knife::DataBagDelete, server, data_bag, item)
|
132
|
+
end
|
133
|
+
|
134
|
+
def delete_chef_object(klass, server, *args)
|
135
|
+
begin
|
136
|
+
suppress_stdout(!options[:verbose]) do
|
137
|
+
klass.load_deps
|
138
|
+
knife_command = klass.new(args)
|
139
|
+
knife_command.config[:config_file] = knife_config_file_for(server)
|
140
|
+
knife_command.config[:yes] = true
|
141
|
+
knife_command.configure_chef
|
142
|
+
knife_command.run
|
143
|
+
end
|
144
|
+
rescue Net::HTTPServerException => e
|
145
|
+
response = e.response
|
146
|
+
case response
|
147
|
+
when Net::HTTPNotFound
|
148
|
+
puts "The object you are looking for could not be found, assuming this ok and continuing ..."
|
149
|
+
else
|
150
|
+
raise e
|
151
|
+
end
|
152
|
+
end
|
153
|
+
end
|
154
|
+
|
37
155
|
end
|
38
156
|
end
|
@@ -1,16 +1,13 @@
|
|
1
1
|
require 'fhcap/tasks/chef/chef_task_base'
|
2
|
-
require '
|
3
|
-
require 'chef/knife'
|
4
|
-
require 'fhcap/tasks/chef/chef_zero_server'
|
5
|
-
require 'chef/knife/upload'
|
6
|
-
require 'chef/knife/download'
|
7
|
-
require 'chef/config'
|
2
|
+
require 'fhcap/knife_helper'
|
8
3
|
|
9
4
|
module Fhcap
|
10
5
|
module Tasks
|
11
6
|
module Chef
|
12
7
|
class ChefServerTask < ChefTaskBase
|
13
8
|
|
9
|
+
include Fhcap::KnifeHelper
|
10
|
+
|
14
11
|
attr_reader :chef_server, :chef_repo, :repos
|
15
12
|
|
16
13
|
def initialize(options)
|
@@ -23,117 +20,16 @@ module Fhcap
|
|
23
20
|
def with_chef_server(&block)
|
24
21
|
::Chef::Config.solo = false
|
25
22
|
if local_chef_server?
|
26
|
-
with_local_chef_server(&block)
|
23
|
+
with_local_chef_server(repo_dir(@chef_repo), &block)
|
27
24
|
else
|
28
25
|
block.call
|
29
26
|
end
|
30
27
|
end
|
31
28
|
|
32
|
-
def with_local_chef_server(&block)
|
33
|
-
begin
|
34
|
-
::Chef::Config.from_file(knife_config_file_for('local'))
|
35
|
-
uri = URI(::Chef::Config[:chef_server_url])
|
36
|
-
host = uri.hostname
|
37
|
-
port = uri.port
|
38
|
-
rescue
|
39
|
-
host = '127.0.0.1'
|
40
|
-
port = 7799
|
41
|
-
end
|
42
|
-
|
43
|
-
zero_server = Fhcap::Tasks::Chef::ChefZeroServer.new({host: host, port: port})
|
44
|
-
|
45
|
-
begin
|
46
|
-
zero_server.start_chef_zero_server
|
47
|
-
if zero_server.running?
|
48
|
-
thor.say "[Chef Zero Server] - running at #{zero_server.url}"
|
49
|
-
else
|
50
|
-
thor.say "[Chef Zero Server] - Failed to start server", :red
|
51
|
-
exit(-1)
|
52
|
-
end
|
53
|
-
rescue Errno::EADDRINUSE => e
|
54
|
-
thor.say "[Chef Zero Server] - Address in use (#{host}:#{port}), assuming this is ok"
|
55
|
-
end
|
56
|
-
|
57
|
-
local_repo = repo_dir(@chef_repo)
|
58
|
-
thor.say "[Chef Zero Server] - Syncing nodes from #{local_repo}"
|
59
|
-
knife_upload(local_repo, @chef_server, ['/nodes'])
|
60
|
-
knife_upload(local_repo, @chef_server, ['/data_bags/aws_*'])
|
61
|
-
begin
|
62
|
-
block.call
|
63
|
-
ensure
|
64
|
-
thor.say "[Chef Zero Server] - Syncing nodes to #{local_repo}"
|
65
|
-
FileUtils.rm_rf(File.join(local_repo, 'nodes'))
|
66
|
-
FileUtils.rm_rf Dir.glob(File.join(local_repo, 'data_bags/aws_*'))
|
67
|
-
knife_download(local_repo, @chef_server, ['/nodes'])
|
68
|
-
knife_download(local_repo, @chef_server, ['/data_bags/aws_*'])
|
69
|
-
end
|
70
|
-
end
|
71
|
-
|
72
29
|
def local_chef_server?
|
73
30
|
chef_server && chef_server == 'local'
|
74
31
|
end
|
75
32
|
|
76
|
-
def knife_upload(repo, server, pattern)
|
77
|
-
thor.say " * uploading local repo items from #{repo} - #{pattern} ..."
|
78
|
-
suppress_stdout(!options[:verbose]) do
|
79
|
-
Dir.chdir(repo) do
|
80
|
-
::Chef::Knife::Upload.load_deps
|
81
|
-
knife_command = ::Chef::Knife::Upload.new(pattern)
|
82
|
-
knife_command.config[:config_file] = knife_config_file_for(server)
|
83
|
-
knife_command.config[:chef_repo_path] = repo
|
84
|
-
knife_command.configure_chef
|
85
|
-
knife_command.config[:recurse] = true
|
86
|
-
knife_command.run
|
87
|
-
end
|
88
|
-
end
|
89
|
-
end
|
90
|
-
|
91
|
-
def knife_download(repo, server, pattern)
|
92
|
-
thor.say " * downloading server items to #{repo} - #{pattern} ..."
|
93
|
-
suppress_stdout(!options[:verbose]) do
|
94
|
-
Dir.chdir(repo) do
|
95
|
-
::Chef::Knife::Download.load_deps
|
96
|
-
knife_command = ::Chef::Knife::Download.new(pattern)
|
97
|
-
knife_command.config[:config_file] = knife_config_file_for(server)
|
98
|
-
knife_command.config[:chef_repo_path] = repo
|
99
|
-
knife_command.configure_chef
|
100
|
-
knife_command.config[:recurse] = true
|
101
|
-
knife_command.run
|
102
|
-
end
|
103
|
-
end
|
104
|
-
end
|
105
|
-
|
106
|
-
def knife_environment_delete(env, server)
|
107
|
-
thor.say " * deleting environment '#{env}' from #{server}"
|
108
|
-
delete_chef_object(::Chef::Knife::EnvironmentDelete, server, env)
|
109
|
-
end
|
110
|
-
|
111
|
-
def knife_data_bag_delete(data_bag, item, server)
|
112
|
-
thor.say " * deleting data bag '#{data_bag} #{item}' from #{server}"
|
113
|
-
delete_chef_object(::Chef::Knife::DataBagDelete, server, data_bag, item)
|
114
|
-
end
|
115
|
-
|
116
|
-
def delete_chef_object(klass, server, *args)
|
117
|
-
begin
|
118
|
-
suppress_stdout(!options[:verbose]) do
|
119
|
-
klass.load_deps
|
120
|
-
knife_command = klass.new(args)
|
121
|
-
knife_command.config[:config_file] = knife_config_file_for(server)
|
122
|
-
knife_command.config[:yes] = true
|
123
|
-
knife_command.configure_chef
|
124
|
-
knife_command.run
|
125
|
-
end
|
126
|
-
rescue Net::HTTPServerException => e
|
127
|
-
response = e.response
|
128
|
-
case response
|
129
|
-
when Net::HTTPNotFound
|
130
|
-
puts "The object you are looking for could not be found, assuming this ok and continuing ..."
|
131
|
-
else
|
132
|
-
raise e
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
|
137
33
|
end
|
138
34
|
end
|
139
35
|
end
|
@@ -83,6 +83,7 @@ module Fhcap
|
|
83
83
|
config[user.to_sym][:ssh_public_key] = key.ssh_public_key
|
84
84
|
config[user.to_sym][:ssh_private_key] = key.private_key
|
85
85
|
end
|
86
|
+
config[:users][:hadmin][:ssh_keys] << config[:users][:hadmin][:ssh_public_key]
|
86
87
|
config[:users][:hadmin][:ssh_keys] << config[:nagios_user][:ssh_public_key]
|
87
88
|
|
88
89
|
#root_user
|
@@ -15,7 +15,8 @@ module Fhcap
|
|
15
15
|
|
16
16
|
unless options[:'skip-provision']
|
17
17
|
do_chef_run("provision::cluster_bootstrap")
|
18
|
-
|
18
|
+
#ToDo Do we need this anymore?
|
19
|
+
#seed_cookbooks if local_chef_server?
|
19
20
|
do_chef_run("provision::post_create_instances")
|
20
21
|
|
21
22
|
#Need to set run list correctly here after post create stuff since provision no longer does it
|
@@ -1,4 +1,5 @@
|
|
1
1
|
require 'fhcap/tasks/cluster/cluster_task_base'
|
2
|
+
require 'fhcap/knife_helper'
|
2
3
|
require "fhcap/tasks/dns/create_record"
|
3
4
|
|
4
5
|
module Fhcap
|
@@ -6,13 +7,18 @@ module Fhcap
|
|
6
7
|
module Cluster
|
7
8
|
class CreateDNSRecords < ClusterTaskBase
|
8
9
|
|
10
|
+
include Fhcap::KnifeHelper
|
11
|
+
|
9
12
|
def initialize(options)
|
10
13
|
super(options)
|
11
14
|
end
|
12
15
|
|
13
16
|
def run
|
14
17
|
thor.say "Cluster::CreateDNSRecords", :yellow
|
15
|
-
|
18
|
+
with_chef_server(cluster_config) do
|
19
|
+
create_dns_record
|
20
|
+
create_records_openshift
|
21
|
+
end
|
16
22
|
end
|
17
23
|
|
18
24
|
private
|
@@ -65,29 +71,41 @@ module Fhcap
|
|
65
71
|
end
|
66
72
|
|
67
73
|
def create_dns_record_openstack
|
74
|
+
create_records_for_query("recipes:nginx_feedhenry\\:\\:loadbalancer", ["*"])
|
75
|
+
end
|
76
|
+
|
77
|
+
def create_records_openshift
|
78
|
+
#This is a very basic openshift DNS setup and does not take into account a HA setup or LBs
|
79
|
+
create_records_for_query("roles:ose_master_server", [""])
|
80
|
+
create_records_for_query("roles:ose_node_server", ["*"])
|
81
|
+
end
|
82
|
+
|
83
|
+
def create_records_for_query(query, records)
|
68
84
|
cluster_config[:environments].each do |env_name, env_cfg|
|
69
85
|
env_name = "#{name}-#{env_name}"
|
70
86
|
knife_config_file = knife_config_file_for(cluster_config[:chef_server])
|
71
87
|
#ToDo [RHMAP-2898] Use knife object
|
72
|
-
nodes = JSON.parse(`knife search "chef_environment:#{env_name} AND
|
88
|
+
nodes = JSON.parse(`knife search "chef_environment:#{env_name} AND #{query}" -c #{knife_config_file} -F json -a name -a cloud.public_ipv4`)
|
73
89
|
|
74
|
-
|
90
|
+
query_node = nodes['rows'].collect do |row|
|
75
91
|
name, attrs = row.first
|
76
92
|
attrs
|
77
93
|
end.first
|
78
94
|
|
79
|
-
if
|
80
|
-
if
|
81
|
-
|
82
|
-
|
83
|
-
|
84
|
-
|
85
|
-
|
95
|
+
if query_node
|
96
|
+
if query_node['cloud.public_ipv4']
|
97
|
+
records.each do |record|
|
98
|
+
dns_record_cfg = {
|
99
|
+
domain: [record, env_cfg[:domain]].compact.reject(&:empty?).join('.'),
|
100
|
+
ipaddress: query_node['cloud.public_ipv4']
|
101
|
+
}
|
102
|
+
Dns::CreateRecord.new(@options.dup.merge(dns_record_cfg)).run
|
103
|
+
end
|
86
104
|
else
|
87
|
-
thor.say "Found
|
105
|
+
thor.say "Found query node '#{query_node['name']}', but was unable to retrieve it's IP!!}"
|
88
106
|
end
|
89
107
|
else
|
90
|
-
thor.say "Unable to locate
|
108
|
+
thor.say "Unable to locate node for query '#{query}' in cluster!!"
|
91
109
|
end
|
92
110
|
end
|
93
111
|
end
|
@@ -49,7 +49,6 @@ module Fhcap
|
|
49
49
|
}
|
50
50
|
generate_environment_config
|
51
51
|
create_chef_environment(env_cfg)
|
52
|
-
create_ssl_cert(env_cfg)
|
53
52
|
thor.create_file(cluster_file, JSON.pretty_generate(cluster_config)) unless @skip_create_cluster_file
|
54
53
|
end
|
55
54
|
|
@@ -159,6 +158,8 @@ module Fhcap
|
|
159
158
|
'core'
|
160
159
|
when /mbaas/
|
161
160
|
'mbaas'
|
161
|
+
when /ose-single/
|
162
|
+
'ose-single'
|
162
163
|
when /single/
|
163
164
|
'single'
|
164
165
|
when /farm/
|
@@ -87,6 +87,7 @@ module Fhcap
|
|
87
87
|
ask_config(required_config, cluster_config)
|
88
88
|
cluster_config[:driver] = provider_type(cluster_config[:provider_id])
|
89
89
|
send(:"generate_cluster_config_#{cluster_config[:driver]}")
|
90
|
+
generate_machine_options
|
90
91
|
driver_template_file = File.join(Fhcap.source_root, 'templates', 'cluster', cluster_config[:driver], "common.json.erb")
|
91
92
|
driver_template_config = template_as_object(driver_template_file, cluster_config)
|
92
93
|
cluster_config.merge!(driver_template_config)
|
@@ -94,17 +95,30 @@ module Fhcap
|
|
94
95
|
|
95
96
|
def generate_cluster_config_aws
|
96
97
|
ask_config(aws_required_config, cluster_config[:provider_config])
|
97
|
-
aws_regions = provider_config(cluster_config[:provider_id])[:regions]
|
98
98
|
cluster_config[:default_instance_options] = cluster_config[:default_instance_options] || {}
|
99
|
-
|
99
|
+
default_provider_conf = provider_config(@cluster_config[:provider_id])
|
100
|
+
aws_regions = default_provider_conf[:regions]
|
101
|
+
cluster_config[:default_instance_options][:image_id] = cluster_config[:provider_config][:image_id] || aws_regions[cluster_config[:provider_config][:region].to_sym][:base_image]
|
102
|
+
cluster_config[:default_instance_options][:instance_type] = cluster_config[:provider_config][:instance_type] || default_provider_conf[:instance_type]
|
100
103
|
end
|
101
104
|
|
102
105
|
def generate_cluster_config_openstack
|
103
106
|
cluster_config[:default_instance_options] = cluster_config[:default_instance_options] || {}
|
104
|
-
|
105
|
-
cluster_config[:default_instance_options][:
|
106
|
-
cluster_config[:default_instance_options][:
|
107
|
-
cluster_config[:default_instance_options][:
|
107
|
+
default_provider_conf = provider_config(@cluster_config[:provider_id])
|
108
|
+
cluster_config[:default_instance_options][:image_ref] = cluster_config[:provider_config][:image_ref] || default_provider_conf[:image_ref]
|
109
|
+
cluster_config[:default_instance_options][:flavor_ref] = cluster_config[:provider_config][:flavor_ref] || default_provider_conf[:flavor_ref]
|
110
|
+
cluster_config[:default_instance_options][:floating_ip_pool] = cluster_config[:provider_config][:floating_ip_pool] || default_provider_conf[:floating_ip_pool]
|
111
|
+
cluster_config[:default_instance_options][:ssh_username] = cluster_config[:provider_config][:ssh_username] || default_provider_conf[:ssh_username]
|
112
|
+
end
|
113
|
+
|
114
|
+
def generate_machine_options
|
115
|
+
cluster_config[:machine_options] = cluster_config[:machine_options] || {}
|
116
|
+
cluster_config[:machine_options][:ssh_username] = cluster_config[:provider_config][:ssh_username] || 'ubuntu'
|
117
|
+
cluster_config[:machine_options][:convergence_options] = cluster_config[:machine_options][:convergence_options] || {}
|
118
|
+
cluster_config[:machine_options][:convergence_options][:chef_version] = "12.6.0"
|
119
|
+
cluster_config[:machine_options][:convergence_options][:ssl_verify_mode] = "verify_none"
|
120
|
+
cluster_config[:machine_options][:convergence_options][:ohai_hints] = cluster_config[:machine_options][:convergence_options][:ohai_hints] || {}
|
121
|
+
cluster_config[:machine_options][:convergence_options][:ohai_hints][cluster_config[:driver].to_sym] = {}
|
108
122
|
end
|
109
123
|
|
110
124
|
def generate_cluster_environments
|
data/lib/fhcap/version.rb
CHANGED
data/lib/fhcap.rb
CHANGED
@@ -3,7 +3,7 @@ require "pathname"
|
|
3
3
|
|
4
4
|
module Fhcap
|
5
5
|
GEM_DIR = File.expand_path '..', File.dirname(__FILE__)
|
6
|
-
TEMPLATE_NAMES = %w{single core-3node mbaas-3node core-mbaas-6node core-small-9node nginx-test single-blank farm-3node farm-single}.sort
|
6
|
+
TEMPLATE_NAMES = %w{single core-3node mbaas-3node core-mbaas-6node core-small-9node nginx-test single-blank farm-3node farm-single ose-single}.sort
|
7
7
|
|
8
8
|
class << self
|
9
9
|
def source_root
|
@@ -0,0 +1,30 @@
|
|
1
|
+
{
|
2
|
+
"name": "<%= config[:name] %>",
|
3
|
+
"description": "<%= config[:name] %> Environment",
|
4
|
+
"cookbook_versions": {
|
5
|
+
},
|
6
|
+
"json_class": "Chef::Environment",
|
7
|
+
"chef_type": "environment",
|
8
|
+
"default_attributes": {
|
9
|
+
"openshift": {
|
10
|
+
"domain": "<%= config[:domain] %>"
|
11
|
+
},
|
12
|
+
"rhsm": {
|
13
|
+
"username": "CHANGEME",
|
14
|
+
"password": "CHANGEME"
|
15
|
+
},
|
16
|
+
"resolver": {
|
17
|
+
"nameservers": [
|
18
|
+
"8.8.8.8",
|
19
|
+
"8.8.4.4"
|
20
|
+
]
|
21
|
+
}
|
22
|
+
},
|
23
|
+
"override_attributes": {
|
24
|
+
"authorization": {
|
25
|
+
"sudo": {
|
26
|
+
"passwordless": true
|
27
|
+
}
|
28
|
+
}
|
29
|
+
}
|
30
|
+
}
|
@@ -1,8 +1,14 @@
|
|
1
|
+
<%-
|
2
|
+
require 'open-uri'
|
3
|
+
@my_public_ip = open('http://whatismyip.akamai.com').read
|
4
|
+
-%>
|
1
5
|
{
|
6
|
+
<%- unless config[:provider_config][:cidr] == "none" %>
|
2
7
|
"vpc": {
|
3
8
|
"region": "<%= config[:provider_config][:region] %>",
|
4
9
|
"cidr": "<%= config[:provider_config][:cidr] %>"
|
5
10
|
},
|
11
|
+
<%- end %>
|
6
12
|
"default_instance_options": {
|
7
13
|
"image_id": "<%= config[:default_instance_options][:image_id] %>",
|
8
14
|
"monitoring_enabled": true,
|
@@ -35,7 +41,7 @@
|
|
35
41
|
"protocols": ["all"],
|
36
42
|
"start": 0,
|
37
43
|
"end": 65535,
|
38
|
-
"sources": ["83.147.149.210/32", "46.38.161.225/32", "54.229.76.48/32", "79.125.117.182/32", "78.137.150.209/32", "52.37.106.23", "52.50.12.70", "52.62.158.176", "52.70.198.93", "52.193.17.19", "52.86.106.110", "52.48.49.57"]
|
44
|
+
"sources": ["<%= @my_public_ip %>", "83.147.149.210/32", "46.38.161.225/32", "54.229.76.48/32", "79.125.117.182/32", "78.137.150.209/32", "52.37.106.23", "52.50.12.70", "52.62.158.176", "52.70.198.93", "52.193.17.19", "52.86.106.110", "52.48.49.57"]
|
39
45
|
}
|
40
46
|
]
|
41
47
|
},
|
@@ -0,0 +1,78 @@
|
|
1
|
+
{
|
2
|
+
"domain": "<%= config[:domain] %>",
|
3
|
+
"security_groups": {
|
4
|
+
"oseinternal": {
|
5
|
+
"authorize_ingress": [
|
6
|
+
{
|
7
|
+
"protocols": [
|
8
|
+
"all"
|
9
|
+
],
|
10
|
+
"start": 0,
|
11
|
+
"end": 65535,
|
12
|
+
"groups": [
|
13
|
+
"oseinternal"
|
14
|
+
]
|
15
|
+
},
|
16
|
+
{
|
17
|
+
"protocols": [
|
18
|
+
"icmp"
|
19
|
+
],
|
20
|
+
"start": -1,
|
21
|
+
"end": -1,
|
22
|
+
"groups": [
|
23
|
+
"oseinternal"
|
24
|
+
]
|
25
|
+
}
|
26
|
+
]
|
27
|
+
},
|
28
|
+
"oseexternal": {
|
29
|
+
"authorize_ingress": [
|
30
|
+
{
|
31
|
+
"protocols": [
|
32
|
+
"tcp"
|
33
|
+
],
|
34
|
+
"start": 80,
|
35
|
+
"end": 80,
|
36
|
+
"sources": [
|
37
|
+
"0.0.0.0/0"
|
38
|
+
]
|
39
|
+
},
|
40
|
+
{
|
41
|
+
"protocols": [
|
42
|
+
"tcp"
|
43
|
+
],
|
44
|
+
"start": 443,
|
45
|
+
"end": 443,
|
46
|
+
"sources": [
|
47
|
+
"0.0.0.0/0"
|
48
|
+
]
|
49
|
+
},
|
50
|
+
{
|
51
|
+
"protocols": [
|
52
|
+
"tcp"
|
53
|
+
],
|
54
|
+
"start": 8443,
|
55
|
+
"end": 8443,
|
56
|
+
"sources": [
|
57
|
+
"0.0.0.0/0"
|
58
|
+
]
|
59
|
+
}
|
60
|
+
]
|
61
|
+
}
|
62
|
+
},
|
63
|
+
"instances": {
|
64
|
+
"node1": {
|
65
|
+
"aws": {
|
66
|
+
"security_groups": [
|
67
|
+
"ops-admin",
|
68
|
+
"oseinternal",
|
69
|
+
"oseexternal"
|
70
|
+
]
|
71
|
+
},
|
72
|
+
"run_list": [
|
73
|
+
"role[ose_master_server]",
|
74
|
+
"role[ose_node_server]"
|
75
|
+
]
|
76
|
+
}
|
77
|
+
}
|
78
|
+
}
|
@@ -22,12 +22,6 @@
|
|
22
22
|
"start": 80,
|
23
23
|
"end": 80,
|
24
24
|
"sources": ["0.0.0.0/0"]
|
25
|
-
},
|
26
|
-
{
|
27
|
-
"protocols": ["tcp"],
|
28
|
-
"start": 443,
|
29
|
-
"end": 443,
|
30
|
-
"sources": ["0.0.0.0/0"]
|
31
25
|
}
|
32
26
|
]
|
33
27
|
},
|
@@ -75,13 +69,6 @@
|
|
75
69
|
"protocol": "http",
|
76
70
|
"instance_port": 80,
|
77
71
|
"instance_protocol": "http"
|
78
|
-
},
|
79
|
-
{
|
80
|
-
"port": 443,
|
81
|
-
"protocol": "https",
|
82
|
-
"instance_port": 80,
|
83
|
-
"instance_protocol": "http",
|
84
|
-
"server_certificate": ""
|
85
72
|
}
|
86
73
|
]
|
87
74
|
}
|
metadata
CHANGED
@@ -1,14 +1,14 @@
|
|
1
1
|
--- !ruby/object:Gem::Specification
|
2
2
|
name: fhcap-cli
|
3
3
|
version: !ruby/object:Gem::Version
|
4
|
-
version: 0.4.
|
4
|
+
version: 0.4.7
|
5
5
|
platform: ruby
|
6
6
|
authors:
|
7
7
|
- Michael Nairn
|
8
8
|
autorequire:
|
9
9
|
bindir: bin
|
10
10
|
cert_chain: []
|
11
|
-
date: 2016-05-
|
11
|
+
date: 2016-05-31 00:00:00.000000000 Z
|
12
12
|
dependencies:
|
13
13
|
- !ruby/object:Gem::Dependency
|
14
14
|
name: thor
|
@@ -396,8 +396,10 @@ files:
|
|
396
396
|
- lib/cookbooks/provision/metadata.rb
|
397
397
|
- lib/cookbooks/provision/recipes/aws.rb
|
398
398
|
- lib/cookbooks/provision/recipes/aws_cluster_create.rb
|
399
|
+
- lib/cookbooks/provision/recipes/aws_cluster_create_eip.rb
|
399
400
|
- lib/cookbooks/provision/recipes/aws_cluster_create_elb.rb
|
400
401
|
- lib/cookbooks/provision/recipes/aws_cluster_destroy.rb
|
402
|
+
- lib/cookbooks/provision/recipes/aws_cluster_destroy_eip.rb
|
401
403
|
- lib/cookbooks/provision/recipes/cluster_bootstrap.rb
|
402
404
|
- lib/cookbooks/provision/recipes/cluster_bootstrap_instances.rb
|
403
405
|
- lib/cookbooks/provision/recipes/cluster_create.rb
|
@@ -414,6 +416,8 @@ files:
|
|
414
416
|
- lib/cookbooks/provision/recipes/openstack.rb
|
415
417
|
- lib/cookbooks/provision/recipes/openstack_cluster_create.rb
|
416
418
|
- lib/cookbooks/provision/recipes/openstack_cluster_destroy.rb
|
419
|
+
- lib/cookbooks/provision/recipes/ose_install.rb
|
420
|
+
- lib/cookbooks/provision/recipes/ose_post_install.rb
|
417
421
|
- lib/cookbooks/provision/recipes/post_create_instances.rb
|
418
422
|
- lib/cookbooks/provision/recipes/rabbitmq_reset_cluster.rb
|
419
423
|
- lib/cookbooks/provision/recipes/restart_services.rb
|
@@ -530,6 +534,7 @@ files:
|
|
530
534
|
- templates/chef/environment_empty.json.erb
|
531
535
|
- templates/chef/environment_farm.json.erb
|
532
536
|
- templates/chef/environment_mbaas.json.erb
|
537
|
+
- templates/chef/environment_ose-single.json.erb
|
533
538
|
- templates/chef/environment_single.json.erb
|
534
539
|
- templates/cluster/aws/common.json.erb
|
535
540
|
- templates/cluster/aws/core-3node.json.erb
|
@@ -538,6 +543,7 @@ files:
|
|
538
543
|
- templates/cluster/aws/farm-single.json.erb
|
539
544
|
- templates/cluster/aws/mbaas-3node.json.erb
|
540
545
|
- templates/cluster/aws/nginx-test.json.erb
|
546
|
+
- templates/cluster/aws/ose-single.json.erb
|
541
547
|
- templates/cluster/aws/single-blank.json.erb
|
542
548
|
- templates/cluster/aws/single.json.erb
|
543
549
|
- templates/cluster/core-3node.json.erb
|
@@ -554,8 +560,10 @@ files:
|
|
554
560
|
- templates/cluster/openstack/farm-single.json.erb
|
555
561
|
- templates/cluster/openstack/mbaas-3node.json.erb
|
556
562
|
- templates/cluster/openstack/nginx-test.json.erb
|
563
|
+
- templates/cluster/openstack/ose-single.json.erb
|
557
564
|
- templates/cluster/openstack/single-blank.json.erb
|
558
565
|
- templates/cluster/openstack/single.json.erb
|
566
|
+
- templates/cluster/ose-single.json.erb
|
559
567
|
- templates/cluster/single-blank.json.erb
|
560
568
|
- templates/cluster/single.json.erb
|
561
569
|
- templates/init/knife.rb.erb
|
@@ -586,7 +594,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
|
|
586
594
|
version: 2.5.0
|
587
595
|
requirements: []
|
588
596
|
rubyforge_project:
|
589
|
-
rubygems_version: 2.4
|
597
|
+
rubygems_version: 2.6.4
|
590
598
|
signing_key:
|
591
599
|
specification_version: 4
|
592
600
|
summary: FHCAP Command Line Tool
|