Hello Readers, In this blog, we’ll see how we can install Jenkins on an AMI for EC2 instance in AWS using packer. Before starting you must have Packer, and AWS CLI installed on your machine and they both must be configured.
What is Packer?
Packer is an open-source tool that allows you to create the same machine image for multiple platforms from a single source template. A common use case is to create a golden image that teams can use across an organization on a cloud infrastructure.
Why Packer?
This is because it supports cross-platform. You can create multiple machine images from a single source file.
To achieve this, Packer uses a JSON template file to describe the configuration needed to create the image.
What is AMI?
Amazon Machine Image (AMI) is support and managed image provided by AWS that provides the information needed to launch an instance. You must specify the AMI when launching the instance. If you need multiple instances with the same configuration, you can launch multiple instances from a single AMI.
To build an AMI, firstly we have to install Packer on our machine. For installation, you can refer to this URL
Now, we’ll create a directory named Packer in which we’ll create template.json, vars.json, and script.sh file Create a template file template.json for AMI :
In the template file we are using three components:
- variables: The
variables
the section is a key/value mapping of the user variable name to a default value. A default value can be an empty string. - builders: Builders are responsible for creating machines and generating images from them for various platforms.
- provisioners: Provisioners use built-in and third-party software to install and configure the machine image after booting.
{
"variables": {
"aws_access_key": "",
"aws_secret_key": ""
},
"builders": [
{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "us-east-1",
"source_ami": "ami-04505e74c0741db8d",
"instance_type": "t2.micro",
"ssh_username": "{{user `ssh_username`}}",
"ami_name": "packer-example {{timestamp}}",
"tags":{
"Name": "packer_jenkins - {{timestamp}}"
}
}
],
"provisioners": [
{
"type": "shell",
"script": "script.sh"
}
]
}
Create a Variable file vars.json
You have to provide your AWS_ACCESS_KEY and AWS_SECRET_KEY in the vars.json file
{
"aws_access_key": "<AWS_ACCESS_KEY>",
"aws_secret_key": "<AWS_SECRET_KEY>",
"ssh_username": "ubuntu"
}
Now we will create a script to install docker and docker-compose.
#!/bin/bash
echo $PWD
sudo apt-get update && sudo apt install -y docker.io
sudo curl -L "https://github.com/docker/compose/releases/download/1.29.2/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose
sudo ln -s /usr/local/bin/docker-compose /usr/bin/docker-compose
sudo docker-compose --version
sudo systemctl restart startup.service
sleep 10
sudo systemctl enable startup.service
sudo systemctl stop startup.service
sudo systemctl restart startup.service
sleep 20
sudo docker-compose up -d
# sudo docker-compose logs -f
Now create a docker-compose file
version: '3.8'
services:
jenkins:
image: jenkins/jenkins:lts
privileged: true
user: root
ports:
- 8080:8080
- 50000:50000
container_name: jenkins
volumes:
- /home/${myname}/jenkins_compose/jenkins_configuration:/var/jenkins_home
- /var/run/docker.sock:/var/run/docker.sock
To run the JSON file for building AMI
packer build -var-file=vars.json template.json













Now, In this blog we have created an AMI in which we have installed jenkins.