Cara Menggunakan Ansible pada Packer
Engineer, Jakarta
Ini merupakan ekstensi artikel Buat Custom Image AlibabaCloud Menggunakan Packer (IaC). Jika pada artikel tersebut hanya menggunakan shell sebagai provisioner, kali ini saya gabunging shell dan ansible sebagai provisioner.
Disini saya hanya memberi contoh dan penjelasan sedikit terkait bagaimana menggunakan Ansible pada Packer. Diharapkan bisa berguna untuk pembelajaran otomatisasi pembuatan custom image pada cloud provider (Alibabacloud/AWS/GCP).
Disini saya hanya membahas Bagaimana mengkonfigurasi custom image menggunakan Ansible?
Sebenarnya pertanyaan tersebut sudah tersedia jawabanya di dokumentasi resminya. Namun, kadang kita butuh referensi lain berupa contoh (example) yang ditulis dalam kode dan cara mengeksekusinya.
Disini saya menggunakan metode menjalankan semua Task ansible dari dalam server (server yang digunakan untuk proses pembuatan image). Bukan menjalankan ansible dari remote SSH. Jika ingin menggunakan ansible melalui remote SSH bisa baca dokumentasi ini.
File main.pkr.hcl
packer {
required_plugins {
alicloud = {
source = "github.com/hashicorp/alicloud"
version = "~> 1"
}
}
}
source "alicloud-ecs" "autogenerated_1" {
associate_public_ip_address = true
image_name = "apache2_php_fpm74"
instance_type = "ecs.g6.large"
internet_charge_type = "PayByTraffic"
io_optimized = true
region = "ap-southeast-5"
skip_image_validation = true
source_image = "ubuntu_20_04_x64_20G_alibase_20230815.vhd"
ssh_username = "root"
}
build {
sources = ["source.alicloud-ecs.autogenerated_1"]
provisioner "shell" {
inline = [
"apt update",
"apt install software-properties-common -y",
"add-apt-repository --yes --update ppa:ansible/ansible",
"apt install ansible -y",
]
}
provisioner "ansible-local" {
playbook_dir = "../base-image"
playbook_files = ["playbook.yml"]
}
}
Struktur direktori:
base-image/
├── files
│ └── say.php
├── main.pkr.hcl
├── playbook.yml
└── templates
├── apiservicea.conf.j2
└── apiserviceb.conf.j2
Cara mengekseskusi:
packer build -force main.pkr.hcl
Additional example (playbook.yml) files:
# playbook.yml
- name: 'Provision Image'
hosts: localhost
become: true
tasks:
- name: install Apache
package:
name:
- apache2
- git
- php-fpm
- php-cgi
- libapache2-mod-php
- php-common
- php-pear
- php-mbstring
- php-gd
- php-mysql
- php-sqlite3
- php-zip
- php-xml
- php-json
- php-mail
- php-curl
state: present
Example output:
