Setelah sebelumnya kita berkenalan dengan sedikit sejarah dan mengerti bagaimana Ansible bekerja secara sederhana. Maka kali ini kita akan mencobanya langsung.

Agenda kita kali ini akan berupa proses installasi, mencoba memanggil module ansible,  bekerja dengan Inventory dan membuat Playbook.

Seperti sudah disinggung sebelumnya Ansible memiliki dua entitas yaitu Controller dan Target. Target di sini bisa sistem operasi apa saja, mulai dari GNU/Linux, BSD, Mac, Vmware, Xen, Windows, Cisco IOS dan masih banyak lagi. Asalkan mereka semua mengekspos layanan SSH. Terkecuali Windows yang tidak memerlukan SSH melainkan menggunakan Windows Remote Management.

Lain halnya dengan Controller, sistem operasi yang didukung hanyalalah yang berbasis Unix seperti GNU/Linux , BSD dan Mac. Pada kesempatan kali ini kita akan mencoba Ansible di sistem operasi FreeBSD 13.1 sebagai Controller dan Ubuntu server 20.04 sebagai Targetnya.

Installasi Ansbile

Untuk dapat berjalan Ansible bergantung dengan ketersediaan Python pada sistem operasi Controllernya. Maka dari itu pastikan python sudah terinstall terlebih dahulu. Selanjutnya pastikan juga bahwa Pip, Rust dan Bash telah terinstall.

Apabila kedua kebutuhan ini telah terpenuhi lanjut ke tahap berikutnya. Dalam proses installasi Ansible ini kita akan menggunakan Virtualenv, buat sebuah virtualenv yang berada di /opt/ansible dengan perintah

python3 -m venv /opt/ansible

Selanjutnya aktifkan environmen tersebut dengan perintah

source /opt/ansible/bin/active

Install paket Ansbile dengan perintah

pip install ansible

Proses ini akan memakan waktu cukup lama tergantung koneksi internet yang kita miliki. Selain itu karena FreeBSD tidak terlalu popular bila dibandingkan dengan GNU/Linux maka terdapat beberapa paket Python yang belum tersedia dalam bentuk pre-compilednya. Hal ini mengharuskan Pip untuk mengkompile nya terlebih dahulu, itu mengapa kita membutuhkan Rust.

Apabila proses installasi telah selesai, mari kita cek versi dari Ansible yang kita install dengan perintah berikut ini

(ansible) [root@salak /usr/home/bram]# ansible --version
ansible [core 2.13.5]
  config file = None
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /opt/ansible/lib/python3.9/site-packages/ansible
  ansible collection location = /root/.ansible/collections:/usr/share/ansible/collections
  executable location = /opt/ansible/bin/ansible
  python version = 3.9.14 (main, Sep 18 2022, 01:12:46) [Clang 13.0.0 ([email protected]:llvm/llvm-project.git llvmorg-13.0.0-0-gd7b669b3a
  jinja version = 3.1.2
  libyaml = False

Sampai di sini kita sudah memiliki Ansible terinstall pada Controller dan kita bisa mulai ke tahap berikutnya.

Memanggil Modul Ansible

Pertama kita akan mencoba module ping, modul ini akan memberikan informasi kepada kita apakah Target yang dituju dapat diakses atau tidak. Ketikan perintah

(ansible) [root@salak /usr/home/bram]# ansible -m ping localhost

[WARNING]: No inventory was parsed, only implicit localhost is available
localhost | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

Dapat kita saksikan bahwa modul ping sudah tereksekusi dengan baik, namun terdapat pesan peringatan bahwa ansible tidak dapat melakukan parsing pada inventory dan hanya localhost yang tersedia saat ini. Hal ini memberitahu kepada kita bahwa tanpa file inventory maka ansible tidak dapat bekerja secara remote namun hanya localhost saja.Mari kita lanjutkan

Bekerja dengan file Inventory

File inventory ini adalah sebuah deklarasi yang memungkinkan Ansible untuk tahu kemana harus melakukan koneksi dengan user apa dan lain sebagainya. Mari kita buat file hosts.ini yang berisi informasi Target seperti ini

[webserver]
ubuntu_server ansible_host=192.168.0.245 ansible_user=bram ansible_password=bram ansible_sudo_pass=bram

Pada baris pertama kita melihat tulisan [webserver], ini adalah notasi grup pada file inventory. Sehingga kita dapat dengan mudah mengeksekusi modul ansible ke beberapa target sekaligus.

Pada baris berikutnya kita lihat informasi target yang sebenarnya. Kita beri nama target tesebut dengan nama ubuntu_server , memiliki ip 192.168.0.245, user bram, password bram dan sudo password bram.

Sekarang mari kita panggil lagi module ping dengan perintah

ansible -i hosts.ini -m ping ubuntu_server

ubuntu_server | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python3"
    },
    "changed": false,
    "ping": "pong"
}

