Ansible Fundamental - Sesi 2

Ansible Playbook

Dalam praktek lapangan kita akan banyak menjalankan banyak module/tugas sekaligus, di sini untuk mempermudah masalah ini kita bisa menggunakan Ansible Playbook dimana kita mendefinisikan banyak module dalam satu file YAML.

Oke selanjutnya kita coba buat file Ansible Playbook yang tugas awal ini kita menginstall Web server Nginx dan menjalankan file index.html,buatlah file dengan nama playbook-webserver.yaml.

- name: Playbook setup web server
  hosts: server_test
  become: true
  become_method: sudo
  tasks:
    - name: Update repository
      ansible.builtin.apt:
        update_cache: true
    - name: Install nginx
      ansible.builtin.apt:
        name: nginx
        state: present
    - name: Start Nginx
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: true
    - name: Copy file html
      ansible.builtin.copy:
        src: ./web/
        dest: /var/www/html/
        mode: '604'

jika sudah di buat jalankan dengan perintah

$ ansible-playbook playbook-webserver.yaml

Ansible Playbook Variables

Terkadang kita memerlukan konfigurasi kepada hal yang sama, contoh kita membuat nama user pada **task 1,**pada task ke 2 kita membuat grub dengan nama user yang sama kita dapat membuat nya sebagai variables untuk mendefinisikan sekali saja.

playbook-webserver-vars.yaml

- name: Playbook setup web server
  hosts: server_test
  become: true
  vars: # mendefinisikan variable
    user_app: ansibleweb
  tasks:
    - name: Install nginx
      ansible.builtin.apt:
        name: nginx
        state: present
    - name: Buat User {{ user_app }}
      ansible.builtin.user:
        name: "{{ user_app }}"
        password: belajaransible
        shell: /bin/bash
    - name: Copy file html
      ansible.builtin.copy:
        src: ./web/
        dest: /var/www/html/
        mode: '604'
        owner: "{{ user_app }}"
        group: "{{ user_app }}"
$ ansible-playbook playbook-webserver-vars.yaml

terlihat file index.html sudah kita rubah owner menggunakan user ansibleweb dan group ansibleweb.

karena playbook menggunakan format YAML sebenarnya kita bisa menggunakan variable dalam bentuk boolean, list dan dictionary jika dibutuhkan.

Ansible Conditional

Terkadang pada kondisi tertentu kita menemui task yang bisa menyesuaikan keadaan yang kita tuliskan di playbook. Contoh menginstall Nginx di distro Ubuntu/debian menggunakan APT, namun jika di distro centos/redhat meggunakan YUM.

Ansible memiliki kemampuan untuk membuat semacam "if-else" di pemrograman yang bernama Conditional.

Sama seperti if conditionals pada umumnya kita dapat menggunakan operasi logical operator seperti and, or, not dan comparision operator seperti >=, <=,==

playbook-webserver-when.yaml

---
- name: Playbook setup web server
  hosts: server_test
  become: true
  gather_facts: true # defaultnya memang true
  vars: # mendefinisikan variable
    user_app: ansibleweb
  tasks:

    ## Install nginx
    - name: Install nginx (Debian)
      ansible.builtin.apt:
        name: nginx
        state: present
      when:
        - ansible_os_family == "Debian"
        - ansible_processor_cores >= 0.25 or ansible_memory_mb.real.total >= 512
    - name: Install nginx (Alpine)
      community.general.apk:
        name: nginx
        state: present
      when:
        - ansible_os_family == "Alpine"
        - ansible_processor_cores >= 0.25 or ansible_memory_mb.real.total >= 512

    ## Buat user
    - name: Buat user (Debian) {{ user_app }}
      ansible.builtin.user:
        name: "{{ user_app }}"
        password: belajaransible
        shell: /bin/bash
      when:
        - ansible_os_family == "Debian"
    - name: Buat user (Alpine) {{ user_app }}
      ansible.builtin.user:
        name: "{{ user_app }}"
        password: belajaransible
        shell: /bin/sh
      when:
        - ansible_os_family == "Alpine"

    ## Copy file html
    - name: Copy file html (Debian)
      ansible.builtin.copy:
        src: ./web/
        dest: /var/www/html/
        mode: '604'
        owner: "{{ user_app }}"
        group: "{{ user_app }}"
      when:
        - ansible_os_family == "Debian"
    - name: Copy file html (Alpine)
      ansible.builtin.copy:
        src: ./web/
        dest: /usr/share/nginx/html
        mode: '604'
        owner: "{{ user_app }}"
        group: "{{ user_app }}"
      when:
        - ansible_os_family == "Alpine"
$ ansible-playbook playbook-webserver-when.yaml

Secara default saat menjalankan playbook, Ansible akan mengambil informasi dari server tujuan terelebih dahulu sebelum mejalankan task yang akan dikerjakan.

Informasi tersebut diambil dan di simpan dalam sebuah variable yang dinamakan Facts. Jika ingin mengececek Facts secara manual untuk melihat informasi bisa menggunakan perintah ansible <pattern/host> -m ansible.builtin.setup.

$ ansible server_test -m ansible.builtin.setup

Terkadang kita hanya ingin menjalankan task task tersentu yang ada di suatu playbook. Misal kita sudah menginstall web server nginx, jadi kita hanya ingin menjalankan task copy file html untuk menghemat waktu.

Untuk mengatasi ini kita dapat menggunakan Tags.

untuk menjalankan nya kita dapat menggunakan command

$ ansible-playbook playbook-webserver-when.yaml --check --tags copy_file

atau bisa skip task selain yang di tentukan

$ ansible-playbook playbook-webserver-when.yaml --check --skip-tags copy_file

Ansible Loops

Pada ansible ada yang nama nya Loops, yang guna nya untuk menghindari duplikasi atau redundan dari konfigurasi YAML kita.

Contoh kita install php8.2, php8.2-cli, dll, nah ini kita membuat 3 task untuk menginstall 3 package tersebut.

playbook-php-loop.yaml

---
- name: Playbook setup PHP
  hosts: server_belajar
  become: true
  gather_facts: true # defaultnya memang true
  vars:
    taget_php_version: 8.2
  tasks:
    - name: Add repository for PHP
      ansible.builtin.apt_repository:
        repo: 'ppa:ondrej/php'
        state: present
      tags: prepare

    - name: Update repo
      ansible.builtin.apt:
        update_cache: true
      tags: prepare

    - name: Install php {{ taget_php_version }}
      ansible.builtin.apt:
        name: "{{ item }}"
        state: present
      with_items:
        - php{{ taget_php_version }}
        - php{{ taget_php_version }}-cli
        - php{{ taget_php_version }}-common
        - php{{ taget_php_version }}-imap
        - php{{ taget_php_version }}-redis
        - php{{ taget_php_version }}-xml
        - php{{ taget_php_version }}-zip
        - php{{ taget_php_version }}-mbstring
        - php{{ taget_php_version }}-curl
        - php{{ taget_php_version }}-gd
        - php{{ taget_php_version }}-bcmath
        - php{{ taget_php_version }}-gmp
        - php{{ taget_php_version }}-mysqli
      tags:
        - install
$ ansible-playbook playbook-php-loop.yaml

Ansible Vault

Pada Playbook sebelumnya kita membuat user beserta password secara transparan, menulis informasi yang sensitif tidak di izinkan apalagi jika di production.

Untuk memproteksi hal yang sifatnya sensitif sebaiknya kita menggunakan Vault di ansible. Dengan menggunakan Vault data2 yang senstif tersebut akan di enkripsi sehingga jauh lebih aman.

$ ansible-vault create secret-user.yaml

nanti akan terbentuk file baru dengan nama secret-user.yaml yang isinya akan angka acak seperti ini.

Setelah kita mendefinisikan varibale di encrypted file selanjutnya bagaimana kita memanggil variable tersebut di file playbook kita

Agar variable tersebut dapat digunakan di playbook kita perlu melakukan parsing variable tersebut dengan module ansible.builtin.include_vars.

playbook-vault.yaml

---
- name: Playbook buat user baru
  hosts: server_test
  become: true
  gather_facts: true # defaultnya memang true
  vars: # mendefinisikan variable
    user_app: userbaru
  tasks:

    - name: Parsing variable dari secret file
      ansible.builtin.include_vars:
        file: secret-user.yaml

    - name: Add new user
      ansible.builtin.user:
        name: "{{ user_app }}"
        # password: belajaransible # gak secure kita ganti pake Ansible Vault

        password: "{{ user_pass | password_hash('sha512') }}" # ambil value dari variable lalu lakukan hash
        shell: /bin/bash
      when:
        - ansible_os_family == "Debian"
$ ansible-playbook playbook-vault.yaml --ask-vault-pass

jika kita perlu mengedit isi dari file yang enkripsi bisa dengan command

$ ansible-vault edit secret-user.yaml

atau melihat isi dari file

$ ansible-vault view secret-user.yaml