Skip to content

Instantly share code, notes, and snippets.

@aridwan
Created December 6, 2021 06:12
Show Gist options
  • Save aridwan/ede3eef2f1fb514b23d3e96d38772429 to your computer and use it in GitHub Desktop.
Save aridwan/ede3eef2f1fb514b23d3e96d38772429 to your computer and use it in GitHub Desktop.

Ansible Overview

Ansible digunakan untuk melakukan otomatisasi konfigurasi pada beberapa server. Ansible digunakan pada project HELIO untuk melakukan konfigurasi secara otomatis pada server development saat menjalankan pipeline pada Jenkins.

Prerequisite

Untuk menjalankan Ansible, ada beberapa hal yang perlu disiapkan :

  • Instalasi Ansible pada Host yang akan menjalankan
  • Setup Inventory file
  • Setup SSH-key untuk tiap host yang akan di-Ansible (jika ingin menggunakan SSH)

Instalasi Ansible

Untuk instalasi Ansible ikuti langkah-langkah dibawah ini :

  • Update repository
    sudo apt get update
    
  • Add Ansible repository
    sudo apt-add-repository ppa:ansible/ansible
    
  • Update repository (again)
    sudo apt-get update
    
  • Install Ansible
    sudo apt-get install ansible -y
    
  • Install Python Karena Ansible menggunakan Python sebagai intepreter maka pada Host Ansible membutuhkan Python.
    sudo apt-get install python -y
    

Setup Inventory File

Inventory file digunakan untuk menentukan Host dengan IP mana saja yang akan kita akses lewat Ansible. Secara default inventory file ansible terletak pada /etc/ansible/hosts. Isi dari inventory file kurang lebih sebagai berikut.

[server]
192.168.43.123
192.168.43.125

[production]
production.co.id
production2.com

...

server dan production pada contoh diatas dapat diganti sesuai kebutuhan, nantinya akan digunakan pada Ansible-playbook sebagai alamat yang akan dikonfigurasi secara otomatis. Pada masing-masing alamat juga bisa diparsingkan variable sesuai kebutuhan, misal untuk login dengan user dan password maka dapat ditambahkan variable user dan password.

[server]
148.231.98.12 ansible_user=ubuntu ansible_password=password
148.231.98.163 ansible_user=ubuntu2 ansible_password=password2

Setup SSH Key

Karena Ansible sesungguhnya mengakses SSH host yang akan ditarget, maka dari itu perlu menambahkan ssh key dari Host ansible ke authorized_keys dari host yang akan dikonfigurasi. Sebenarnya hal ini bisa diganti dengan menambahkan variable user dan password, namun agar user dan password tidak muncul pada source code maka penggunaan SSH key sangat membantu.

Untuk membuat SSH key pada host Ansible jalankan perintah

ssh-keygen

Kemudian untuk meng-copy SSH key dari Host Ansible ke host yang akan dikonfigurasi jalankan perintah

ssh-copy-id {NODE_IP}

NODE_IP adalah alamat IP yang akan dikonfigurasi secara otomatis dengan script Ansible

Untuk menguji apakah Host ansible dapat mengakses SSH dari Node dengan SSH key, jalankan perintah

ssh {USER}@{NODE_IP}

Jika berhasil, maka akan dapat mengakses SSH tanpa harus memasukkan username dan password.

Using Ansible

Memastikan ansible dapat berjalan di masing-masing node

Untuk memastikan Ansible dapat menjangkau semua Node yang ada pada inventory file jalankan perintah

ansible -m ping all

Jika ingin menggunakan file inventory yang dibuat sendiri tambahkan menjadi

ansible -i {YOUR_INVENTORY_FILE} -m ping all

Jika Ansible sukses menjangkau masing-masing Node yang diberikan, Ansible akan merespon

192.43.122.98 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
},
211.10.22.110 | SUCCESS => {
    "changed": false, 
    "ping": "pong"
}

Jika masing-masing node sudah merespon dengan pong maka dari Host Ansible sudah dapat menjalankan ansible-playbook ke masing-masing node.