Ansible sukes mengakses server tersebut.  Perintah di atas terdiri dari opsi inventory yang ditandai dengan “-i” kemudian opsi module yang ditandai dengan “-m” dan yang paling terakir adalah label target, pada kasus di atas kita menjalankan module ping tersebut ke target dengan nama ubuntu_server.

Selain dengan memberikan nama dari target server kita juga bisa menggunakan “all” sebagai targetnya, hal ini akan menyebabkan ansible menjalankan module yang diinginkan ke semua target yang terdapat di dalam file inventory.

Bahkan lebih dari itu kita dapat juga menggunakan nama grup, dalam kasus kita ini nama group nya adalah “webserver”. Selain menggunakan string penuh, ansible juga mendukung sedikit penggunana regex seperti kita bisa menjalankan ansible pada target “web*” maka ansible akan mencari setiap group atau host yang memiliki label berawalan “web“.

Membuat Playbook

Sebelumnya kita sudah berkenalan dengan module ping, saatnya sekarang kita mencoba modul lain yang lebih menarik seperti apt atau infile. Module-module ini membutuhkan bebarap paremeter untuk dapat bekerja, memanggilnya langsung satu per satu lewat perintah ansible akan sangat merepotkan. Maka dari itu bisa membuat Playbook untuk memudahkan kita membangun struktur konfigurasi.

Playbook sendiri hanyak sebuah file dengan format YAML yang berisi langkah-langkah apa saja yang perlu dilakukan ansible terhadap target yang diinginkan.

Buat lah file play.yaml yang berisikan baris-baris text seperti di bawah ini

- name: Setup Web Server
  hosts: all
  become: true
  become_user: root

  tasks:
    - name: Ensure nginx installed
      ansible.builtin.apt:
        name: nginx
        state: present

Kemudian jalankan playbook tersebut dengan perintah ansible-playbook -i hosts.ini play.yaml. Playbook tersebut akan menjalankan apt dan memastikan bahwa nginx terinstall pada target. Berikut adalah output dari perintah di atas.

└> ansible-playbook -i hosts.ini play.yaml

PLAY [Setup Web Server] ****************************************

TASK [Gathering Facts] *****************************************
ok: [ubuntu_server]

TASK [Ensure nginx installed] **********************************
changed: [ubuntu_server]

PLAY RECAP *****************************************************
ubuntu_server              : ok=2    changed=1    unreachable=0

Dapat kita perhatikan di bagian Play Recap tertulis di situ changed=1 hal ini menandakan Ansible telah mengambil aksi untuk mengginstall paket nginx lewat bantuan apt. Apabila kita ulangi sekali lagi perintah di atas maka changed tidak akan berubah atau tetap “0” berarti Ansible tidak melakukan apa-apa karena kondisi yang diharapkan yaitu nginx terinstall di target sudah dicapai.

Itu lah sedikit pengenalan Ansible dari kami, berikutnya akan lebih menarik lagi. Tunggu bagian selanjutnya !

 

UPDATE:

Bagian ke empat telah terbit


Avatar photo

Bramandityo Prabowo

Suka makan dan tentu saja suka masak. Tertarik dengan Functional Programing, Distributed System, Network Security, Operating System Customization, Virtualization dan NoSQL. Language of choices nya adalah Python, Bash, Go, Erlang, Nimlang. Rust dan Ocaml.