Untuk sebagian besar profesional DevOps, membuat VM biasanya terdiri dari memutarnya di cloud menggunakan Terraform dan kemudian menggunakan alat manajemen konfigurasi (misalnya Ansible atau Puppet) atau skrip bootstrap (misalnya cloud-init) untuk mengonversi Mesin Virtual mentah ke a server yang bertujuan.
Kita semua telah melakukannya untuk waktu yang lama dan berhasil untuk banyak kasus, tetapi ada beberapa kekurangannya.
Saya akan memberi Anda contoh dari pengalaman pribadi. Kami memiliki server web yang dapat diskalakan secara horizontal yang berjalan di GCP menggunakan grup instance terkelola (MIG). Kapanpun MIG ingin menambahkan node baru ke grup, dibutuhkan beberapa waktu untuk node siap.
Setelah server aktif, Ansible memerlukan beberapa menit untuk menginstal paket, melakukan konfigurasi, dan membuat node siap untuk memproses permintaan. Untuk server produksi yang memproses volume besar, jeda waktu berarti permintaan yang turun yang menghambat pengalaman pelanggan. Untuk mengatasi ini, kami harus menjatuhkan CPU dan ambang memori sehingga MIG dapat menjalankan server baru sebelum terlambat. Itu juga berarti ada terlalu banyak positif palsu dan kita membuang-buang infrastruktur yang berharga.
Juga, pertimbangkan jumlah yang diperlukan untuk menambal setiap server dan memastikan bahwa tambalan akan tepat di setiap node. Kompleksitas dan risiko meningkat dengan jumlah node.
Nah, kami menemukan bahwa kami salah melakukannya dan ada cara yang lebih baik: dengan menggunakan Infrastruktur yang Tidak Dapat Diubah . Nah, apa yang kita maksud dengan istilah ini? Artinya, alih-alih memutar infrastruktur dan mengonfigurasinya setelah siap, kita dapat melakukan pra-membuat semua konfigurasi dalam citra OS sehingga saat mesin menyala, ia siap. Ini juga berarti bahwa Anda tidak seharusnya mengkonfigurasinya lebih jauh, karena pada saat salinan mesin diluncurkan, itu tidak akan memiliki pengaturan Anda - karenanya tidak dapat diubah. Ini adalah konsep kontainer dalam ruang VM.
Meskipun konsep ini bukanlah hal baru, ada tantangan dengan pendekatan tersebut karena tidak ada alat yang tersedia saat itu. Untungnya, dengan praktik DevOps dan CI / CD modern, kami dapat dengan mudah membuat image baru dan merilisnya saat diperlukan. Anda juga dapat menjalankan pengujian pada image baru sebelum Anda memutuskan untuk merilisnya. Ini membantu mengurangi banyak rasa sakit yang mungkin Anda alami dalam produksi. Mengembalikan perubahan itu mudah juga. Cukup terapkan gambar lama. Anda dapat melakukan penerapan canary dengan pendekatan ini jika Anda perlu dan melakukan pengujian A / B dengan mudah.
HashiCorp memiliki tumpukan DevOps yang mengesankan yang terkait dengan pengelolaan infrastruktur dan konfigurasi server. Sementara Terraform HashiCorp adalah infrastruktur multi-cloud terkemuka sebagai solusi Kode, HashiCorp Packer memberi Anda kekuatan untuk membuat Infrastruktur yang Tidak Dapat Diubah.
Packer membantu Anda mengambil gambar OS dari basis, menjalankannya di VM sementara, menyesuaikan gambar Anda dengan menjalankan skrip shell atau bahkan buku pedoman yang mungkin, menguji konfigurasi, membangun gambar, dan mendorongnya ke repositori gambar Anda. Jadi lain kali, ketika Anda ingin merilis konfigurasi baru, Anda perlu memperbarui template instance Anda.
Pada artikel ini, kita akan melihat beberapa fitur ini di demo langsung. Karena kami bekerja terutama di GCP, kami akan menggunakan contoh GCP, tetapi prinsipnya sama dan alat tersebut mendukung semua platform cloud publik.
Prasyarat
Anda memerlukan proyek Google Cloud dan akun layanan pada proyek yang memiliki akses yang diperlukan. Dalam kasus ini, kami akan menggunakan akun layanan dengan akses Editor Proyek untuk kesederhanaan. Namun, Anda harus selalu mengikuti kebijakan dengan hak istimewa paling rendah dan hanya memberikan akses yang diperlukan yang diperlukan.
Lihat bagian "Menyiapkan Lingkungan Cloud Anda" di artikel Cara Melakukan Terraform Dengan Jenkins dan Slack di Google Cloud Platform untuk detail selengkapnya tentang membuat akun layanan.
Gandakan repositori ini , salin kunci JSON yang diunduh ke lokasi repositori, dan ganti namanya sebagai credentials.json. Anda dapat mengikuti langkah-langkah yang diuraikan di bawah ini:

