-
Notifications
You must be signed in to change notification settings - Fork 8
Templates
Go has an excellent and expandable text/template library which is utilised by Qaz for additional logic in creating templates. To read more on Go Template see Here. All features of Go Template are supported in Qaz.
Templating in Qaz
We'll run through some basics to get started.
To demonstrate the process of creating templates with Qaz we'll start with a simple VPC Cloudformation block.
config.yml
project: test
stacks:
vpc:
cf:
cidr: 10.10.0.0/16
template.yml
Resources:
{{ .name }}:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: {{ .vpc.cidr }}
Outputs:
$ ls
config.yml template.yml
$ qaz generate -t vpc::template.yml
Resources:
vpc:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: 10.10.0.0/16
The template values wrapped by {{ }} were swapped for their respective values defined in config. Note that {{ .name }}
will always resolve to the name of the stack calling the template, this allows Qaz to use the same template for multiple stacks and generate dynamic content based on the stack calling the template.
Sometimes it may become necessary to add specific content to a template based on a particular config value. In this example we'll demonstrate an if-statement in Go Template logic by using the same template to generate dynamic content for 2 different stacks.
config.yml
project: test
stacks:
oneVPC:
cf:
cidr: 10.10.0.0/16
twoVPC:
cf:
cidr: 192.168.0.0/16
template.yml
Resources:
{{ .name }}:
Type: "AWS::EC2::VPC"
Properties:
{{ if eq .name "oneVPC" }}
CidrBlock: {{ .oneVPC.cidr }}
{{ else }}
CidrBlock: {{ .twoVPC.cidr }}
{{ end }}
{{ if eq .name "oneVPC" }}
_simply says: if stack name equals oneVPC.
Outputs:
$ ls
config.yml template.yml
$ ## let's generate the onvVPC stack
$ qaz generate -t oneVPC::template.yml
Resources:
oneVPC:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: 10.10.0.0/16
$ ## now for twoVPC
$ qaz generate -t twoVPC::template.yml
Resources:
twoVPC:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: 192.168.0.0/16
Looping over items in config is something you'll probably be doing a lot. This example demonstrates a loop using Go Template.
Let's say I want a template that generates VPCs based on the amount of CIDR blocks I specify in my config.
config.yml
project: test
stacks:
vpc:
cf:
cidrs:
- 10.10.0.0/16
- 10.20.0.0/16
- 10.30.0.0/16
template.yml
Resources:
{{ range $index, $cidr := .vpc.cidrs }}
{{ $.name }}00{{ $index }}:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: {{ $cidr }}
{{ end }}
Important: The value, {{ $.name }}
is the same as {{ .name }}
. Due to how scoping works with Go's template library, Config values need to be referenced in this way when looping.
{{ range $index, $cidr := .vpc.cidrs }}
is a loop over the .vpv.cidrs yaml list.
Outputs:
$ qaz-test qaz generate -t vpc::template.yml
Resources:
vpc000:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: 10.10.0.0/16
vpc001:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: 10.20.0.0/16
vpc002:
Type: "AWS::EC2::VPC"
Properties:
CidrBlock: 10.30.0.0/16
Templates do not have to be Cloudformation. By using the Go template library Qaz is able to operate at a string manipulation level, meaning, any file can be templated and written using Qaz.
For more information on the cool stuff you can do using Go Templates See Here