DevOps
สมัยผมทำร้านเน็ต SiamCafe เนี่ย เซิร์ฟเวอร์เพียบ! ทั้งเซิร์ฟเวอร์เกม เซิร์ฟเวอร์เว็บ เซิร์ฟเวอร์ proxy โอ๊ย สารพัดจะเซิร์ฟ สมัยนั้นยังไม่มี Cloud แบบทุกวันนี้ด้วยนะ การจัดการเซิร์ฟเวอร์แต่ละตัวนี่คือ "กรรม" เลยครับ ต้อง ssh เข้าไปทีละเครื่องๆ ทำอะไรซ้ำๆ เดิมๆ จนเบื่อโลก
แล้ว Ansible เนี่ย มันคืออะไร? มันคือเครื่องมือ Automation ที่ช่วยให้เราจัดการเซิร์ฟเวอร์จำนวนมากได้ง่ายๆ เหมือนสั่งงานลูกน้อง (ที่เชื่อฟังมากๆ) ด้วยชุดคำสั่งที่เราเขียนไว้ล่วงหน้า ไม่ต้อง ssh ไม่ต้องลง Agent ให้วุ่นวาย แค่มี SSH Key ก็จบ!
ทำไมมันถึงสำคัญ? ลองคิดดูว่าถ้าเรามีเซิร์ฟเวอร์ 100 เครื่อง แล้วต้องอัพเดท Package หรือแก้ไข Configuration ไฟล์ เราต้องทำซ้ำๆ 100 รอบ! Ansible ช่วยให้เราทำทั้งหมดนี้ได้ใน "คลิกเดียว" ประหยัดเวลา ลดความผิดพลาด แถมยังทำให้ชีวิต DevOps ง่ายขึ้นเยอะ
Ansible ทำงานแบบ Agentless ครับ นั่นหมายความว่าเราไม่ต้องลงโปรแกรมอะไรเพิ่มเติมบนเซิร์ฟเวอร์เป้าหมายเลย Ansible จะใช้ SSH ในการเชื่อมต่อไปยังเซิร์ฟเวอร์ และส่งชุดคำสั่ง (ที่เรียกว่า Playbook) ไปรันบนนั้น
Playbook คือไฟล์ YAML ที่เขียนชุดคำสั่งที่เราต้องการให้ Ansible ทำ เช่น ติดตั้ง Package, แก้ไขไฟล์ Configuration, Restart Service หรือแม้แต่สร้าง User Account
ตัวอย่าง Playbook ง่ายๆ ที่ใช้ติดตั้ง Apache Web Server:
---
- hosts: webservers
become: true
tasks:
- name: Install Apache
apt:
name: apache2
state: present
- name: Start Apache
service:
name: apache2
state: started
enabled: true
โค้ดด้านบนบอก Ansible ว่า ให้เชื่อมต่อไปยังเซิร์ฟเวอร์ในกลุ่ม "webservers" (เราต้องกำหนดไว้ในไฟล์ Inventory ว่ามีเซิร์ฟเวอร์อะไรบ้าง) แล้วให้ใช้สิทธิ์ root (become: true) จากนั้นให้ติดตั้ง Apache (apt: name: apache2 state: present) และ Start Service (service: name: apache2 state: started enabled: true)
ก่อนที่เราจะเริ่มใช้ Ansible ได้ เราต้องเตรียมตัวก่อนนิดหน่อย:
การติดตั้ง Ansible ก็ง่ายๆ ครับ บน Ubuntu/Debian ก็แค่:
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
ส่วนการสร้าง SSH Key ก็:
ssh-keygen -t rsa
แล้วก็ Copy SSH Public Key ไปใส่ในไฟล์ ~/.ssh/authorized_keys บนเซิร์ฟเวอร์เป้าหมาย
สุดท้ายคือการแก้ไข Inventory File (ปกติจะอยู่ที่ /etc/ansible/hosts) เพื่อกำหนดเซิร์ฟเวอร์ที่เราจะควบคุม เช่น:
[webservers]
webserver1 ansible_host=192.168.1.101
webserver2 ansible_host=192.168.1.102
[dbservers]
dbserver1 ansible_host=192.168.1.103
เท่านี้เราก็พร้อมที่จะเริ่มใช้ Ansible ได้แล้ว!
หลังจากที่เราเตรียมทุกอย่างเรียบร้อยแล้ว เราก็สามารถ Run Playbook ที่เราสร้างไว้ได้เลย โดยใช้คำสั่ง:
ansible-playbook your_playbook.yml
Ansible ก็จะเริ่มทำงานตามที่เรากำหนดไว้ใน Playbook และแสดงผลลัพธ์ให้เราเห็น ถ้าทุกอย่างเรียบร้อยดี เราก็จะเห็นข้อความ "ok" หรือ "changed" แสดงขึ้นมา
ถ้ามีอะไรผิดพลาด Ansible ก็จะแจ้ง Error ให้เราทราบ เราก็ต้องไปแก้ไข Playbook หรือตรวจสอบการตั้งค่าต่างๆ ให้ถูกต้อง
Ansible Modules คือ "ตัวช่วย" ที่ทำให้เราทำงานต่างๆ ได้ง่ายขึ้น Modules แต่ละตัวจะมีความสามารถเฉพาะทาง เช่น apt สำหรับจัดการ Package บน Debian/Ubuntu, service สำหรับจัดการ Service, file สำหรับจัดการไฟล์ และอื่นๆ อีกมากมาย
เราสามารถใช้ Modules เหล่านี้ใน Playbook ของเรา เพื่อสั่งให้ Ansible ทำงานต่างๆ ได้อย่างง่ายดาย
ตัวอย่างการใช้ Module copy เพื่อ Copy ไฟล์จาก Control Node ไปยัง Managed Node:
- name: Copy configuration file
copy:
src: /path/to/local/file.conf
dest: /path/to/remote/file.conf
owner: root
group: root
mode: '0644'
Module copy จะ Copy ไฟล์ /path/to/local/file.conf จากเครื่อง Control Node ไปยัง /path/to/remote/file.conf บนเครื่อง Managed Node พร้อมทั้งกำหนด Owner, Group และ Permission ให้ถูกต้อง
Ansible มี Modules ให้เราเลือกใช้มากมาย ครอบคลุมงานต่างๆ ที่เราต้องทำในการจัดการเซิร์ฟเวอร์ ลองเข้าไปดูใน Ansible Documentation ได้เลยครับ
ถ้า Modules ที่มีอยู่ยังไม่ตอบโจทย์ เราก็สามารถสร้าง Custom Modules ขึ้นมาเองได้ Ansible รองรับการเขียน Modules ด้วยภาษา Python หรือภาษาอื่นๆ ที่สามารถ Execute บนเซิร์ฟเวอร์ได้
การสร้าง Custom Modules อาจจะดูยากนิดหน่อย แต่ถ้าเราเข้าใจหลักการทำงานของ Ansible แล้ว ก็ไม่ยากเกินไปแน่นอน
Playbook ที่ซับซ้อนมากๆ อาจจะทำให้เรางงได้ง่าย Ansible Roles คือวิธีแก้ปัญหา Roles ช่วยให้เราแบ่ง Playbook ออกเป็นส่วนๆ ที่เรียกว่า Roles แต่ละ Role จะรับผิดชอบงานเฉพาะอย่าง เช่น ติดตั้ง Web Server, Configure Database, Setup Firewall
การใช้ Roles ทำให้ Playbook ของเราเป็นระเบียบ อ่านง่าย แก้ไขง่าย และนำกลับมาใช้ใหม่ได้ง่าย
โครงสร้างของ Role จะเป็นแบบนี้:
roles/
webserver/
tasks/
main.yml
handlers/
main.yml
templates/
vars/
main.yml
defaults/
main.yml
meta/
main.yml
การใช้งาน Roles ใน Playbook ก็ง่ายๆ ครับ แค่ระบุชื่อ Role ที่เราต้องการใช้:
---
- hosts: webservers
roles:
- webserver
Ansible ก็จะไป Execute Task ต่างๆ ที่อยู่ใน Role webserver
Roles เป็นเครื่องมือที่ช่วยให้เราจัดการ Playbook ที่ซับซ้อนได้ง่ายขึ้น ถ้า Playbook ของคุณเริ่มใหญ่ขึ้นเรื่อยๆ ลองใช้ Roles ดูนะครับ แล้วคุณจะติดใจ!
อยากรู้เรื่อง IT เพิ่มเติม? แวะไปอ่านบทความอื่นๆ ได้ที่ SiamCafe Blog นะครับ
| เครื่องมือ | Agentless | ภาษาที่ใช้ | Learning Curve | ความซับซ้อน | เหมาะกับ |
|---|---|---|---|---|---|
| Ansible | ใช่ | YAML | ปานกลาง | ปานกลาง | Configuration Management, Application Deployment |
| Chef | ไม่ใช่ | Ruby | สูง | สูง | Configuration Management, Infrastructure as Code |
| Puppet | ไม่ใช่ | Ruby | สูง | สูง | Configuration Management, Infrastructure as Code |
| SaltStack | ใช่ | YAML | ปานกลาง | ปานกลาง | Configuration Management, Remote Execution |
ดูวิดีโอเพิ่มเติมเกี่ยวกับAnsible Automation ทำงานอัตโนม:
Ansible เป็น Open Source ครับ ใช้งานได้ฟรี แต่ก็มี Red Hat Ansible Automation Platform ที่เป็น Commercial Version ที่มี Features เพิ่มเติม เช่น Dashboard, Analytics และ Support
Ansible เหมาะกับทุกคนที่ต้องการจัดการเซิร์ฟเวอร์จำนวนมาก ไม่ว่าจะเป็น DevOps Engineer, System Administrator หรือ Developer
Ansible ไม่ได้ยากอย่างที่คิดครับ ถ้าเรามีความรู้พื้นฐานเกี่ยวกับ Linux และ YAML ก็สามารถเรียนรู้ Ansible ได้ไม่ยาก
สมัยก่อนผมทำร้านเน็ต SiamCafe Blog ไม่มีเครื่องมือแบบนี้ให้ใช้ ชีวิตลำบากกว่านี้เยอะเลย!
สมัยผมทำร้านเน็ตฯ จัดระเบียบสาย LAN นี่สำคัญสุดๆ Ansible ก็เหมือนกัน โครงสร้าง Directory นี่แหละตัวแปรสำคัญ ทำให้ชีวิตง่ายขึ้นเยอะ
ผมแนะนำให้แบ่งตามนี้เลย:
ansible_project/
├── inventory/ # hosts และ group_vars
│ ├── hosts
│ └── group_vars/
│ └── all.yml # ตัวแปร global
├── playbooks/
│ ├── webserver.yml
│ └── database.yml
├── roles/
│ ├── webserver/
│ │ ├── tasks/
│ │ │ └── main.yml
│ │ ├── handlers/
│ │ │ └── main.yml
│ │ ├── vars/
│ │ │ └── main.yml
│ │ └── templates/
│ │ └── nginx.conf.j2
│ └── database/
│ └── ...
└── ansible.cfg # Config หลัก
ทำแบบนี้แล้ว เวลาแก้ config หรือเพิ่ม Role ใหม่ ชีวิตจะง่ายขึ้นเยอะ เชื่อผม!
Ansible ต้องทำซ้ำได้ โดยไม่ทำให้ระบบพัง! นี่คือสิ่งที่เรียกว่า Idempotency สมัยก่อน restart เครื่อง Server บ่อยๆ เพราะลงโปรแกรมผิดพลาด Ansible ช่วยแก้ปัญหานี้ได้
ลองดู code ตัวอย่าง:
- name: Install Apache
apt:
name: apache2
state: present
notify: Restart Apache
- name: Restart Apache
service:
name: apache2
state: restarted
Code นี้จะ Install Apache เฉพาะตอนที่ยังไม่ได้ Install และ Restart Apache เฉพาะตอนที่ config เปลี่ยน
Roles คือ module ขนาดใหญ่ ที่รวม tasks, handlers, vars, templates ไว้ด้วยกัน ทำให้ code เราเป็นระเบียบและ reuse ได้ง่าย สมัยก่อน copy config file วนไปวนมา Ansible ช่วยให้ชีวิตดีขึ้นเยอะ
สร้าง Role ง่ายๆ ด้วยคำสั่ง:
ansible-galaxy init webserver
แล้วเอา tasks, handlers, vars, templates ไปใส่ใน directory ที่ถูกต้อง แค่นี้ก็ได้ Role แล้ว
Ansible Playbooks และ Roles ควรเก็บไว้ใน Git เสมอ! เหมือนตอนเขียนโปรแกรมร้านเน็ตฯ ทุกอย่างต้อง backup ไว้ ไม่งั้นหายหมด เสียลูกค้าแย่เลย
Commit code บ่อยๆ และใช้ Branch ให้เป็นประโยชน์ เวลาเจอปัญหา จะได้ย้อนกลับไปแก้ไขได้ง่าย
Ansible Open Source 100% ครับ! แต่ Red Hat ก็มี Ansible Automation Platform ที่เป็น Enterprise Version ซึ่งมี features เพิ่มเติม เช่น Web UI, Analytics
Ansible ทำได้หลายอย่าง! ตั้งแต่ Provisioning Server, Configuration Management, Application Deployment ยัน Automation งาน IT ทั่วไป สมัยก่อนลง Windows เองทีละเครื่อง Ansible ช่วยได้เยอะ!
Ansible เป็น Agentless! ไม่ต้องลง Agent บน Server เป้าหมาย แค่มี SSH ก็พอ ส่วน Chef/Puppet ต้องลง Agent ก่อน
นอกจากนี้ Ansible ยังใช้ง่ายกว่า เพราะใช้ YAML ในการเขียน Playbooks
ไม่ยากอย่างที่คิด! Syntax YAML ง่าย และ Ansible มี Documentation ที่ดีมาก ลองเริ่มจาก Tutorial ง่ายๆ แล้วค่อยๆ เรียนรู้ไปเรื่อยๆ SiamCafe Blog มีบทความ Ansible อยู่ลองเข้าไปอ่านดูได้นะ
Error นี้เกิดจากการที่ Ansible ไม่รู้จัก Host Key ของ Server เป้าหมาย วิธีแก้คือ:
ssh-keyscan your_server_ip >> ~/.ssh/known_hosts
หรือปิด Host Key Checking ชั่วคราว (ไม่แนะนำ):
ansible-playbook your_playbook.yml -e 'ansible_ssh_common_args="-o StrictHostKeyChecking=no"'
Ansible คือ Tool ที่ช่วยให้เรา Automate งาน IT ได้ง่ายและมีประสิทธิภาพ สมัยผมทำ iCafeForex ถ้ามี Ansible ชีวิตคงง่ายขึ้นเยอะ! ลองเอาไปใช้ดู แล้วชีวิตจะดีขึ้นจริงๆ
SiamCafe.net — แหล่งความรู้ด้าน IT, Network, Security, Programming อันดับ 1 ของไทย ก่อตั้งตั้งแต่ปี 1997 โดย อ.บอม ผู้เชี่ยวชาญด้าน IT Infrastructure และ Forex Trading มากกว่า 25 ปี บทความทุกชิ้นเขียนจากประสบการณ์จริงในวงการ IT ประเทศไทย