Cara Menggunakan Ansible pada Packer

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:

output ansible packer

Leave a Reply