Melanjutkan posting sebelum nya tentang ansible, kali ini kita akan mencoba beberapa module dan notasi-notasi baru seperti notify, with_items, dan lain sebagainya.

Agar percobaan kita semakin menarik maka kali ini kita akan menggunakan studi kasus membuat web hosting sederhana dengan memanfaatkan Nginx.

Mari kita mulai setahap demi setahap. Web hosting yang akan kita bangun ini memberikan akses ssh untuk setiap user yang ada. Kita akan membuat playbook yang akan menambahkan user ke dalam server, membuat direktori html sebagai webroot nya dan membuat setting untuk virtual host di Nginx dan mengarahkannya ke direktori html yang dibuat sebelumnya. Bagian terakhir adalah melakukan restart pada service nginx.

Buat file hosting.yaml dan isi dengan text sebagai berikut :

- name: Build Hosting
  hosts: all
  become: true
  become_user: root

  tasks:
    - name: Create User
      ansible.builtin.user:
        name: "{{ user }}"
        group: www-data
        password: "{{ passwd | password_hash('sha512', 'mysecretsalt') }}"
        shell: /bin/bash
    
    - name: Create HTML Directory
      ansible.builtin.file:
        name: "/home/{{ user }}/html"
        owner: "{{ user }}"
        group: www-data
        state: directory
    
    - name: Apply Nginx Settings
      ansible.builtin.template:
        src: nginx.j2
        dest: "/etc/nginx/sites-enabled/{{ user }}"
      notify:
        - restart nginx
  
  handlers:
    - name: restart nginx
      ansible.builtin.service:
        name: nginx
        state: restarted

Pada playbook di atas kita akan berkenalan dengan empat macam module dari Ansible dan tiga notasi tambahan yaitu handlers, notify dan penggunaan environment variable.

Pada bagian pertama tasks kita dapat perhatikan terdapat penggunaan module ansible.builtin.user. Module ini digunakan untuk melakukan manajemen pengguna pada sistem target. Kita memberikan argumen pada penggunaan module tersebut antara lain:

  • name. argumen ini akan menjadi nama user. Dalam kasus ini nama usernya akan dinamis diambil dari envorinmen variable bernama user. Notasi yang digunakan adalah {{ <nama-variable }}.
  • group, argumen ini akan menjadi nama grup dari user yang dibuat. Karena pengguna ini hanya akan berkerja dengan webhosting maka tidak perlu adanya hak akses sudo. Untuk itu di putuskan memasukan user tersebut ke group www-data.
  • password, argumen ini akan menjadi password untuk pengguna yang bersangkutan. Password juga diambil dari environmen variable passwd , kemudian dimasukan ke dalam fungsi password_hash agar menghasilkan bentuk password string yang sudah dihash.
  • shell, argumen ini digunakan untuk menentukan shell apa yang akan dipakai oleh pengguna tersebut.

Pada bagian kedua task kita dapat perhatikan penggunaan module ansible.builtin.file. Module ini digunakan untuk membuat direktori atau file. Dalam kasus ini kita akan membuat direktori html yang akan menjadi webroot dari setiap domain yang ada. Kita memberikan argumen pada module tersebut antara lain:

  • name,. argumen ini akan menentukan dimana nantinya file atau direktori dibuat.
  • owner, menentukan siapa pemilik dari direktori tersebut. Sangat penting untuk menyesuikan pemilik direktori sesuai dengan user yang dibuat karena perintah ansible ini dieksekusi oleh root.
  • group, menentukan group pemilik dari direktori tersebut
  • state, memberi tahu kepada modul bahwa kita menginginkan pembuatan direktori bukan file

Pada bagian ketiga kita menggunakan module ansible.builtin.template. Modul ini berguna untuk membuat file pada target server berdasarkan template yang sudah ada. Kita memberikan argumen pada modul tersebut antara lain:

  • src, argumen ini akan memberikan informasi dimana letak file template yang akan kita gunakan
  • dest, argumen ini akan menunjukan dimana file tersebut di letakan.

pada module tersebut kita juga menggunakan notasi notify. Notasi ini akan menjalankan handlers yaitu restart nginx apabila modul tersebut mendeteksi adanya perubahan.

Selanjutnya masih pada direktori yang sama buatlah file nginx.j2 dan isi dengan text seperti berikut ini

server {
        listen 80;
        server_name {{ user }}.hosting.vm;

        location / {
                alias /home/{{ user }}/html/;
                autoindex on;
        }
}

Mari saatnya kita mencoba menambahkan user dengan perintah berikut ini

ansible-playbook -i hosts.ini -e user=sate -e passwd=sate hosting.yaml
PLAY [Build Hosting] ****************************

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

TASK [Create User] ******************************
changed: [ubuntu_server]

TASK [Create HTML Directory] ********************
changed: [ubuntu_server]

TASK [Apply Nginx Settings] *********************
changed: [ubuntu_server]

RUNNING HANDLER [restart nginx] *****************
changed: [ubuntu_server]

PLAY RECAP **************************************
ubuntu_server              : ok=5    changed=4

Dapat kita lihat bahwa skrip tersebut telah membuat user, kemudian membuat direktori html , membuat setting pada nginx dan terakhir melakukan restart pada layanan nginx.

Saat nya kita mencoba, pertama pada komputer yang akan mengakses hostingan itu kita harus merubah file /etc/hosts sehingga domain yang diset tadi dapat di ping.

Selanjutnya tinggal kita buka browser dan arahkan untuk membuka http://<nama-user>.hosting.vm.

Apabila berhasil harusnya muncul tampilan seperti ini

Dan user yang tadi diset juga bisa mengakses server hosting sederhana ini dengan perintah ssh <user>@<ip-server> untuk melakukan manajeman website nya. Contohnya ssh [email protected].

Selamat mencoba dan tunggu lagi update selanjutnya

 

UPDATE:

Bagian ke lima 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.