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.
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)
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
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
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.
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.
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.
-
Masalah encoding pada ansible playbook Terkadang kita perlu melakukan hit API pada playbook dan umumnya menggunakan sintaks
curl
. Namun ada kondisi dimanacurl
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 sintakscurl
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