Cara Membuat Drama dan Buku Pedoman yang Mungkin - Bagian 5


Dalam Bagian 5 Seri Ansible ini, kami akan menjelaskan cara membuat Permainan Ansible dan Playbook menggunakan modul Ansible.

Ansible dikirimkan dengan skrip mandiri yang disebut modul yang digunakan dalam playbook untuk pelaksanaan tugas khusus pada node jarak jauh.

Modul berguna untuk mengotomatiskan tugas-tugas seperti pengelolaan paket, pengarsipan, dan penyalinan file, dan masih banyak lagi. Mereka memungkinkan Anda melakukan penyesuaian pada file konfigurasi dan mengelola perangkat seperti router, switch, penyeimbang beban, firewall, dan sejumlah perangkat lainnya.

Tujuan subtopik ini adalah memberi Anda gambaran umum tentang berbagai tugas yang dapat diselesaikan dengan Modul yang mungkin:

Manajemen Paket di Linux

Manajemen paket adalah salah satu tugas paling penting dan sering dilakukan oleh administrator sistem. Ansible dikirimkan bersama modul yang membantu Anda menjalankan tugas manajemen paket baik di sistem berbasis RedHat dan Debian.

Mereka relatif mudah ditebak. Terdapat modul apt untuk manajemen paket APT berbasis Debian, modul yum lama untuk manajemen paket YUM dan modul dnf yang terkait dengan distribusi RHEL yang lebih baru .

Berikut adalah beberapa contoh bagaimana modul dapat digunakan dalam buku pedoman:

Contoh 1: Menginstal Server Web Apache di RHEL 8

---
- name: install Apache webserver
  hosts: webservers

  tasks:
       - name: install httpd
         dnf:  
          name: httpd  
          State: latest

Contoh 2: Menginstal Server Web Apache di Debian 10

---
- name: install Apache webserver
  hosts: databases

  tasks:
       - name: install Apache webserver
         apt:  
          name: apache2  
          State: latest

Modul Layanan

Modul layanan memungkinkan administrator sistem untuk memulai, menghentikan, memperbarui, meningkatkan, dan memuat ulang layanan pada sistem.

Contoh 1: Memulai Server Web Apache

---
- name: Start service httpd, if not started
  service:
    name: httpd
    state: started

Contoh 2: Menghentikan Server Web Apache

---
- name: Stop service httpd
  service:
    name: httpd
    state: stopped

Contoh 3: Memulai Ulang Antarmuka Jaringan enp2s0

---
- name: Restart network service for interface eth0
  service:
    name: network
    state: restarted
    args: enp2s0

Salin Modul

Seperti namanya, modul salin menyalin file dari satu lokasi di mesin jarak jauh ke lokasi berbeda di mesin yang sama.

Contoh 1: Menyalin File dari Lokal ke Remote Linux

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Playbook menyalin file konfigurasi tecmint.conf dari direktori /etc/files/ ke direktori /srv/ sebagai tecmint pengguna dengan izin 0644.

Izin juga dapat direpresentasikan menggunakan representasi simbolik seperti yang ditunjukkan pada baris terakhir.

Contoh 2: Menyalin File dari Lokal ke Remote Linux

---
- name: Copy file with owner and permissions
  copy:
    src: /etc/files/tecmint.conf
    dest: /srv/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: u=rw, g=r, o=r

Izin pada contoh sebelumnya dapat direpresentasikan seperti yang ditunjukkan pada baris terakhir, Pengguna diberi izin baca dan tulis, grup diberi izin menulis, dan izin lainnya dunia diberi izin membaca.

Modul Berkas

Modul file digunakan untuk melakukan banyak operasi file termasuk membuat file & direktori, menetapkan izin file, dan mengatur symlink.

Contoh 1: Lakukan Izin File Linux

---
- name: Change file ownership, group, and permissions
  file:
    path: /etc/tecmint.conf
    owner: tecmint
    group: tecmint
    mode: '0644'

Pemutaran di atas membuat file bernama tecmint.conf di direktori /etc yang menyetel izin ke 0644.

Contoh 2: Hapus File Linux

