Packer allows us to create templates for generating cross-platform machine images — templates that can be written in JSON. In this lab, we’ll test our JSON skills by fixing and otherwise neatening up an inaccurately written JSON Packer template. Just want to test your JSON reviewing skills? No Packer knowledge is needed to take this lab.
Learning Objectives
Successfully complete this lab by achieving the following learning objectives:
- Fix Whitespace
Open the provided template:
cd packer
vim ami-test.json
To make viewing the template easier, let’s neaten it up by adjusting the tabs/whitespace:
{ "variables": { "aws_access_key": "", "aws_secret_key": "", "aws_subnet_id": "" } "builders": { { "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "us-east-1", "subnet_id": "{{user `aws_subnet_id`}}", "source_ami_filter": { "filters": { "virtualization-type": "hvm", "name": "ubuntu/images/*ubuntu-focal-20.04-amd64-server-*", "root-device-type": "ebs" }, "owners": ["099720109477"], "most_recent": true }, "security_group_filter": { "filters": { "tag:Class": "packer" } } "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "ubuntu-ami-test_{{timestamp}}" } } "provisioners": { { "type": "shell", "script": "./init.sh" } } }
- Adjust Structural Errors
The provided template has
builders
andprovisioners
provided as objects when they should be arrays. Switch the brackets for these overall components:{ "variables": { "aws_access_key": "", "aws_secret_key": "", "aws_subnet_id": "" } "builders": [ { "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "us-east-1", "subnet_id": "{{user `aws_subnet_id`}}", "source_ami_filter": { "filters": { "virtualization-type": "hvm", "name": "ubuntu/images/*ubuntu-focal-20.04-amd64-server-*", "root-device-type": "ebs" }, "owners": ["099720109477"], "most_recent": true }, "security_group_filter": { "filters": { "tag:Class": "packer" } } "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "ubuntu-ami-test_{{timestamp}}" } ] "provisioners": [ { "type": "shell", "script": "./init.sh" } ] }
Finally, fix any missing commas:
{ "variables": { "aws_access_key": "", "aws_secret_key": "", "aws_subnet_id": "" }, "builders": [ { "type": "amazon-ebs", "access_key": "{{user `aws_access_key`}}", "secret_key": "{{user `aws_secret_key`}}", "region": "us-east-1", "subnet_id": "{{user `aws_subnet_id`}}", "source_ami_filter": { "filters": { "virtualization-type": "hvm", "name": "ubuntu/images/*ubuntu-focal-20.04-amd64-server-*", "root-device-type": "ebs" }, "owners": ["099720109477"], "most_recent": true }, "security_group_filter": { "filters": { "tag:Class": "packer" } }, "instance_type": "t2.micro", "ssh_username": "ubuntu", "ami_name": "ubuntu-ami-test_{{timestamp}}" } ], "provisioners": [ { "type": "shell", "script": "./init.sh" } ] }
- Run the Build
Using the credentials on the hands-on lab page, update the variables to use the provided access key, secret key, and subnet ID.
Save and exit the file.
Validate the template:
packer validate ami-test.json
Run the build:
packer build ami-test.json