Menjalankan Packer Build
Sekarang kita telah mengunduh CLI Packer dan Terraform, mari kita mulai dengan konfigurasi Packer.
Kami akan memutar image server web NGINX kustom menggunakan Packer.
Pertama, kita perlu membuat file konfigurasi JSON untuk diproses oleh Packer:
Ada dua bagian di dalam file: builder dan provisioner.
Di bagian pembangun, kami menyediakan yang berikut ini:
type- Jenis gambar yang kami coba buat (digooglecomputesini, karena ini adalah gambar GCP).account_file- File kredensial yang akan kami gunakan untuk mengautentikasi dan mengotorisasi dengan API cloud menggunakan akun layanan yang kami buat.project_id- Project ID GCP tempat Anda ingin membuat dan menyimpan gambar ini. Ganti<GCP_PROJECT_ID>dengan ID proyek Anda.zone- Zona tempat Anda ingin menjalankan VM build Anda. Packer membuat VM untuk membuat image, jadi pastikan akun layanan memiliki izin untuk menjalankan VM.source_image_family- Ini adalah keluarga gambar dari mana Anda ingin mendapatkan gambar sumber Anda. Anda juga dapat menggunakansource_imagejika Anda akan menggunakan gambar dasar tertentu untuk membangun VM Anda, tetapi jika Anda ingin menggunakan gambar stabil terbaru dari keluarga tertentu sebagai basis, Anda dapat menentukansource_image_family. Itu juga akan memastikan Anda tidak ketinggalan zaman. Dalam hal ini, kami akan menggunakanubuntu-1604-lts.ssh_username- Ini adalah nama pengguna yang akan digunakan Packer untuk masuk ke VM build Anda.image_name- Nama gambar yang ingin Anda buat setelah penyediaan selesai. Dalam hal ini, kami menggunakannginx-{{timestamp}}. Jadi, ketika Packer selesai membuat gambar, itu akan menggantikan{{timestamp}}dengan stempel waktu sebenarnya dari pembuatan tersebut. Itu akan memastikan bahwa Anda memiliki gambar baru setiap kali Anda membangun dan gambar lama Anda tidak ditimpa.image_family- Keluarga gambar tempat Anda ingin menyimpan gambar Anda. Meskipun ini opsional, ini membantu karena saat Anda membuat beberapa gambar dari keluarga yang sama, Anda dapat menentukan keluarga gambar di template instance Anda sendiri. Saat berikutnya Anda membangun infrastruktur, Anda akan mendapatkan gambar stabil terbaru yang diterapkan. Dalam hal ini, kami menggunakanwebserverkeluarga gambar.
Bagian penyediaan berisi daftar penyedia yang akan kita gunakan untuk menyiapkan VM dari gambar dasar. Dalam kasus ini, kami menggunakan:
- Penyedia file untuk menyalin
index.htmlfile dari direktori lokal ke/tmpdirektori VM Build. - Penyedia shell untuk menyiapkan NGINX di mesin. Kita juga bisa menggunakan penyedian Ansible untuk itu, tapi mari kita pertahankan sederhana untuk saat ini.
Mari kita lihat index.html filenya dulu:
The setup.sh Script menginstal nginx, bergerak index.html berkas ke default direktori nginx HTML, dan kemudian memungkinkan dan mulai layanan nginx.
Sekarang, mari buat VM dengan menjalankan berikut ini:
$ packer membangun packer.jsonDan saat kami menjalankannya, Packer melakukan langkah-langkah berikut:
- Memutar VM Build menggunakan Ubuntu 16.04LTS sebagai gambar dasar di GCP menggunakan zona yang kami tentukan di file Packer.
- Menyalin
index.htmlfile ke/tmpdirektori server build. - Menginstal NGINX di atasnya menggunakan
setup.shskrip. - Membuat gambar dari konfigurasi yang dihasilkan.
- Mendorong gambar ke repositori gambar proyek Anda.

Jika Anda membuka Proyek Google Cloud -> Compute Engine -> Storage -> Gambar dalam konsol cloud Anda, Anda akan melihat gambar NGINX dengan stempel waktu di bagian akhir.

Membuat Instance GCE dari Packer Image
Sekarang setelah kita berhasil membuat gambar, mari putar sebuah instance menggunakan gambar tersebut. Kami akan menggunakan Terraform untuk latihan ini.
The main.tf berkas mendefinisikan contoh GCE menggunakan gambar kustom dari webserver keluarga. Anda perlu menyalin terraform.tfvars.example file ke terraform.tfvars dan mengedit file agar sesuai dengan konfigurasi Anda.
Setelah Anda mengedit file dan menyimpannya, Anda dapat menjalankan perintah berikut untuk membuat instance dari gambar kustom:
$ terraform init
$ terraform berlaku
Dengan terraform apply lengkap, mari kita lihat konsol cloud dan ambil alamat IP eksternal dari instance:

Saat NGINX mendengarkan pada Port HTTP default (80), kita dapat menggunakan IP untuk mengakses situs web khusus.

Dan seperti yang kita lihat, alih-alih halaman NGINX default, kita mendapatkan kustom index.html sebagai hasilnya.
Selamat! Anda telah berhasil membangun dan meluncurkan gambar kustom menggunakan Packer dan Terraform.
Kesimpulan
Menggunakan Packer dengan Terraform membantu mendefinisikan kembali praktik manajemen konfigurasi dan telah memungkinkan penggunaan Infrastruktur yang Tidak Dapat Diubah dalam industri teknologi arus utama.
Terima kasih sudah membaca! Saya harap Anda menikmati artikelnya.