---
- name: Remove file (delete file)
  file:
    path: /etc/tecmint.conf
    state: absent

Ini menghapus atau menghapus file tecmint.conf.

Contoh 3: Buat Direktori

---
- name: create a directory if it doesn’t exist
  file:
    path: /etc/mydirectory
    State: directory
    mode: '0777'

Ini akan membuat direktori di direktori /etc yang mengatur izin ke 0777.

Contoh 4: Menghapus Direktori Secara Rekursif

---
- name: Recursively deleting a  directory
  file:
    path: /etc/tecmint.conf
    state: absent

Permainan di atas secara rekursif menghapus direktori.

Modul Lineinfile

Modul lineinfile berguna ketika Anda ingin mengubah satu baris dalam sebuah file. Itu dapat menggantikan jalur yang ada.

Contoh 1: Memanipulasi File di Linux

---
 - name: Ensure SELinux is set to enforcing mode
  lineinfile:
    path: /etc/selinux/config
    regexp: '^SELINUX='
    line: SELINUX=disabled

Permainan di atas menetapkan nilai SELINUX menjadi dinonaktifkan.

SELINUX=disabled

Contoh 2: Mengubah File di Linux

---
- name: Add a line to a file if the file does not exist, without         passing regexp
  lineinfile:
    path: /etc/hosts
    line: 10.200.50.51 linux-console.net
    create: yes

Ini menambahkan entri 10.200.50.51 linux-console.net ke file /etc/hosts.

Modul Arsip

Modul Arsip digunakan untuk pembuatan arsip terkompresi dari satu atau beberapa file. Ini mengasumsikan sumber kompresi ada di tujuan target. Setelah diarsipkan, file sumber nantinya dapat dihapus atau dihapus menggunakan pernyataan remove=True.

Contoh 1: Buat File Arsip

- name: Compress directory /path/to/tecmint_dir/ into /path/to/tecmint.tgz
  archive:
    path: /path/to/tecmint_dir
    dest: /path/to/tecmint.tgz

This compresses the /path/to/tecmint_dir  directory to /path/to/tecmint.tgz

Contoh 2: Buat File Arsip dan Hapus

- name: Compress regular file /path/to/tecmint into /path/to/foo.gz and remove it
  archive:
    path: /path/to/tecmint
    dest: /path/to/tecmint.tgz
    remove: yes

Dalam pemutaran di atas, file sumber /path/to/tecmint dihapus setelah pengarsipan selesai.

Contoh 3: Membuat File Arsip

- name: Create a bz2 archive of /path/to/tecmint
  archive:
    path: /path/to/tecmint
    format: bz2

Ini akan membuat file terkompresi dalam format bz2 dari file /path/to/tecmint.

Modul Git

Modul ini mengelola git checkout dari repositori perangkat lunak.

Contoh 1: Periksa Repositori Git

- git:
    repo: 'https://foosball.example.org/path/to/repo.git'
    dest: /srv/checkout
    version: release-0.22

Modul Komando

Salah satu modul yang paling umum digunakan, modul perintah mengambil nama perintah dan kemudian diikuti dengan daftar argumen. Perintahnya diteruskan dengan cara yang sama seperti Anda mengetik di shell Linux.

Contoh 1: Jalankan Perintah

- name: Executing a command using the command module
  command: cat helloworld.txt

Contoh 2: Periksa Uptime Linux Jarak Jauh

---
 - name: Check the remote host uptime
    hosts: servers
    tasks:
      - name: Execute the Uptime command over Command module
        register: uptimeoutput
        command: "uptime"

- debug:
          var: uptimeoutput.stdout_lines

Modul perintah mengambil waktu aktif server jarak jauh.

Variabel untuk Mengambil Hasil Perintah yang Berjalan

Biasanya, pedoman Ansible digunakan untuk menjalankan tugas pada host terkelola tanpa menampilkan output pada baris perintah. Namun, ada kalanya Anda mungkin diminta untuk menangkap keluaran atau hasilnya. Di bagian ini, kami memandu Anda tentang cara menangkap keluaran pedoman dalam sebuah variabel dan kemudian menampilkannya.

Register yang memungkinkan digunakan untuk menangkap keluaran tugas dan menyimpannya sebagai variabel. Variabel tersebut selanjutnya akan berisi stdout tugas.

Sebagai contoh, mari kita asumsikan bahwa Anda ingin memeriksa penggunaan disk dari node yang dikelola di masing-masing direktori root menggunakan perintah df -Th /. Anda akan menggunakan modul 'command' untuk mendefinisikan perintah dan 'register' untuk menyimpan output std dalam sebuah variabel.

Untuk menampilkan perintah, Anda akan menggunakan modul 'debug' bersama dengan nilai kembalian stdout.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout

Sekarang, mari kita jalankan pedomannya. Dalam hal ini, kami menamai playbook kami check_disk_space.yml.

ansible-playbook check_disk_space.yml

Seperti yang Anda lihat, hasilnya campur aduk dan menyulitkan untuk ditindaklanjuti.

Untuk menyelaraskan keluaran dan membuatnya lebih mudah dibaca, ganti nilai kembalian stdout dengan stdout_lines.

---

 - hosts: all
   become: yes

   tasks:
     - name: Execute /boot usage on Hosts
       command: 'df -Th /'
       register: df

     - debug: var=df.stdout_lines

Gunakan Persyaratan untuk Mengontrol Eksekusi Putar

Sama seperti dalam bahasa pemrograman, pernyataan kondisional digunakan ketika lebih dari satu hasil yang mungkin terjadi. Mari kita lihat beberapa pernyataan kondisional yang umum digunakan dalam buku pedoman Ansible.

Pernyataan kapan

Terkadang, Anda mungkin ingin melakukan tugas pada node tertentu dan bukan pada node lain. Pernyataan kondisional 'when' cukup mudah digunakan dan diimplementasikan dalam buku pedoman. Saat menggunakan klausa 'when' cukup deklarasikan kondisi yang berdekatan dengan klausa seperti yang ditunjukkan:

when: condition

Jika kondisinya terpenuhi, maka tugas dilakukan pada sistem jarak jauh.

Mari kita lihat beberapa contoh:

Contoh 1: Menggunakan Operator When

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian”

Permainan di atas menginstal server web Nginx pada host yang menjalankan distro keluarga Debian.

Anda juga dapat menggunakan operator OR dan AND di samping pernyataan kondisional kapan.

Contoh 2: Menggunakan Operator AND dengan Kapan

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” and
           ansible_distribution_version == “18.04”

Saat menggunakan operator AND, kedua pernyataan harus dipenuhi agar tugas dapat dijalankan.

Permainan di atas menginstal Nginx pada Nodes yang menjalankan OS keluarga Debian yaitu versi 18.04. Jelas sekali, ini adalah Ubuntu 18.04.

Contoh 3: Menggunakan Operator OR dengan Kapan

Dengan operator OR, tugas dijalankan jika salah satu kondisi terpenuhi.

---
- hosts: all

  tasks:
  - name: Install Nginx on Debian
     apt: name=nginx state=present
     when: ansible_os_family == “Debian” or
	      Ansible_os_family == “SUSE”

Permainan di atas menginstal server web Nginx pada OS keluarga Debian atau SUSE atau keduanya.

CATATAN: Selalu pastikan untuk menggunakan tanda persamaan ganda == saat menguji suatu kondisi.

Persyaratan dalam loop

Persyaratan juga dapat digunakan dalam satu lingkaran. Katakanlah misalnya Anda memiliki daftar beberapa paket yang perlu diinstal pada node jarak jauh.

Pada playbook di bawah ini, kita memiliki array bernama packages yang berisi daftar paket yang perlu diinstal. Tugas-tugas ini akan dilakukan satu demi satu jika klausa wajib disetel ke True.

---
 - name: Install Software packages
    hosts: all
    vars:
	packages:
    • name: nginx
required: True
    • name: mysql
required: True
    • name: apache
required: False



   tasks:
    • name: Install “{{ item.name }}”on Debian
apt: 
 name: “{{ item.name }}”
 state: present 