Ansible playbook

Perintah-perintah yang akan di otomatisasi dengan Ansible dituliskan pada Ansible playbook. Ansible playbook berupa file .yaml yang nantinya akan di translate menjadi syntax python pada masing-masing node. Contoh ansible playbook dapat dilihat dibawah

#playbook.yaml
---
- name: Build to server
  hosts: development
  tasks:
    - name: add swift as hostname
      shell: bash -c 'echo "swift" > "/etc/hostname"'
    - name: add swift to host
      shell: bash -c 'echo "127.0.0.1 localhost localhost.localdomain swift" > "/etc/host"'
    - name: set noninteractive
      shell: export DEBIAN_FRONTEND=noninteractive
    - name: Install tools for adding key
      apt:
        name: "{{ tools }}"
        allow_unauthenticated: yes
      vars:
        tools:
        - software-properties-common
        - lsb-release
        - curl
        - wget
        - python-pip
        - xvfb
        - x11-utils
    - name: Install bzt
      pip:
        name: bzt
    ...

Ansible memiliki beberapa modul yang bisa digunakan, untuk modul-modul yang dapat digunakan bisa dilihat pada dokumentasi Ansible. Setelah selesai membuat playbook selanjutnya jalankan playbook dengan perintah

ansible-playbook playbook.yaml

jika menggunakan inventory file buatan sendiri dapat tambahkan -i {YOUR_INVENTORY_FILE} pada perintah diatas.

Frequently Asked Error

  • Masalah encoding pada ansible playbook Terkadang kita perlu melakukan hit API pada playbook dan umumnya menggunakan sintaks curl. Namun ada kondisi dimana curl tersebut harus melakukan parse body dalam bentuk JSON.

    curl -i -XPOST http://localhost:8080/dkim \
    -H 'Content-type: application/json' \
    -d '{
        "domain": "example.com",
        "selector": "oct17",
        "description": "Key for marketing emails",
        "privateKey": "-----BEGIN RSA PRIVATE KEY-----\r\n..."
    }'

    untuk dapat membuat perintah tersebut pada ansible perlu diperhatikan encoding dari file playbook tersebut. Sebenarnya Ansible memiliki modul uri yang mana dapat memudahkan kita untuk melakukan request pada alamat API tertentu, namun untuk saat ini modul tersebut terkadang masih memiliki bug. Solusi dari masalah tersebut yang muncul pada problem HELIO adalah membuat sebuah file .txt yang berisikan sintaks curl yang akan diekseskusi kemudian menambahkan executable pada file tersebut lalu mengeksekusinya. salah satu contoh dapat dilihat pada potongan playbook berikut.

    - name: Write script to register DKIM key to API
      become_user: root
      shell: |
        echo "curl -i -XPOST {{'http://localhost:8080/dkim?accessToken=accesstoken'}} \
        -H 'Content-type{{':'}} application/json' \
        -d '{ \"domain\"{{':'}} \"swift.id\", \"selector\"{{':'}} \"helio2019\", \"description\"{{':'}} \"Default Key for swift.id\"}' " > "/home/ubuntu/wildduck/dkimtest.txt"
    - name: Modify execute script to register DKIM key to API
      shell: chmod +x /home/ubuntu/wildduck/dkim.sh
    - name: Execute script to register DKIM key to API
      shell: /home/ubuntu/wildduck/dkim.sh

    sintaks {{':'}} digunakan karena sintaks .yaml tidak memperbolehkan penggunaan : sedangkan kita membutuhkannya untuk menuliskan json dari body request. Selain itu penggunaan \" juga digunakan karena jika " saja akan dianggap escape character.

  • Untuk host yang SSH dengan menggunakan file .pem Sebagai contoh untuk instance AWS EC2 yang membutuhkan .pem untuk mengakses SSH perlu ditambahkan variable pada file inventory seperti berikut.

    [host]
    ubuntu@your_instance_ip ansible_ssh_private_key_file=/path-to-key/key.pem
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment