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