aws-must-templates 0.1.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +390 -0
- data/lib/aws-must-templates.rb +2 -0
- data/lib/tasks/cross-ref.rb +78 -0
- data/lib/tasks/suite.rake +292 -0
- data/lib/test-suites/test_suites.rb +115 -0
- data/mustache/commonCfnSignal.mustache +34 -0
- data/mustache/commonCreationPolicy.mustache +33 -0
- data/mustache/commonDependsOn.mustache +25 -0
- data/mustache/commonInstanceType.mustache +27 -0
- data/mustache/commonKeyValue.mustache +28 -0
- data/mustache/commonStackRef.mustache +23 -0
- data/mustache/commonValue.mustache +34 -0
- data/mustache/initializeCFinit.mustache +27 -0
- data/mustache/initializeCFtools.mustache +27 -0
- data/mustache/initializeCfnInitHupFiles.mustache +85 -0
- data/mustache/initializeInstallAwsCli.mustache +32 -0
- data/mustache/initializeInstallChef.mustache +37 -0
- data/mustache/initializeProvisionChefZero.mustache +36 -0
- data/mustache/initializeStartCfnHup.mustache +25 -0
- data/mustache/mapping.mustache +27 -0
- data/mustache/mappingSubnetConfig.mustache +27 -0
- data/mustache/mappings.mustache +71 -0
- data/mustache/output.mustache +38 -0
- data/mustache/parameter.mustache +35 -0
- data/mustache/resource.mustache +51 -0
- data/mustache/resourceInstance.mustache +52 -0
- data/mustache/resourceInstanceInitialize.mustache +120 -0
- data/mustache/resourceInstanceMetadata.mustache +65 -0
- data/mustache/resourceInstanceProfile.mustache +34 -0
- data/mustache/resourceInternetGateway.mustache +87 -0
- data/mustache/resourcePolicy.mustache +50 -0
- data/mustache/resourceProvisionChef.mustache +38 -0
- data/mustache/resourceRole.mustache +40 -0
- data/mustache/resourceS3Bucket.mustache +39 -0
- data/mustache/resourceSecurityGroup.mustache +46 -0
- data/mustache/resourceStack.mustache +45 -0
- data/mustache/resourceSubnet.mustache +41 -0
- data/mustache/resourceUser.mustache +58 -0
- data/mustache/resourceVPC.mustache +44 -0
- data/mustache/resourceWait.mustache +39 -0
- data/mustache/resources.mustache +65 -0
- data/mustache/root.mustache +244 -0
- data/mustache/tag.mustache +27 -0
- data/pics/test-suites.jpg +0 -0
- metadata +146 -0
@@ -0,0 +1,85 @@
|
|
1
|
+
|
2
|
+
{{!
|
3
|
+
|
4
|
+
|
5
|
+
+++start+++
|
6
|
+
|
7
|
+
## <a id="initializeCfnInitHupFiles.mustache"></a>initializeCfnInitHupFiles.mustache <a class='navigator' href='#top'>[top]</a>
|
8
|
+
|
9
|
+
Cfn-init configuration to create files needed by
|
10
|
+
cfn-hup. Confiugration defines polling interval, CloudFormation path
|
11
|
+
to monitor, action to take, and the credentials needed for the
|
12
|
+
operation.
|
13
|
+
|
14
|
+
|
15
|
+
**Attributes**:
|
16
|
+
|
17
|
+
* `CfnUserKey`: reference name to user to retrieve `AWSAccessKeyId`
|
18
|
+
and `AWSSecretKey` in `/etc/cfn/cfn-credentials`
|
19
|
+
* `CfnResource` : resource which cfn-hup monitors for changes in `Metadata.cfn-hup`
|
20
|
+
* `CfnAction` : actions to trigger, when cfn-hup triggered, possibly starting `CfScript`
|
21
|
+
* `CfnScript` : script code for CfnAction (optional)
|
22
|
+
|
23
|
+
+++close+++
|
24
|
+
|
25
|
+
}}
|
26
|
+
|
27
|
+
{{! +++fold-on+++ }}
|
28
|
+
|
29
|
+
|
30
|
+
"/etc/cfn/cfn-hup.conf":{
|
31
|
+
"content":{
|
32
|
+
"Fn::Join":["", [
|
33
|
+
"[main]\n",
|
34
|
+
"stack=", {"Ref":"AWS::StackName"}, "\n",
|
35
|
+
"credential-file=/etc/cfn/cfn-credentials\n",
|
36
|
+
"interval=1\n",
|
37
|
+
"region=", {"Ref":"AWS::Region"}, "\n"
|
38
|
+
]]
|
39
|
+
},
|
40
|
+
"mode":"000400",
|
41
|
+
"owner":"root",
|
42
|
+
"group":"root"
|
43
|
+
}
|
44
|
+
|
45
|
+
, "/etc/cfn/cfn-credentials":{
|
46
|
+
"content":{
|
47
|
+
"Fn::Join":["", [
|
48
|
+
"AWSAccessKeyId=", {"Ref":"{{CfnUserKey}}"}, "\n",
|
49
|
+
"AWSSecretKey=", {"Fn::GetAtt":["{{CfnUserKey}}", "SecretAccessKey"]}, "\n"
|
50
|
+
]]
|
51
|
+
},
|
52
|
+
"mode":"000400",
|
53
|
+
"owner":"root",
|
54
|
+
"group":"root"
|
55
|
+
}
|
56
|
+
|
57
|
+
, "/etc/cfn/hooks.d/cfn-auto-reloader.conf":{
|
58
|
+
"content":{
|
59
|
+
"Fn::Join":["", [
|
60
|
+
"[cfn-auto-reloader-hook]\n",
|
61
|
+
"triggers=post.update\n",
|
62
|
+
"path=Resources.{{CfnResource}}.Metadata.CfnHup\n",
|
63
|
+
"action={{CfnAction}}\n",
|
64
|
+
"runas=root\n"
|
65
|
+
]]
|
66
|
+
}
|
67
|
+
}
|
68
|
+
|
69
|
+
{{# CfnScript.length }}
|
70
|
+
, "{{CfnAction}}":{
|
71
|
+
"content":{
|
72
|
+
"Fn::Join":["", [ {{# CfnScript }}"{{{.}}}\n",
|
73
|
+
{{/ CfnScript }}
|
74
|
+
"\n"
|
75
|
+
]]
|
76
|
+
},
|
77
|
+
"mode":"000555",
|
78
|
+
"owner":"root",
|
79
|
+
"group":"root"
|
80
|
+
|
81
|
+
}
|
82
|
+
{{/ CfnScript.length }}
|
83
|
+
|
84
|
+
|
85
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,32 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
|
7
|
+
## <a id="initializeInstallAwsCli.mustache"></a>initializeInstallAwsCli.mustache<a class='navigator' href='#top'> [top]</a>
|
8
|
+
|
9
|
+
UserData -script to install AwsCli
|
10
|
+
|
11
|
+
**Attributes**: context= `./resources/Instance/InstallChef`
|
12
|
+
|
13
|
+
* None
|
14
|
+
|
15
|
+
|
16
|
+
+++close+++
|
17
|
+
|
18
|
+
}}
|
19
|
+
|
20
|
+
|
21
|
+
{{! +++fold-on+++ }}
|
22
|
+
|
23
|
+
, "TMP_ZIP=awscli-bundle.zip\n"
|
24
|
+
, "curl https://s3.amazonaws.com/aws-cli/awscli-bundle.zip -o $TMP_ZIP\n"
|
25
|
+
, "sudo apt-get install unzip\n"
|
26
|
+
, "unzip $TMP_ZIP -d /tmp\n"
|
27
|
+
, "cd /tmp\n"
|
28
|
+
, "sudo ./awscli-bundle/install -i /usr/local/aws -b /usr/local/bin/aws \n"
|
29
|
+
, "echo $(date): awscli installed successfully \n"
|
30
|
+
|
31
|
+
|
32
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,37 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
|
7
|
+
## <a id="initializeInstallChef.mustache"></a>initializeInstallChef.mustache<a class='navigator' href='#top'> [top]</a>
|
8
|
+
|
9
|
+
UserData -script to install Chef
|
10
|
+
|
11
|
+
**Attributes**:
|
12
|
+
|
13
|
+
* `Version`: Chef version to install
|
14
|
+
|
15
|
+
+++close+++
|
16
|
+
|
17
|
+
}}
|
18
|
+
|
19
|
+
{{! +++fold-on+++ }}
|
20
|
+
|
21
|
+
{{# Version}}
|
22
|
+
{{# Ref}}
|
23
|
+
, "CHEF_VERSION='", { "Ref": "{{Ref}}" }, "'\n"
|
24
|
+
{{/ Ref}}
|
25
|
+
{{^ Ref}}
|
26
|
+
, "CHEF_VERSION={{Version}}\n"
|
27
|
+
{{/ Ref}}
|
28
|
+
{{/ Version}}
|
29
|
+
, "echo $(date): starting to install chef \n"
|
30
|
+
, "curl -L https://www.chef.io/chef/install.sh | sudo bash -s -- -v $CHEF_VERSION \n"
|
31
|
+
, "echo $(date): chef installed successfully \n"
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,36 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
|
7
|
+
## <a id="initializeProvisionChefZero.mustache"></a>initializeProvisionChefZero.mustache<a class='navigator' href='#top'> [top]</a>
|
8
|
+
|
9
|
+
Read Chef kithen from S3 bucket && launch chef zero
|
10
|
+
|
11
|
+
**Attributes**: context= `./resources/Instance/LaunchChefZero`
|
12
|
+
|
13
|
+
* `BucketName`: S3 bucket containing kitchen to provision
|
14
|
+
|
15
|
+
|
16
|
+
+++close+++
|
17
|
+
|
18
|
+
}}
|
19
|
+
|
20
|
+
{{! +++fold-on+++ }}
|
21
|
+
|
22
|
+
, "KITCHEN=/tmp/setup\n"
|
23
|
+
, "echo $(date): copy s3 bucket {{BucketName}} to $KITCHEN \n"
|
24
|
+
, "aws s3 cp --recursive --region $(aws s3api get-bucket-location --bucket {{BucketName}} --output text) s3://{{BucketName}}/setup/ $KITCHEN\n"
|
25
|
+
, "echo $(date): install chef-zero \n"
|
26
|
+
, "sudo apt-get install -y chef-zero \n"
|
27
|
+
, "echo $(date): start ChefZero in the background\n"
|
28
|
+
, "chef-zero --host 0.0.0.0 -d\n"
|
29
|
+
, "echo $(date): upload kithchen \n"
|
30
|
+
, "cd $KITCHEN && knife upload .\n"
|
31
|
+
, "echo $(date): kitchen uploaded \n"
|
32
|
+
|
33
|
+
|
34
|
+
|
35
|
+
|
36
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,25 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
|
7
|
+
## <a id="initializeStartCfnHup.mustache"></a>initializeStartCfnHup.mustache<a class='navigator' href='#top'> [top]</a>
|
8
|
+
|
9
|
+
Launch cfn-hup helper, which is a daemon that detects changes in
|
10
|
+
resource metadata and runs user-specified actions when a change is
|
11
|
+
detected
|
12
|
+
|
13
|
+
**Attributes**:
|
14
|
+
|
15
|
+
|
16
|
+
+++close+++
|
17
|
+
|
18
|
+
}}
|
19
|
+
|
20
|
+
|
21
|
+
{{! +++fold-on+++ }}
|
22
|
+
, "cfn-hup \n"
|
23
|
+
|
24
|
+
|
25
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
mapping.mustache
|
4
|
+
|
5
|
+
+++start+++
|
6
|
+
|
7
|
+
## <a id="mapping.mustache"></a>mapping.mustache <a class='navigator' href='#top'>[top]</a>
|
8
|
+
|
9
|
+
|
10
|
+
Dispatches mapping sub-type templates based mapping Type propertys
|
11
|
+
|
12
|
+
**Attributes**: context= `./mappings`
|
13
|
+
|
14
|
+
* `SubnetConfig`:
|
15
|
+
|
16
|
+
+++close+++
|
17
|
+
|
18
|
+
|
19
|
+
}}
|
20
|
+
|
21
|
+
|
22
|
+
{{! +++fold-on+++ }}
|
23
|
+
|
24
|
+
{{# SubnetConfig }}{{> mappingSubnetConfig }}{{/ SubnetConfig }}
|
25
|
+
|
26
|
+
|
27
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,27 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
+++start+++
|
4
|
+
|
5
|
+
|
6
|
+
## <a id="mappingSubnetConfig.mustache"></a>mappingSubnetConfig.mustache <a class='navigator' href='#top'>[top]</a>
|
7
|
+
|
8
|
+
Creates a subnet config mapping to map VPC/Public/Private key to CIDR
|
9
|
+
subnet block.
|
10
|
+
|
11
|
+
**Attributes**:
|
12
|
+
|
13
|
+
* `Name`: of the mapping
|
14
|
+
|
15
|
+
+++close+++
|
16
|
+
|
17
|
+
}}
|
18
|
+
|
19
|
+
{{! +++fold-on+++ }}
|
20
|
+
|
21
|
+
"{{Name}}" : {
|
22
|
+
"VPC" : { "CIDR" : "10.44.0.0/16" },
|
23
|
+
"Public" : { "CIDR" : "10.44.0.0/24" },
|
24
|
+
"Private" : { "CIDR" : "10.44.1.0/24" }
|
25
|
+
}{{_comma}}
|
26
|
+
|
27
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,71 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
+++start+++
|
4
|
+
|
5
|
+
## <a id="mappings.mustache"></a>mappings.mustache <a class='navigator' href='#top'>[top]</a>
|
6
|
+
|
7
|
+
|
8
|
+
Create fixed lookup tables `AWSInstanceType2Arch` and
|
9
|
+
`AWSRegionArch2AMI` implementing the table below
|
10
|
+
|
11
|
+
<code><pre>
|
12
|
+
ap-northeast-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-90815290 hvm
|
13
|
+
ap-southeast-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-0accf458 hvm
|
14
|
+
ap-southeast-2 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-1dc8b127 hvm
|
15
|
+
cn-north-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-eae27fd3 hvm
|
16
|
+
eu-central-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-3248712f hvm
|
17
|
+
eu-west-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-d74437a0 hvm
|
18
|
+
sa-east-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-0f6ced12 hvm
|
19
|
+
us-east-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-83c525e8 hvm
|
20
|
+
us-gov-west-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-51513172 hvm
|
21
|
+
us-west-1 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-61b25925 hvm
|
22
|
+
us-west-2 trusty 14.04 LTS amd64 hvm:ebs-ssd 20150528 ami-57e8d767 hvm
|
23
|
+
</pre></code>
|
24
|
+
|
25
|
+
|
26
|
+
**Attributes**: context= `.`
|
27
|
+
|
28
|
+
* none
|
29
|
+
|
30
|
+
|
31
|
+
**Actions**:
|
32
|
+
|
33
|
+
* **AWSInstanceType2Arch**: fixed key/value mapping, currently only
|
34
|
+
**t2.micro** --> **64bit**
|
35
|
+
|
36
|
+
* **AWSRegionArch2AMI**: fixed key/value mapping created, currently
|
37
|
+
architectures only for **64bits**
|
38
|
+
|
39
|
+
|
40
|
+
+++close+++
|
41
|
+
|
42
|
+
|
43
|
+
==================================================================
|
44
|
+
The template
|
45
|
+
==================================================================
|
46
|
+
|
47
|
+
}}
|
48
|
+
|
49
|
+
|
50
|
+
{{! +++fold-on+++ }}
|
51
|
+
|
52
|
+
"AWSInstanceType2Arch" : {
|
53
|
+
"t2.micro" : { "Arch" : "64" }
|
54
|
+
},
|
55
|
+
"AWSRegionArch2AMI" : {
|
56
|
+
"ap-northeast-1" : { "64" : "ami-90815290" },
|
57
|
+
"ap-southeast-1" : { "64" : "ami-0accf458" },
|
58
|
+
"ap-southeast-2" : { "64" : "ami-1dc8b127" },
|
59
|
+
"cn-north-1" : { "64" : "ami-eae27fd3" },
|
60
|
+
"eu-central-1" : { "64" : "ami-3248712f" },
|
61
|
+
"eu-west-1" : { "64" : "ami-d74437a0" },
|
62
|
+
"sa-east-1" : { "64" : "ami-0f6ced12" },
|
63
|
+
"us-east-1" : { "64" : "ami-83c525e8" },
|
64
|
+
"us-west-1" : { "64" : "ami-61b25925" },
|
65
|
+
"us-gov-west-1" : { "64" : "ami-51513172" },
|
66
|
+
"us-west-2" : { "64" : "ami-57e8d767" }
|
67
|
+
}
|
68
|
+
|
69
|
+
|
70
|
+
|
71
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,38 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
## <a id="output.mustache"></a>output.mustache <a class='navigator' href='#top'>[top]</a>
|
7
|
+
|
8
|
+
Create one output entry to CloudFormation JSON output section
|
9
|
+
|
10
|
+
**Attributes**: context= `./outputs`
|
11
|
+
|
12
|
+
* `Name` : of the ouput entry
|
13
|
+
* `Description`: of the output entry
|
14
|
+
* one of **Value**, **Ref**, **Attr**
|
15
|
+
* `Value`: of the output parameter
|
16
|
+
* `Ref`: name of refernece
|
17
|
+
* `Attr`
|
18
|
+
* `Ref`: name of attribute reference
|
19
|
+
* `Name`: name of the attribute
|
20
|
+
|
21
|
+
|
22
|
+
+++close+++
|
23
|
+
|
24
|
+
}}
|
25
|
+
|
26
|
+
{{! +++fold-on+++ }}
|
27
|
+
|
28
|
+
"{{Name}}": {
|
29
|
+
"Description" : "{{Description}}"
|
30
|
+
{{#Value}}, "Value" : "{{Value}}"{{/Value}}
|
31
|
+
{{#Ref}}, "Value" : { "Ref" : "{{Ref}}" }{{/Ref}}
|
32
|
+
{{#Attr}}, "Value" : { "Fn::GetAtt" : [ "{{Ref}}", "{{Name}}" ] }{{/Attr}}
|
33
|
+
}{{_comma}}
|
34
|
+
|
35
|
+
|
36
|
+
|
37
|
+
{{! +++fold-off+++ }}
|
38
|
+
|
@@ -0,0 +1,35 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
## <a id="parameter.mustache"></a>parameter.mustache <a class='navigator' href='#top'>[top]</a>
|
7
|
+
|
8
|
+
Create one parameter entry to CloudFormation JSON parameter section
|
9
|
+
|
10
|
+
**Attributes**: context= `./parameters`
|
11
|
+
|
12
|
+
* `Name` : of the ouput entry
|
13
|
+
* `Description`: of the parameter entry
|
14
|
+
* One of
|
15
|
+
* `Value`: value of the parameter
|
16
|
+
* `NestedValue`:
|
17
|
+
* `Stack` : resource name of the nested stack
|
18
|
+
* `Output`: name of output variable in nested stack
|
19
|
+
|
20
|
+
|
21
|
+
+++close+++
|
22
|
+
|
23
|
+
}}
|
24
|
+
|
25
|
+
|
26
|
+
|
27
|
+
{{! +++fold-on+++ }}
|
28
|
+
|
29
|
+
"{{Name}}": {
|
30
|
+
"Description" : "{{Description}}{{^Description}}No description given{{/Description}}"
|
31
|
+
, "Type": "{{Type}}"
|
32
|
+
{{#Value}}, "Default" : "{{Value}}"{{/Value}}
|
33
|
+
}{{_comma}}
|
34
|
+
|
35
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
resource.mustache
|
4
|
+
|
5
|
+
+++start+++
|
6
|
+
|
7
|
+
## <a id="resource.mustache"></a>resource.mustache <a class='navigator' href='#top'>[top]</a>
|
8
|
+
|
9
|
+
|
10
|
+
Dispatches resource sub-type templates based resource Type propertys
|
11
|
+
|
12
|
+
**Attributes**: context= `./resources`
|
13
|
+
|
14
|
+
* `Instance`: sub-document defining an EC instance
|
15
|
+
* `SecurityGroup`: sub-document defining an <a href="http://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-ec2-security-group.html">AWS::EC2::SecurityGroup</a>
|
16
|
+
* `S3Bucket`:
|
17
|
+
* `Role`:
|
18
|
+
* `Policy`:
|
19
|
+
* `InstanceProfile`:
|
20
|
+
* `Stack`:
|
21
|
+
* `Wait`:
|
22
|
+
* `VPC`:
|
23
|
+
* `InternetGateway`:
|
24
|
+
* `Subnet`:
|
25
|
+
* `User`: creates [User](#resourceUser.mustache)
|
26
|
+
|
27
|
+
|
28
|
+
+++close+++
|
29
|
+
|
30
|
+
|
31
|
+
}}
|
32
|
+
|
33
|
+
|
34
|
+
{{! +++fold-on+++ }}
|
35
|
+
|
36
|
+
{{# Instance }}{{> resourceInstance}}{{/ Instance }}
|
37
|
+
{{# SecurityGroup }}{{> resourceSecurityGroup}}{{/ SecurityGroup }}
|
38
|
+
{{# S3Bucket }}{{> resourceS3Bucket }}{{/ S3Bucket }}
|
39
|
+
{{# Role }}{{> resourceRole }}{{/ Role }}
|
40
|
+
{{# Policy }}{{> resourcePolicy }}{{/ Policy }}
|
41
|
+
{{# InstanceProfile }}{{> resourceInstanceProfile }}{{/ InstanceProfile }}
|
42
|
+
{{# Stack }}{{> resourceStack }}{{/ Stack }}
|
43
|
+
{{# Wait }}{{> resourceWait }}{{/ Wait }}
|
44
|
+
{{# VPC }}{{> resourceVPC }}{{/ VPC }}
|
45
|
+
{{# Subnet }}{{> resourceSubnet }}{{/ Subnet }}
|
46
|
+
{{# InternetGateway }}{{> resourceInternetGateway }}{{/ InternetGateway }}
|
47
|
+
{{# User }}{{> resourceUser }}{{/ User }}
|
48
|
+
|
49
|
+
|
50
|
+
|
51
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,52 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
|
7
|
+
## <a id="resourceInstance.mustache"></a>resourceInstance.mustache <a class='navigator' href='#top'>[top]</a>
|
8
|
+
|
9
|
+
Create an EC2 instance
|
10
|
+
|
11
|
+
**Attributes**: context= `./resources/Instance`
|
12
|
+
|
13
|
+
* `Name`: name of the EC2 instance to create
|
14
|
+
* Instance type (mandatory)
|
15
|
+
* `InstanceType` : The instance type, such as t2.micro.
|
16
|
+
* `InstanceTyperef` : Reference to instance type
|
17
|
+
* `tags` : array of tag sub-documents for EC2 instance
|
18
|
+
* `SecurityGroupIds`: array of [commonValue.mustache](#commonValue.mustache)
|
19
|
+
|
20
|
+
|
21
|
+
+++close+++
|
22
|
+
|
23
|
+
}}
|
24
|
+
|
25
|
+
{{! +++fold-on+++ }}
|
26
|
+
|
27
|
+
"{{Name}}" : {
|
28
|
+
"Type" : "AWS::EC2::Instance"
|
29
|
+
{{> commonCreationPolicy }}
|
30
|
+
, "Metadata": {
|
31
|
+
{{> resourceInstanceMetadata }}
|
32
|
+
|
33
|
+
} {{! metadata }}
|
34
|
+
, "Properties" : {
|
35
|
+
"ImageId" : { "Fn::FindInMap" : [ "AWSRegionArch2AMI", { "Ref" : "AWS::Region" },
|
36
|
+
{ "Fn::FindInMap" : [ "AWSInstanceType2Arch", {{> commonInstanceType }}, "Arch" ] } ] }
|
37
|
+
, "InstanceType" : {{> commonInstanceType}} {{! InstanceType OR InstanceTypeRef }}
|
38
|
+
, "Tags" : [ {{#tags}}{{>tag}}{{/tags}} ]
|
39
|
+
, "SecurityGroupIds" : [
|
40
|
+
{{# SecurityGroupIds }}
|
41
|
+
{{> commonValue }}{{_comma}}
|
42
|
+
{{/ SecurityGroupIds }}
|
43
|
+
]
|
44
|
+
{{#IamInstanceProfile}}, "IamInstanceProfile" : { "Ref" : "{{IamInstanceProfile}}" }{{/ IamInstanceProfile}}
|
45
|
+
{{# SubnetId }}, "SubnetId": {{> commonValue }} {{/ SubnetId }}
|
46
|
+
{{#KeyName}}, "KeyName" : { "Ref" : "{{KeyName}}" }{{/KeyName}}
|
47
|
+
, "UserData": {{> resourceInstanceInitialize }}
|
48
|
+
}
|
49
|
+
}{{_comma}}
|
50
|
+
|
51
|
+
|
52
|
+
{{! +++fold-off+++ }}
|
@@ -0,0 +1,120 @@
|
|
1
|
+
{{!
|
2
|
+
|
3
|
+
|
4
|
+
+++start+++
|
5
|
+
|
6
|
+
## <a id="resourceInstanceInitialize.mustache"></a>resourceInstanceInitialize.mustache <a class='navigator' href='#top'>[top]</a>
|
7
|
+
|
8
|
+
user-data script
|
9
|
+
|
10
|
+
**Attributes**:
|
11
|
+
|
12
|
+
* `CreationPolicy`: in the end send cfn-signal to `../Name` -resource in current stack
|
13
|
+
* `InitializeWait`: name of wait resource (for successfull script)
|
14
|
+
* `Initialize` : array of
|
15
|
+
* `InstallCFtools`:
|
16
|
+
* `ProvisionChef`:
|
17
|
+
* `InstallChef`: add UserData to install Chef
|
18
|
+
* `InstallAwsCli`: add UserData to install awscli
|
19
|
+
* `LaunchChefZero`:
|
20
|
+
* `StartCfnInit`: [Launch cfn-init](#initializeCFinit.mustache)
|
21
|
+
* `StartCfnHup`: [launch cfn-hup helper](#initializeStartCfnHup.mustache)
|
22
|
+
|
23
|
+
|
24
|
+
+++close+++
|
25
|
+
|
26
|
+
}}
|
27
|
+
|
28
|
+
{{! +++fold-on+++ }}
|
29
|
+
|
30
|
+
|
31
|
+
{ "Fn::Base64": { "Fn::Join": [ "\n",
|
32
|
+
[
|
33
|
+
"#!/bin/bash\n"
|
34
|
+
, "set -x\n"
|
35
|
+
, "set -e\n"
|
36
|
+
, "set -o pipefail\n"
|
37
|
+
, "LOG=/tmp/install.log\n"
|
38
|
+
, "echo $(date): User data script started > $LOG\n"
|
39
|
+
, "echo $(date): User data script started\n"
|
40
|
+
, "function finish() {\n"
|
41
|
+
, " echo \"$(date): installation finished\" \n"
|
42
|
+
, " echo \"$(date): installation finished\" >> $LOG \n"
|
43
|
+
{{# CreationPolicy}}
|
44
|
+
, " STACK='", { "Ref" : "AWS::StackName" }, "'\n"
|
45
|
+
, " REGION='", { "Ref" : "AWS::Region" }, "'\n"
|
46
|
+
, " RESOURCE='{{Name}}'\n"
|
47
|
+
, " type cfn-signal && sudo cfn-signal --success true --reason \"UserData script success\" --stack $STACK --resource $RESOURCE --region $REGION \n"
|
48
|
+
{{/ CreationPolicy}}
|
49
|
+
{{# InitializeWait}}
|
50
|
+
, " HANDLE='", { "Ref" : "{{InitializeWait}}" }, "'\n"
|
51
|
+
, " type cfn-signal && sudo cfn-signal --success true --reason \"UserData script success\" $HANDLE \n"
|
52
|
+
{{/ InitializeWait}}
|
53
|
+
|
54
|
+
, "}\n"
|
55
|
+
, "function error() {\n"
|
56
|
+
, " local lineno=$1\n"
|
57
|
+
, " local error=1\n"
|
58
|
+
, " echo \"$(date): installation finished in ERROR $error on line $lineno\" \n"
|
59
|
+
, " echo \"$(date): installation finished in ERROR $error on line $lineno\" >> $LOG \n"
|
60
|
+
{{# CreationPolicy}}
|
61
|
+
, " STACK='", { "Ref" : "AWS::StackName" }, "'\n"
|
62
|
+
, " REGION='", { "Ref" : "AWS::Region" }, "'\n"
|
63
|
+
, " RESOURCE='{{Name}}'\n"
|
64
|
+
, " type cfn-signal && sudo cfn-signal --exit-code $error --reason \"installation finished in ERROR on line $lineno\" --stack $STACK --resource $RESOURCE --region $REGION \n"
|
65
|
+
{{/ CreationPolicy}}
|
66
|
+
{{# InitializeWait}}
|
67
|
+
, " HANDLE='", { "Ref" : "{{InitializeWait}}" }, "'\n"
|
68
|
+
, " type cfn-signal && sudo cfn-signal --exit-code $error --reason \"installation finished in ERROR on line $lineno\" $HANDLE \n"
|
69
|
+
{{/ InitializeWait}}
|
70
|
+
, " exit 1\n"
|
71
|
+
, "}\n"
|
72
|
+
, "trap finish EXIT\n"
|
73
|
+
, "trap 'error ${LINENO}' ERR\n"
|
74
|
+
|
75
|
+
{{! NOTICE: check for resourceInstanceMetadata.mustache }}
|
76
|
+
|
77
|
+
|
78
|
+
{{# Initialize}}
|
79
|
+
{{# InstallCFtools }}
|
80
|
+
, "echo \"$(date): ------------------------------------------------------------------\" \n"
|
81
|
+
, "echo Install Cloudformation tools \n"
|
82
|
+
{{> initializeCFtools }}
|
83
|
+
{{/ InstallCFtools }}
|
84
|
+
{{#ProvisionChef }}
|
85
|
+
, "echo \"$(date): ------------------------------------------------------------------\" \n"
|
86
|
+
, "echo Provision chef \n"
|
87
|
+
{{> initializeProvisionChef }}
|
88
|
+
{{/ ProvisionChef }}
|
89
|
+
{{#InstallAwsCli }}
|
90
|
+
, "echo \"$(date): ------------------------------------------------------------------\" \n"
|
91
|
+
, "echo Install AWS client tools \n"
|
92
|
+
{{> initializeInstallAwsCli }}
|
93
|
+
{{/ InstallAwsCli }}
|
94
|
+
{{#InstallChef }}
|
95
|
+
, "echo \"$(date): ------------------------------------------------------------------\" \n"
|
96
|
+
, "echo Install chef \n"
|
97
|
+
{{> initializeInstallChef }}
|
98
|
+
{{/ InstallChef }}
|
99
|
+
{{#LaunchChefZero }}
|
100
|
+
, "echo \"$(date): ------------------------------------------------------------------\" \n"
|
101
|
+
, "echo Lauch ChefZero \n"
|
102
|
+
{{> initializeProvisionChefZero }}
|
103
|
+
{{/ LaunchChefZero }}
|
104
|
+
{{# StartCfnInit }}
|
105
|
+
, "echo \"$(date): ------------------------------------------------------------------\" \n"
|
106
|
+
, "echo Start cfn-init \n"
|
107
|
+
{{> initializeCFinit }}
|
108
|
+
{{/ StartCfnInit }}
|
109
|
+
{{# StartCfnHup }}
|
110
|
+
, "echo \"$(date): ------------------------------------------------------------------\" \n"
|
111
|
+
, "echo Start cfn-hup \n"
|
112
|
+
{{> initializeStartCfnHup }}
|
113
|
+
{{/ StartCfnHup }}
|
114
|
+
{{/ Initialize}}
|
115
|
+
]
|
116
|
+
|
117
|
+
]}
|
118
|
+
}
|
119
|
+
|
120
|
+
{{! +++fold-off+++ }}
|