sparkle_formation 0.2.2 → 0.2.4
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/README.md +7 -1
- data/bin/generate_sparkle_docs +31 -0
- data/lib/sparkle_formation/aws.rb +6 -7
- data/lib/sparkle_formation/sparkle_attribute.rb +97 -0
- data/lib/sparkle_formation/translation/heat.rb +184 -2
- data/lib/sparkle_formation/translation/rackspace.rb +7 -3
- data/lib/sparkle_formation/translation.rb +28 -2
- data/lib/sparkle_formation/version.rb +1 -1
- data/sparkle_formation.gemspec +2 -1
- metadata +5 -33
- data/CONTRIBUTING.md +0 -25
- data/Gemfile +0 -3
- data/Gemfile.lock +0 -18
- data/bin/aws_resources +0 -85
- data/bin/heat_resources +0 -33
- data/docs/README.md +0 -177
- data/docs/anatomy.md +0 -203
- data/docs/building-blocks.md +0 -275
- data/docs/examples/cloudformation/components/base.rb +0 -25
- data/docs/examples/cloudformation/dynamics/elb.rb +0 -23
- data/docs/examples/cloudformation/templates/website.rb +0 -30
- data/docs/examples/template_json/website.json +0 -88
- data/docs/examples/website.rb +0 -74
- data/docs/functions.md +0 -41
- data/docs/properties.md +0 -32
- data/docs/provisioning.md +0 -82
- data/docs/resource-reference.md +0 -49
- data/examples/allinone/cloudformation/ec2_example.rb +0 -59
- data/examples/allinone/parse.rb +0 -14
- data/examples/ami_component/cloudformation/components/ami.rb +0 -21
- data/examples/ami_component/cloudformation/ec2_example.rb +0 -39
- data/examples/ami_component/parse.rb +0 -14
- data/test/spec.rb +0 -6
- data/test/specs/attribute.rb +0 -72
- data/test/specs/basic.rb +0 -76
- data/test/specs/cloudformation/components/ami.rb +0 -14
- data/test/specs/cloudformation/dynamics/node.rb +0 -16
- data/test/specs/results/base.json +0 -43
- data/test/specs/results/base_with_map.json +0 -50
- data/test/specs/results/component.json +0 -27
data/bin/aws_resources
DELETED
@@ -1,85 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
require 'nokogiri'
|
5
|
-
require 'fileutils'
|
6
|
-
|
7
|
-
STORE = '/tmp/aws-cfn-docs'
|
8
|
-
|
9
|
-
unless(File.directory?(STORE))
|
10
|
-
FileUtils.mkdir_p(STORE)
|
11
|
-
Dir.chdir(STORE) do
|
12
|
-
unless(system('wget -q -r -l 1 -A "aws-*" "http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html"'))
|
13
|
-
puts "FAILED: Documentation fetching failed!"
|
14
|
-
exit -1
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
aws_resources = {}
|
20
|
-
|
21
|
-
Dir.glob(File.join(STORE, '**/*.html')).each do |path|
|
22
|
-
resource = nil
|
23
|
-
begin
|
24
|
-
file = Nokogiri::HTML(File.open(path, 'r'))
|
25
|
-
type = file.css('h1.topictitle').text.strip
|
26
|
-
if(type.include?(' '))
|
27
|
-
next
|
28
|
-
end
|
29
|
-
resource = file.css('div.variablelist').first
|
30
|
-
if(resource)
|
31
|
-
names = resource.css('dt').css('span').map(&:text).map(&:strip)
|
32
|
-
types = resource.css('dd p').map(&:text).find_all do |x|
|
33
|
-
x.include?('Type')
|
34
|
-
end.map do |x|
|
35
|
-
if(x.downcase.match(/(\s|^)list(\s|$)/))
|
36
|
-
'Array'
|
37
|
-
elsif(x.include?('Type: String'))
|
38
|
-
'String'
|
39
|
-
elsif(x.include?('Type: Boolean'))
|
40
|
-
'Boolean'
|
41
|
-
elsif(x.include?('Type: Integer'))
|
42
|
-
'Number'
|
43
|
-
elsif(x.include?('Type:') && x.include?('JSON') && x.include?('document'))
|
44
|
-
'JSON'
|
45
|
-
else
|
46
|
-
'Unknown'
|
47
|
-
end
|
48
|
-
end
|
49
|
-
requires = resource.css('dd p').map(&:text).find_all do |x|
|
50
|
-
x.include?('Required:')
|
51
|
-
end.map do |x|
|
52
|
-
x.include?('No') ? false : true
|
53
|
-
end
|
54
|
-
descriptions = resource.css('dd').map do |dd|
|
55
|
-
dd.css('p').first.text.strip
|
56
|
-
end.map do |string|
|
57
|
-
string.split("\n").map(&:strip).join(' ')
|
58
|
-
end
|
59
|
-
property_hashes = names.size.times.map do |i|
|
60
|
-
[names[i], {:description => descriptions[i], :required => requires[i], :type => types[i]}]
|
61
|
-
end
|
62
|
-
aws_resources[type] = {
|
63
|
-
:properties => names,
|
64
|
-
:full_properties => Hash[property_hashes]
|
65
|
-
}
|
66
|
-
else
|
67
|
-
resource = file.css('div.informaltable')
|
68
|
-
if(resource)
|
69
|
-
aws_resources[type] = {
|
70
|
-
:properties => resource.css('tr').map{|tr|
|
71
|
-
item = tr.css('td').first
|
72
|
-
item ? item.text.strip : nil
|
73
|
-
}.compact
|
74
|
-
}
|
75
|
-
else
|
76
|
-
next
|
77
|
-
end
|
78
|
-
end
|
79
|
-
aws_resources[type][:path] = File.basename(path)
|
80
|
-
end
|
81
|
-
end
|
82
|
-
|
83
|
-
require 'pp'
|
84
|
-
|
85
|
-
pp aws_resources
|
data/bin/heat_resources
DELETED
@@ -1,33 +0,0 @@
|
|
1
|
-
#!/usr/bin/env ruby
|
2
|
-
|
3
|
-
require 'json'
|
4
|
-
require 'nokogiri'
|
5
|
-
require 'fileutils'
|
6
|
-
|
7
|
-
STORE = '/tmp/openstack-heat-docs'
|
8
|
-
|
9
|
-
unless(File.directory?(STORE))
|
10
|
-
FileUtils.mkdir_p(STORE)
|
11
|
-
Dir.chdir(STORE) do
|
12
|
-
unless(system('wget -q "http://docs.openstack.org/developer/heat/template_guide/openstack.html"'))
|
13
|
-
puts "FAILED: Documentation fetching failed!"
|
14
|
-
exit -1
|
15
|
-
end
|
16
|
-
end
|
17
|
-
end
|
18
|
-
|
19
|
-
file = Nokogiri::HTML(File.open(File.join(STORE, 'openstack.html'), 'r'))
|
20
|
-
|
21
|
-
resources = Hash[
|
22
|
-
file.css('div.section[id*="json"]').css('pre.literal-block').map do |node|
|
23
|
-
[
|
24
|
-
node.text.scan(/Type":.*"(.+?)"/).flatten.first,
|
25
|
-
node.text.scan(/Properties.*?\{(.+)$/m).flatten.first.
|
26
|
-
strip.split("\n").map{|z| z.split(' ')}.flatten.find_all{|z| !z.scan(/^[A-Za-z0-9_"]+:$/).empty?}.map{|z| z.tr('":', '')}
|
27
|
-
]
|
28
|
-
end
|
29
|
-
]
|
30
|
-
|
31
|
-
require 'pp'
|
32
|
-
|
33
|
-
pp resources
|
data/docs/README.md
DELETED
@@ -1,177 +0,0 @@
|
|
1
|
-
## Overview
|
2
|
-
SparkleFormation is a Ruby DSL for programatically composing
|
3
|
-
[AWS Cloudformation][cloudformation], [OpenStack Heat][heat]
|
4
|
-
provisioning templates for the purpose of interacting with cloud
|
5
|
-
infrastructure orchestration APIs.
|
6
|
-
|
7
|
-
SparkleFormation templates describe the creation and configuration of
|
8
|
-
collections of cloud resources (a stack) as code, allowing you to
|
9
|
-
provision stacks in a predictable and repeatable manner. Stacks can be
|
10
|
-
managed as single unit, allowing you to create, modify, or delete
|
11
|
-
collections of resources via a single API call.
|
12
|
-
|
13
|
-
SparkleFormation composes templates in the native cloud orchestration
|
14
|
-
formats for AWS, Rackspace, Google Compute, and similar services.
|
15
|
-
|
16
|
-
## Table of Contents
|
17
|
-
|
18
|
-
- [Getting Started](#getting-started)
|
19
|
-
- [What It Looks Like](#what-it-looks-like)
|
20
|
-
- [Building Blocks](building-blocks.md)
|
21
|
-
- [Components](building-blocks.md#components)
|
22
|
-
- [Dynamics](building-blocks.md#dynamics)
|
23
|
-
- [Registries](building-blocks.md#registries)
|
24
|
-
- [Template Anatomy](anatomy.md)
|
25
|
-
- [Parameters](anatomy.md#parameters)
|
26
|
-
- [Resources](anatomy.md#resources)
|
27
|
-
- [Mappings](anatomy.md#mappings)
|
28
|
-
- [Outputs](anatomy.md#outputs)
|
29
|
-
- [Intrinsic Functions](functions.md)
|
30
|
-
- [Ref](functions.md#ref)
|
31
|
-
- [Attr](functions.md#attr)
|
32
|
-
- [Join](functions.md#join)
|
33
|
-
- [Universal Properties](properties.md)
|
34
|
-
- [Tags](properties.md#tags)
|
35
|
-
|
36
|
-
## Getting Started
|
37
|
-
### Gemfile
|
38
|
-
SparkleFormation is in active development. To access all the features
|
39
|
-
detailed in the documentation (using the knife plugin CLI), you should
|
40
|
-
install the plugin and supporting libraries from git:
|
41
|
-
|
42
|
-
```ruby
|
43
|
-
gem 'fog', :git => 'https://github.com/chrisroberts/fog.git', :ref => 'feature/orchestration'
|
44
|
-
gem 'fog-core', :git => 'https://github.com/chrisroberts/fog-core.git', :ref => 'feature/orchestration'
|
45
|
-
gem 'knife-cloudformation', :git => 'https://github.com/heavywater/knife-cloudformation.git', :ref => 'feature/fog-model'
|
46
|
-
```
|
47
|
-
|
48
|
-
The Knife Cloudformation gem is only needed for stack provisioning via
|
49
|
-
knife. You could also upload SparkleFormation generated templates to AWS via the WebUI.
|
50
|
-
|
51
|
-
### Knife Config
|
52
|
-
To use Knife for provisioning, you will need to add the following to
|
53
|
-
your `knife.rb` file:
|
54
|
-
|
55
|
-
```ruby
|
56
|
-
knife[:aws_access_key_id] = ENV['AWS_ACCESS_KEY_ID']
|
57
|
-
knife[:aws_secret_access_key] = ENV['AWS_SECRET_ACCESS_KEY']
|
58
|
-
|
59
|
-
[:cloudformation, :options].inject(knife){ |m,k| m[k] ||= Mash.new }
|
60
|
-
knife[:cloudformation][:options][:disable_rollback] = ENV['AWS_CFN_DISABLE_ROLLBACK'].to_s.downcase == 'true'
|
61
|
-
knife[:cloudformation][:options][:capabilities] = ['CAPABILITY_IAM']
|
62
|
-
knife[:cloudformation][:processing] = true
|
63
|
-
knife[:cloudformation][:credentials] = {
|
64
|
-
:aws_access_key_id => knife[:aws_access_key_id],
|
65
|
-
:aws_secret_access_key => knife[:aws_secret_access_key]
|
66
|
-
}
|
67
|
-
```
|
68
|
-
|
69
|
-
| Attribute | Function |
|
70
|
-
|--------------------------------------------------|----------------------------------------------------------------------------------------------------------------|
|
71
|
-
| `[:cloudformation][:options][:disable_rollback]` | Disables rollback if stack is unsuccessful. Useful for debugging. |
|
72
|
-
| `[:cloudformation][:credentials]` | Credentials for a user that is allowed to create stacks. |
|
73
|
-
| `[:cloudformation][:options][:capabilities]` | Enables IAM creation (AWS only). Options are `nil` or `['CAPABILITY_IAM']` |
|
74
|
-
| `[:cloudformation][:processing]` | Enables processing SparkleFormation templates (otherwise knife cloudformation will expect a JSON CFN template. |
|
75
|
-
|
76
|
-
## What it Looks Like
|
77
|
-
Below is a basic SparkleFormation template which would provision an
|
78
|
-
elastic load balancer forwarding port 80 to an autoscaling group of
|
79
|
-
ec2 instances.
|
80
|
-
|
81
|
-
```ruby
|
82
|
-
SparkleFormation.new('website') do
|
83
|
-
|
84
|
-
set!('AWSTemplateFormatVersion', '2010-09-09')
|
85
|
-
|
86
|
-
description 'Supercool Website'
|
87
|
-
|
88
|
-
resources.cfn_user do
|
89
|
-
type 'AWS::IAM::User'
|
90
|
-
properties.path '/'
|
91
|
-
properties.policies _array(
|
92
|
-
-> {
|
93
|
-
policy_name 'cfn_access'
|
94
|
-
policy_document.statement _array(
|
95
|
-
-> {
|
96
|
-
effect 'Allow'
|
97
|
-
action 'cloudformation:DescribeStackResource'
|
98
|
-
resource '*'
|
99
|
-
}
|
100
|
-
)
|
101
|
-
}
|
102
|
-
)
|
103
|
-
end
|
104
|
-
|
105
|
-
resources.cfn_keys do
|
106
|
-
type 'AWS::IAM::AccessKey'
|
107
|
-
properties.user_name ref!(:cfn_user)
|
108
|
-
end
|
109
|
-
|
110
|
-
parameters.web_nodes do
|
111
|
-
type 'Number'
|
112
|
-
description 'Number of web nodes for ASG.'
|
113
|
-
default 2
|
114
|
-
end
|
115
|
-
|
116
|
-
resources.website_autoscale do
|
117
|
-
type 'AWS::AutoScaling::AutoScalingGroup'
|
118
|
-
properties do
|
119
|
-
availability_zones({'Fn::GetAZs' => ''})
|
120
|
-
launch_configuration_name ref!(:website_launch_config)
|
121
|
-
min_size ref!(:web_nodes)
|
122
|
-
max_size ref!(:web_nodes)
|
123
|
-
end
|
124
|
-
end
|
125
|
-
|
126
|
-
resources.website_launch_config do
|
127
|
-
type 'AWS::AutoScaling::LaunchConfiguration'
|
128
|
-
properties do
|
129
|
-
image_id 'ami-123456'
|
130
|
-
instance_type 'm3.medium'
|
131
|
-
end
|
132
|
-
end
|
133
|
-
|
134
|
-
resources.website_elb do
|
135
|
-
type 'AWS::ElasticLoadBalancing::LoadBalancer'
|
136
|
-
properties do
|
137
|
-
availability_zones._set('Fn::GetAZs', '')
|
138
|
-
listeners _array(
|
139
|
-
-> {
|
140
|
-
load_balancer_port '80'
|
141
|
-
protocol 'HTTP'
|
142
|
-
instance_port '80'
|
143
|
-
instance_protocol 'HTTP'
|
144
|
-
}
|
145
|
-
)
|
146
|
-
health_check do
|
147
|
-
target 'HTTP:80/'
|
148
|
-
healthy_threshold '3'
|
149
|
-
unhealthy_threshold '3'
|
150
|
-
interval '5'
|
151
|
-
timeout '15'
|
152
|
-
end
|
153
|
-
end
|
154
|
-
end
|
155
|
-
end
|
156
|
-
```
|
157
|
-
|
158
|
-
This template is 74 lines long (with generous spacing for
|
159
|
-
readability). The [json template this
|
160
|
-
renders](examples/template_json/website.json) is 88 lines, without
|
161
|
-
spacing). This can be improved, though. SparkleFormation allows you to
|
162
|
-
create resusable files such that the above template can become :
|
163
|
-
|
164
|
-
```ruby
|
165
|
-
SparkleFormation.new(:website).load(:base).overrides do
|
166
|
-
|
167
|
-
description 'Supercool Website'
|
168
|
-
|
169
|
-
dynamic!(:autoscale, 'website', :nodes => 2)
|
170
|
-
dynamic!(:launch_config, 'website', :image_id => 'ami-123456', :instance_type => 'm3.medium')
|
171
|
-
dynamic!(:elb, 'website')
|
172
|
-
|
173
|
-
end
|
174
|
-
```
|
175
|
-
|
176
|
-
[cloudformation]: http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-guide.html
|
177
|
-
[heat]: http://docs.openstack.org/developer/heat/template_guide/index.html
|
data/docs/anatomy.md
DELETED
@@ -1,203 +0,0 @@
|
|
1
|
-
## Template Anatomy
|
2
|
-
|
3
|
-
### Parameters
|
4
|
-
Parameters are prompts for stack specific values. A default may be
|
5
|
-
specified, but is not required. Every parameter must have a value at runtime.
|
6
|
-
|
7
|
-
In the Getting Started example we had one parameter, `web_nodes` which
|
8
|
-
set the min and max for the autoscaling group:
|
9
|
-
|
10
|
-
```ruby
|
11
|
-
parameters.web_nodes do
|
12
|
-
type 'Number'
|
13
|
-
description 'Number of web nodes for ASG.'
|
14
|
-
default 2
|
15
|
-
end
|
16
|
-
```
|
17
|
-
|
18
|
-
Every parameter must have a type and a description. Available types are `String`,
|
19
|
-
`Number` (an integer), and `CommaDelimitedList` (an array of
|
20
|
-
strings, as-in: `['alpha', 'beta', '1', 2']`). The descriptions is a
|
21
|
-
string describing the resource.
|
22
|
-
|
23
|
-
Parameters support optional default values, declared as
|
24
|
-
above. An array of accepted values may be set, as well:
|
25
|
-
|
26
|
-
```ruby
|
27
|
-
parameters.web_nodes do
|
28
|
-
type 'Number'
|
29
|
-
description 'Number of web nodes for ASG.'
|
30
|
-
default 2
|
31
|
-
allowed_values [1, 2, 3, 5]
|
32
|
-
end
|
33
|
-
```
|
34
|
-
|
35
|
-
### Resources
|
36
|
-
Resources are the infrastructure resources that are provisioned with
|
37
|
-
the stack. Every resource must have a type that corresponds to a
|
38
|
-
supported cloud resource. Resources typically have a properties hash
|
39
|
-
that configures the resource. Some resources also have metadata. For
|
40
|
-
the complete list of required and optional options, see the
|
41
|
-
individual resource documentation.
|
42
|
-
|
43
|
-
Resource availability is not consistent across
|
44
|
-
providers. SparkleFormation's resources support is based on AWS, and
|
45
|
-
not all resources will be available on other platforms. See the
|
46
|
-
[resource reference](resource-reference.md) table for more information.
|
47
|
-
|
48
|
-
The prior example included the following resources:
|
49
|
-
- cfn_user: The IAM user for the stack, which will be used to
|
50
|
-
provision stack resources.
|
51
|
-
|
52
|
-
```ruby
|
53
|
-
resources.cfn_user do
|
54
|
-
type 'AWS::IAM::User'
|
55
|
-
properties.path '/'
|
56
|
-
properties.policies _array(
|
57
|
-
-> {
|
58
|
-
policy_name 'cfn_access'
|
59
|
-
policy_document.statement _array(
|
60
|
-
-> {
|
61
|
-
effect 'Allow'
|
62
|
-
action 'cloudformation:DescribeStackResource'
|
63
|
-
resource '*'
|
64
|
-
}
|
65
|
-
)
|
66
|
-
}
|
67
|
-
)
|
68
|
-
end
|
69
|
-
```
|
70
|
-
|
71
|
-
- cfn_key: The IAM keys for the stack IAM user.
|
72
|
-
|
73
|
-
```ruby
|
74
|
-
resources.cfn_keys do
|
75
|
-
type 'AWS::IAM::AccessKey'
|
76
|
-
properties.user_name ref!(:cfn_user)
|
77
|
-
end
|
78
|
-
```
|
79
|
-
|
80
|
-
- website_asg: The autoscaling group containing website nodes. The
|
81
|
-
size of the autoscaling group is set to the value of the web_nodes
|
82
|
-
parameter.
|
83
|
-
|
84
|
-
```ruby
|
85
|
-
resources.website_autoscale do
|
86
|
-
type 'AWS::AutoScaling::AutoScalingGroup'
|
87
|
-
properties do
|
88
|
-
availability_zones({'Fn::GetAZs' => ''})
|
89
|
-
launch_configuration_name ref!(:website_launch_config)
|
90
|
-
min_size ref!(:web_nodes)
|
91
|
-
max_size ref!(:web_nodes)
|
92
|
-
end
|
93
|
-
end
|
94
|
-
```
|
95
|
-
|
96
|
-
- website_launch_configuration: The launch configuration for
|
97
|
-
website_asg nodes. The AMI image ID and instance type (size) are
|
98
|
-
required.
|
99
|
-
|
100
|
-
```ruby
|
101
|
-
resources.website_launch_config do
|
102
|
-
type 'AWS::AutoScaling::LaunchConfiguration'
|
103
|
-
properties do
|
104
|
-
image_id 'ami-123456'
|
105
|
-
instance_type 'm3.medium'
|
106
|
-
end
|
107
|
-
end
|
108
|
-
```
|
109
|
-
|
110
|
-
- website_elb: The elastic load balancer for the website. The
|
111
|
-
listeners array configures port forwarding. The health check
|
112
|
-
configures the load balancer health check target and thresholds.
|
113
|
-
|
114
|
-
```ruby
|
115
|
-
resources.website_elb do
|
116
|
-
type 'AWS::ElasticLoadBalancing::LoadBalancer'
|
117
|
-
properties do
|
118
|
-
availability_zones._set('Fn::GetAZs', '')
|
119
|
-
listeners _array(
|
120
|
-
-> {
|
121
|
-
load_balancer_port '80'
|
122
|
-
protocol 'HTTP'
|
123
|
-
instance_port '80'
|
124
|
-
instance_protocol 'HTTP'
|
125
|
-
}
|
126
|
-
)
|
127
|
-
health_check do
|
128
|
-
target 'HTTP:80/'
|
129
|
-
healthy_threshold '3'
|
130
|
-
unhealthy_threshold '3'
|
131
|
-
interval '5'
|
132
|
-
timeout '15'
|
133
|
-
end
|
134
|
-
end
|
135
|
-
end
|
136
|
-
```
|
137
|
-
|
138
|
-
### Mappings
|
139
|
-
Mappings allow you to create key/value pairs which can be referenced
|
140
|
-
at runtime. This is useful for things like an image id that differs
|
141
|
-
by region or environment.
|
142
|
-
|
143
|
-
Mappings for the 2014.09 Amazon Linux PV Instance Store 64-bit AMIs
|
144
|
-
for each US region:
|
145
|
-
|
146
|
-
```ruby
|
147
|
-
mappings.region_map do
|
148
|
-
set!('us-east-1', :ami => 'ami-8e852ce6')
|
149
|
-
set!('us-west-1', :ami => 'ami-03a8a146')
|
150
|
-
set!('us-west-2', :ami => 'ami-f786c6c7')
|
151
|
-
end
|
152
|
-
```
|
153
|
-
|
154
|
-
These can be referenced, in turn, with the following:
|
155
|
-
|
156
|
-
```ruby
|
157
|
-
map!(:region_map, ref!('AWS::Region'), :ami)
|
158
|
-
```
|
159
|
-
|
160
|
-
'AWS::Region' is a psuedo parameter. We could also perform a lookup
|
161
|
-
based on a parameter we provide, e.g. an instance size based on the environment:
|
162
|
-
|
163
|
-
```ruby
|
164
|
-
parameters.environment do
|
165
|
-
type 'String'
|
166
|
-
allowed_values ['development', 'staging', 'production']
|
167
|
-
end
|
168
|
-
|
169
|
-
mappings.instance_size do
|
170
|
-
set!('development', :instance => 'm3.small')
|
171
|
-
set!('staging', :instance => 'm3.medium')
|
172
|
-
set!('production', :instance => 'm3.large')
|
173
|
-
end
|
174
|
-
|
175
|
-
resources.website_launch_config do
|
176
|
-
type 'AWS::AutoScaling::LaunchConfiguration'
|
177
|
-
properties do
|
178
|
-
image_id map!(:region_map, 'AWS::Region', :ami)
|
179
|
-
instance_type map!(:instance_size, ref!(:environment), :instance)
|
180
|
-
end
|
181
|
-
end
|
182
|
-
```
|
183
|
-
|
184
|
-
### Outputs
|
185
|
-
Outputs provide metadata for the stack, as key/value pairs within an
|
186
|
-
outputs block. Note that this block lives outside the resource
|
187
|
-
blocks. This will retrieve the DNSName attribute for our load
|
188
|
-
balancer, and provide it as a value for an 'Elb Dns' output:
|
189
|
-
|
190
|
-
```ruby
|
191
|
-
outputs do
|
192
|
-
elb_dns do
|
193
|
-
value attr!(:website_elb, 'DNSName')
|
194
|
-
description "Website ELB DNS name"
|
195
|
-
end
|
196
|
-
end
|
197
|
-
```
|
198
|
-
|
199
|
-
Outputs are not simply informational. You can interact with them
|
200
|
-
during [provisioning](provisioning.md#knife-cloudformation) using the [knife-cloudformation
|
201
|
-
plugin](https://rubygems.org/gems/knife-cloudformation).
|
202
|
-
|
203
|
-
|