DevOps
น้องๆ เคยเจอปัญหาไหม? สมัยผมทำร้านเน็ต SiamCafe เนี่ย ต้องลงโปรแกรมทีเป็นร้อยเครื่อง! คิดดูดิ ถ้าต้องมานั่งลงทีละเครื่อง มือหงิกพอดี! Ansible Playbook เนี่ยแหละคือพระเอกของเรา มันคือตัวช่วยในการจัดการและคอนฟิกเครื่องเซิร์ฟเวอร์ หรือคอมพิวเตอร์หลายๆ เครื่องพร้อมๆ กันแบบอัตโนมัติ
ลองนึกภาพนะ ถ้าเรามีสคริปต์ที่บอกว่า "ให้ลงโปรแกรม A, ตั้งค่า B, สร้างไฟล์ C" แล้วสั่งให้ Ansible รันสคริปต์นี้กับเครื่อง 100 เครื่องพร้อมกัน ปิ๊ง! ทุกอย่างเสร็จในพริบตา ประหยัดเวลาไปเยอะโขเลยล่ะ
ที่สำคัญคือ Ansible มัน "Idempotent" หมายความว่า รันซ้ำกี่ที ผลลัพธ์ก็เหมือนเดิม ไม่ต้องกลัวว่ารันแล้วจะเละเทะ สมัยผมดูแลระบบร้านเน็ต นี่สำคัญมาก เพราะบางทีไฟดับ ต้องมารันสคริปต์ซ้ำ ก็สบายใจได้ว่าทุกอย่างจะกลับมาเหมือนเดิม
Ansible Playbook เขียนด้วยภาษา YAML (YAML Ain't Markup Language) น้องๆ อาจจะงงว่ามันคืออะไร? ง่ายๆ มันคือภาษาที่เน้นให้อ่านง่าย เข้าใจง่าย คล้ายๆ JSON แต่สบายตากว่าเยอะ สมัยผมเริ่มใช้ Ansible ก็ต้องมานั่งทำความเข้าใจ YAML นี่แหละ แต่รับรองว่าไม่ยากอย่างที่คิด
ลองดูตัวอย่าง YAML ง่ายๆ:
---
- name: Install Apache
hosts: webservers
tasks:
- name: Install httpd package
yum:
name: httpd
state: present
เห็นไหม? อ่านแล้วพอจะเดาได้เลยว่ามันทำอะไรบ้าง
Inventory คือไฟล์ที่เก็บรายชื่อเครื่องที่เราจะจัดการด้วย Ansible ลองนึกภาพเป็นสมุดรายชื่อเพื่อนๆ ในร้านเน็ตเรา แต่ละเครื่องก็จะมี IP Address, ชื่อผู้ใช้, รหัสผ่าน (แต่สมัยนี้เขาไม่เก็บรหัสผ่านตรงๆ แล้วนะ ใช้ SSH Key กันหมด) การมี Inventory ทำให้ Ansible รู้ว่าจะต้องไปคุยกับเครื่องไหนบ้าง
ตัวอย่าง Inventory:
[webservers]
server1 ansible_host=192.168.1.10 ansible_user=root
server2 ansible_host=192.168.1.11 ansible_user=root
[databases]
db1 ansible_host=192.168.1.20 ansible_user=root
จากตัวอย่าง เราแบ่งเครื่องออกเป็นสองกลุ่ม `webservers` และ `databases` ทำให้เราสามารถสั่งงานเฉพาะกลุ่มได้
Modules คือเครื่องมือสำเร็จรูปที่ Ansible เตรียมไว้ให้เราใช้ทำงานต่างๆ เช่น ติดตั้งโปรแกรม, สร้างไฟล์, แก้ไขคอนฟิก ไฟล์, รีสตาร์ทเซอร์วิส สมัยผมทำร้านเน็ต ต้องเขียนสคริปต์เองหมด แต่ Ansible ทำให้ชีวิตง่ายขึ้นเยอะ
ตัวอย่างการใช้ module `yum` เพื่อติดตั้งโปรแกรม:
- name: Install httpd package
yum:
name: httpd
state: present
`yum` เป็น module สำหรับจัดการ package บน CentOS/RHEL `name` คือชื่อ package ที่ต้องการติดตั้ง `state: present` หมายถึงให้ติดตั้ง ถ้ายังไม่ได้ติดตั้ง
เริ่มต้นใช้งาน Ansible ไม่ยากอย่างที่คิด! สิ่งที่ต้องมีคือ:
บน Control Node ต้องติดตั้ง Ansible ก่อน (ลองหาใน Google ว่า "Install Ansible on [ชื่อ OS ของคุณ]" นะ)
สร้างไฟล์ชื่อ `install_apache.yml` (หรืออะไรก็ได้ที่สื่อถึงงานที่เราจะทำ) แล้วใส่โค้ด YAML ด้านล่างนี้:
---
- name: Install Apache on webservers
hosts: webservers
become: true
tasks:
- name: Install httpd package
yum:
name: httpd
state: present
- name: Start httpd service
service:
name: httpd
state: started
enabled: true
อธิบายโค้ด:
เปิด Terminal แล้วพิมพ์คำสั่ง:
ansible-playbook install_apache.yml
Ansible จะเริ่มทำงานตามที่เราสั่ง ถ้าไม่มีอะไรผิดพลาด Apache จะถูกติดตั้งและเปิดใช้งานบนเครื่อง `webservers` ใน Inventory ของเรา
หลังจาก Ansible รันเสร็จ ให้ลอง SSH เข้าไปในเครื่อง `webservers` แล้วตรวจสอบว่า Apache ทำงานอยู่จริงไหม
ถ้าทุกอย่างเรียบร้อย แสดงว่าเราทำสำเร็จแล้ว! ลองเข้าไปดูบทความอื่นๆ ใน SiamCafe Blog นะ มีเรื่อง IT อีกเยอะแยะเลย
ดูวิดีโอเพิ่มเติมเกี่ยวกับAnsible Playbook Advanced Guide:
Ansible ไม่ใช่เครื่องมือเดียวที่ใช้ทำ Infrastructure as Code ยังมีเครื่องมืออื่นๆ อีกมากมาย เช่น Chef, Puppet, SaltStack แต่ละตัวก็มีข้อดีข้อเสียต่างกันไป สมัยผมเลือกใช้ Ansible เพราะมัน "Agentless" คือไม่ต้องติดตั้งโปรแกรมอะไรบนเครื่อง Managed Nodes เลย แค่มี SSH ก็พอ
ลองดูตารางเปรียบเทียบง่ายๆ:
| เครื่องมือ | Agent | ภาษา | ความยาก | เหมาะกับ |
|---|---|---|---|---|
| Ansible | No | YAML | ง่าย | งานคอนฟิกทั่วไป, Deployment |
| Chef | Yes | Ruby | ปานกลาง | งานคอนฟิกที่ซับซ้อน, Compliance |
| Puppet | Yes | Puppet DSL | ปานกลาง | งานคอนฟิกขนาดใหญ่, Policy Enforcement |
| SaltStack | Yes | YAML, Python | ปานกลาง | งานคอนฟิกที่ต้องการความเร็ว, Real-time Control |
เลือกเครื่องมือที่เหมาะกับงานของเราที่สุด! อย่าลืมไปอ่านบทความอื่นๆ ใน SiamCafe Blog นะครับ!
สมัยผมทำร้านเน็ตเนี่ย เรื่องการจัดการเครื่องลูกข่ายสำคัญมาก ถ้าเครื่องไหนมีปัญหา ก็กระทบลูกค้า กระทบรายได้ Ansible Playbook ก็เหมือนกัน ถ้าเขียนไม่ดี รันไปแล้วพังทั้งระบบได้
ประสบการณ์สอนผมว่า การวางแผนล่วงหน้าสำคัญสุดๆ ก่อนจะเริ่มเขียน Playbook คิดให้ดีก่อนว่าเราต้องการอะไร จะจัดการอะไรบ้าง เขียนออกมาเป็นข้อๆ เลยยิ่งดี
ลองนึกภาพร้านเน็ตที่มีหลายโซน โซนเกม โซนทำงาน โซนดูหนัง แต่ละโซนก็ต้องมีโปรแกรม มีการตั้งค่าที่แตกต่างกัน Role ใน Ansible ก็เหมือนกัน
แยก Role ตามหน้าที่ของมันเลย เช่น Role สำหรับติดตั้ง Web Server, Role สำหรับติดตั้ง Database, Role สำหรับจัดการ Firewall แบบนี้จะทำให้ Playbook เราเป็นระเบียบ แก้ไขง่าย และนำกลับมาใช้ใหม่ได้
# roles/webserver/tasks/main.yml
- name: Install Apache
apt:
name: apache2
state: present
จำได้ว่าสมัยก่อน เวลาจะเปลี่ยน IP Address ของเครื่องลูกข่ายแต่ละเครื่อง ต้องมานั่งแก้ทีละเครื่อง เสียเวลามาก Variables ใน Ansible ช่วยแก้ปัญหานี้ได้
Variables คือตัวแปรที่เราสามารถกำหนดค่าต่างๆ ได้ เช่น ชื่อ User, Password, IP Address, Version ของโปรแกรม เวลาที่เราต้องการเปลี่ยนค่า ก็แค่แก้ Variables ที่เดียว ไม่ต้องแก้ทั้ง Playbook
# vars/main.yml
webserver_port: 8080
# tasks/main.yml
- name: Configure Apache Port
lineinfile:
path: /etc/apache2/ports.conf
regexp: "^Listen "
line: "Listen {{ webserver_port }}"
เคยไหม? แก้ไฟล์ Config ไป แล้วลืม Restart Service ทำให้ Config ที่แก้ไปไม่มีผล Handlers ใน Ansible ช่วยได้
Handlers คือ Tasks ที่จะทำงานก็ต่อเมื่อมี Tasks อื่นๆ แจ้ง (notify) ว่ามีการเปลี่ยนแปลงเกิดขึ้น เช่น ถ้าเราแก้ไฟล์ Config ของ Apache แล้ว เราก็ notify ให้ Handler Restart Apache Handler จะทำงานก็ต่อเมื่อมีคน notify เท่านั้น
# tasks/main.yml
- name: Configure Apache
template:
src: httpd.conf.j2
dest: /etc/apache2/apache2.conf
notify: Restart Apache
# handlers/main.yml
- name: Restart Apache
service:
name: apache2
state: restarted
สมัยทำร้านเน็ต ก่อนจะลงโปรแกรมอะไรใหม่ๆ ในเครื่องลูกข่ายทุกเครื่อง ผมต้อง Test ในเครื่อง Test ก่อนเสมอ Playbook ก็เหมือนกัน
ก่อนจะรัน Playbook กับ Production Server จริงๆ ให้ Test ใน Environment ที่เหมือนกับ Production ก่อนเสมอ จะได้มั่นใจว่า Playbook เราทำงานได้ถูกต้อง
Ansible Vault คือเครื่องมือสำหรับเข้ารหัสข้อมูลสำคัญ เช่น Password, API Key เพื่อไม่ให้ใครมาเห็นข้อมูลเหล่านี้ได้ เหมาะมากสำหรับเก็บข้อมูลที่ sensitive ใน Playbook
Ansible คือ Open Source Automation Engine ที่เราใช้เขียน Playbook และรันมัน Ansible Tower (ตอนนี้เปลี่ยนชื่อเป็น Red Hat Ansible Automation Platform) คือ Web UI ที่ช่วยให้เราจัดการ Ansible ได้ง่ายขึ้น เช่น กำหนดสิทธิ์การเข้าถึง, Schedule Playbook, ดู Log เป็นต้น
อ่าน Error Message ก่อนเลยครับ Ansible จะบอกว่า Error ตรงไหน บรรทัดไหน ลองแก้ตาม Error Message ดู ถ้าแก้ไม่ได้ ลอง Google ดู หรือถามใน Stack Overflow ก็ได้
Ansible เหมาะกับงาน Automation ทุกรูปแบบเลยครับ ตั้งแต่ Config Servers, Deploy Applications, จัดการ Cloud Infrastructure ไปจนถึง Automation งาน Routine ต่างๆ ใน IT
SiamCafe Blog มีบทความเกี่ยวกับ Ansible อยู่บ้าง ลองเข้าไปอ่านดูได้ นอกจากนี้ก็มี Documentation ของ Ansible เอง, Blog ของ Red Hat, และ Course Online ต่างๆ ครับ
Ansible Playbook เป็นเครื่องมือที่ทรงพลังมาก ถ้าเราใช้มันอย่างถูกต้อง มันจะช่วยให้เราทำงาน Automation ได้อย่างมีประสิทธิภาพ ลดเวลา ลดความผิดพลาด และเพิ่ม Productivity
อย่ากลัวที่จะลองผิดลองถูกครับ การเรียนรู้ที่ดีที่สุดคือการลงมือทำเอง ลองสร้าง Playbook ง่ายๆ ดูก่อน แล้วค่อยๆ พัฒนาไปเรื่อยๆ
ขอให้สนุกกับการใช้ Ansible นะครับ iCafeForex ก็ใช้ Ansible นะรู้ยัง!