When: item.required == True
loop: “{{ packages }}”  

Konfigurasikan Penanganan Kesalahan

Terkadang, tugas gagal saat menjalankan buku pedoman. Anggaplah Anda menjalankan 5 tugas di 3 server seperti yang ditunjukkan pada pedoman di bawah. Jika kesalahan terjadi pada tugas 3 (Memulai MySQL) di server 2, Ansible akan berhenti menjalankan tugas yang tersisa di server 2 dan mencoba menyelesaikan tugas yang tersisa di server lainnya.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>

- name: Install MySQL database
<< some code >>

- name: Start MySQL
<< some code >>

- name: Install Nginx
<< some code >>

- name: Start Nginx
<< some code >>

Jika Anda menginginkan konsistensi dalam eksekusi playbook, misalnya menghentikan eksekusi playbook, jika salah satu server gagal, tambahkan opsi.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   any_errors_fatal:  true
   tasks:

Dengan cara ini, jika satu tugas gagal di satu server, Ansible akan menghentikan eksekusi seluruh pedoman di semua server dan keluar.

Jika Anda ingin playbook mengabaikan kesalahan dan melanjutkan menjalankan rangkaian tugas lainnya, gunakan opsi ignore_errors: True.

---
 - name: Install Software packages
   hosts: server1, server2, server3
   tasks:
- name: Install dependencies
<< some code >>
     ignore_errors: True

Buat Playbook untuk Mengonfigurasi Sistem ke Keadaan Tertentu

Di bagian ini, kita melihat beberapa opsi tambahan yang tersedia saat menjalankan playbook.

Mari kita mulai dengan mode Periksa atau opsi Lari uji coba. Opsi uji coba atau mode pemeriksaan digunakan saat menjalankan buku pedoman untuk memeriksa apakah ada kesalahan yang akan ditemui dan apakah ada perubahan yang akan dilakukan pada host yang dikelola. Namun, hal ini tidak membuat perubahan apa pun pada node jarak jauh.

Misalnya, untuk menjalankan dry run playbook bernama httpd.yml yang menginstal dan memulai pengoperasian server web Apache:

ansible-playbook httpd.yml --check

Opsi lain yang perlu kita perhatikan adalah opsi --start-at-task. Ini digunakan ketika menentukan nama tugas yang harus dimulai atau dimulainya buku pedoman.

Mari kita ambil contoh: Buku pedoman di bawah ini menjelaskan 2 tugas: Permainan pertama menginstal server web Apache dan yang kedua menginstal utilitas htop.

---
 - name: Install httpd

   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

- name: Install htop

      yum:  
      name: htop
      state: started

Jika Anda ingin melewatkan instalasi server web Apache dan sebagai gantinya menginstal utilitas htop, jalankan:

ansible-playbook playbook.yml --start-at-task “Install htop”

Terakhir, Anda dapat menandai tugas atau permainan Anda dengan menambahkan opsi tag ke buku pedoman Anda seperti yang ditunjukkan. Ini berguna ketika Anda memiliki pedoman yang cukup besar dan Anda ingin menjalankan tugas tertentu dari keseluruhan pedoman.

---
 - name: Install httpd
   tags: Install and start
   hosts: all
   tasks:
    yum:	 
name: httpd
     state: Installed

   tags: Install

    • service: 
name: httpd
state: started
ansible-playbook playbook.yml -tags "Install"

Untuk menghilangkan tag gunakan opsi --skip-tags seperti yang ditunjukkan.

ansible-playbook playbook.yml --skip-tags "Install"
Kesimpulan

Dalam topik ini, kami membawa Anda mempelajari modul-modul yang umum digunakan di Ansible, cara mengambil stdout dari eksekusi playbook untuk dianalisis, menggunakan kondisional di playbook, dan cara mengelola kesalahan yang mungkin terjadi saat menjalankan tugas. Terakhir, kami merangkum konfigurasi pedoman dan bagaimana Anda dapat menggunakan opsi tambahan untuk memutuskan tugas mana yang akan dijalankan jika Anda tidak ingin menjalankan seluruh pedoman.