Using Packer + Ansible to Create Image
Giả định là bạn đã có 1 tài khoản AWS rồi, có thể tạo được EC2, có base kiến thức cơ bản về AWS, Linux biết cách SSH vào EC2
Table of Contents
Yêu cầu
Giả định là bạn đã có 1 tài khoản AWS rồi, có thể tạo được EC2
Có base kiến thức cơ bản về AWS, Linux biết cách SSH vào EC2
Cách làm
1. Tạo bộ AWS key cho Packer user
Vào AWS IAM tạo user “packer” (hoặc bất cứ tên gì, ở đây mình lấy ảnh cũ chọn user “ansible”) cấp policy phù hợp (ví dụ chọn AdministratorAccess).
Vào tab Security cedentials
tạo Key cho User đó.
Copy bộ access key id và sceret access key ra để bước sau dùng.
Launch 1 Amazon Linux EC2, SSH vào và làm các bước tiếp theo:
2. Install Packer
export PACKER_RELEASE="1.4.3"
cd /tmp/
wget --no-check-certificate https://releases.hashicorp.com/packer/${PACKER_RELEASE}/packer_${PACKER_RELEASE}_linux_amd64.zip
unzip packer_${PACKER_RELEASE}_linux_amd64.zip
sudo mv packer /usr/local/bin
export PATH=$PATH:/usr/local/bin/packer
source ~/.bashrc
packer version
Nếu install thành công sẽ check được version của packer:
[ec2-user@ip-172-31-16-113 ~]$ packer version
Packer v1.4.3
3. Export AWS KEY của Packer user
Sử dụng 2 cái key đã chuẩn bị ở step 1:
export AWS_ACCESS_KEY_ID='AKIARRRRRRRRRRRRRRZ6'
export AWS_SECRET_ACCESS_KEY='ICUZE333sjfio899EEEEEEEEEEUr7'
Đến đây mình sẽ đưa ra 2 demo:
Demo 1 là Dùng Packer để build Amazon image (AMI)
Demo 2 là Dùng Packer + Ansible để build Docker image
Tất nhiên có thể có nhiều cách kết hợp, nhưng mình chỉ đưa 2 cái ví dụ cơ bản
4. Dùng Packer để build Amazon image
4.1. Tạo file Packer template
file mình đặt là basic.json
Chú ý đang làm trên “region”: “us-east-1”, nên nếu bạn làm khác region thì phải chọn ami phù hợp
{
"variables": {
"aws_access_key": "{{env `AWS_ACCESS_KEY_ID`}}",
"aws_secret_key": "{{env `AWS_SECRET_ACCESS_KEY`}}"
},
"builders": [{
"type": "amazon-ebs",
"access_key": "{{user `aws_access_key`}}",
"secret_key": "{{user `aws_secret_key`}}",
"region": "us-east-1",
"source_ami_filter": {
"filters": {
"virtualization-type": "hvm",
"name": "ubuntu/images/*/ubuntu-xenial-16.04-amd64-server-*",
"root-device-type": "ebs"
},
"owners": ["099720109477"],
"most_recent": true
},
"instance_type": "t2.micro",
"ssh_username": "ubuntu",
"ami_name": "packer-example {{timestamp}}"
}],
"provisioners": [{
"type": "shell",
"inline": [
"sleep 30",
"sudo apt-get update",
"sudo apt-get install -y redis-server"
]
}]
}
4.2. Validate Packer template
packer validate basic.json
Nếu template của bạn ko có lỗi syntax gì thì hiện như sau:
[ec2-user@ip-172-31-16-113 ~]$ packer validate basic.json
Template validated successfully.
4.3. Build Packer template
packer build basic.json
Nó sẽ tạo ra AMI trên AWS console cho mình, trong AMI đấy đã install redis như đc define trong basic.json
vào Console check nếu tạo ra AMI là ok
5. Dùng Packer + Ansible để build Docker image
5.1. Install Docker
sudo yum install -y docker
sudo service docker start
sudo usermod -a -G docker ec2-user
exit
exit
rồi SSH lại vào EC2, và các làm bước sau
5.2. Tạo file Packer template
Mình đặt tên file là container.json
{
"builders": [{
"type": "docker",
"image": "centos:7",
"export_path": "image.tar"
}],
"provisioners":[{
"type": "shell",
"inline": [
"yum -y update",
"yum -y install epel-release",
"yum -y install python-pip",
"pip install --upgrade pip",
"pip install ansible==2.5.0"
]}, {
"type": "ansible-local",
"playbook_file": "container_base.yml"
}],
"post-processors": [{
"type": "docker-import",
"repository": "ansible-dockerimage",
"tag": "0.1.0"
}]
}
5.3. Tạo file Ansible playbook
Vì trong file container.json
sẽ gọi đến Ansible playbook container_base.yml
Nên mình đặt tên file là container_base.yml
- hosts: all
become: True
tasks:
- name: install package
yum: name={{ item }} state=present
with_items:
- git
- htop
5.4. Build Packer template
packer build container.json
chạy có thể bị lỗi TLS handshake timeout
thì chạy lại là được (ảnh)
chạy OK sẽ thấy toàn màu xanh và khi gõ “docker images” sẽ thấy images dc tạo ra (ảnh)
Done!
Thank You!
Your comment has been submitted. It will appear on this page shortly! OKYikes, Sorry!
Error occured. Couldn't submit your comment. Please try again. Thank You! OK