DevOps
น้องๆ เคยเจอปัญหา config network ซ้ำๆ มั้ย? เปลี่ยน IP address เป็นร้อยๆ เครื่อง, แก้ VLAN, เพิ่ม user account... แค่คิดก็เหนื่อยแล้ว สมัยผมทำร้านเน็ต SiamCafe อ่ะนะ ต้องเดินไล่ config router ทีละตัว! ปวดหลังสุดๆ
Network Automation ก็คือการใช้เครื่องมือมาช่วยทำงานพวกนี้แหละ ทำให้เราไม่ต้องทำเองทุกอย่าง ลดเวลา ลดความผิดพลาด แถมยังทำซ้ำได้ง่ายด้วย
Ansible กับ Python เนี่ย เป็นพระเอกขี่ม้าขาวในเรื่องนี้เลยนะ Ansible เป็นเครื่องมือ automation ที่ใช้ง่าย ไม่ต้องลง agent ที่เครื่องปลายทาง ส่วน Python ก็เป็นภาษาโปรแกรมที่ยืดหยุ่น เอามาเขียน script ช่วย Ansible ได้อีก
สำคัญยังไงน่ะเหรอ? ลองคิดดูดิ จากที่เคยใช้เวลาเป็นวันๆ config router ตอนนี้เหลือแค่ไม่กี่นาที เอาเวลาไปทำอย่างอื่นที่สำคัญกว่าได้เยอะเลยนะ ที่สำคัญคือความผิดพลาดจะน้อยลงมากๆ เพราะเราเขียน script ไว้แล้ว ทำซ้ำกี่ทีก็เหมือนเดิม
อันนี้ขาดไม่ได้เลยนะ น้องๆ ต้องเข้าใจเรื่อง IP address, subnet mask, routing protocol, VLAN พวกนี้ก่อน ถ้าไม่เข้าใจพื้นฐาน พวก automation ก็จะกลายเป็นดาบสองคมได้นะ
Ansible ส่วนใหญ่จะ run บน Linux นะ ดังนั้นน้องๆ ควรจะคุ้นเคยกับ command line พื้นฐาน, การจัดการไฟล์, การติดตั้ง package อะไรพวกนี้ด้วย
ถึง Ansible จะไม่ต้องเขียน Python เยอะ แต่ถ้าเข้าใจ Python บ้าง จะช่วยให้เราปรับแต่ง Ansible ให้เข้ากับความต้องการของเราได้มากขึ้นเยอะเลยนะ รู้จัก variable, loop, function พวกนี้ก็โอเคแล้ว
Ansible เนี่ย ติดตั้งง่ายมากๆ บน Linux (macOS ก็ได้นะ) ใช้ package manager ของ distribution นั้นๆ ได้เลย
# บน Ubuntu/Debian
sudo apt update
sudo apt install software-properties-common
sudo apt-add-repository --yes --update ppa:ansible/ansible
sudo apt install ansible
# บน CentOS/RHEL
sudo yum install epel-release
sudo yum install ansible
หลังจากติดตั้งเสร็จแล้ว เราก็ต้องสร้างสิ่งที่เรียกว่า "inventory file" เป็นไฟล์ที่เก็บรายชื่อของอุปกรณ์ network ที่เราจะจัดการ
[routers]
router1 ansible_host=192.168.1.100 ansible_user=admin ansible_password=password
router2 ansible_host=192.168.1.101 ansible_user=admin ansible_password=password
[switches]
switch1 ansible_host=192.168.1.200 ansible_user=admin ansible_password=password
ในไฟล์ inventory เราสามารถแบ่งอุปกรณ์เป็นกลุ่มๆ ได้ด้วยนะ อย่างในตัวอย่าง เรามีกลุ่ม "routers" กับ "switches"
ลอง ping อุปกรณ์ใน inventory file ดูก่อน ว่า Ansible สามารถติดต่อกับอุปกรณ์ได้
ansible -m ping all
คำสั่งนี้จะ ping ทุกอุปกรณ์ใน inventory file ถ้าทุกอย่างถูกต้อง จะได้ผลลัพธ์เป็น "pong"
ลองรัน command ง่ายๆ บนอุปกรณ์ดู เช่น "show version"
ansible -m ios_command -a "commands=show version" routers
คำสั่งนี้จะรัน command "show version" บนอุปกรณ์ทั้งหมดในกลุ่ม "routers" Ansible จะ return ผลลัพธ์ของ command นั้นๆ กลับมาให้เรา
Playbook คือไฟล์ YAML ที่เก็บชุดคำสั่งที่เราต้องการให้ Ansible ทำ Playbook ช่วยให้เราทำงานที่ซับซ้อนได้ง่ายขึ้น
---
- name: Configure NTP server
hosts: routers
gather_facts: false
tasks:
- name: Set NTP server
ios_config:
lines:
- ntp server 192.168.1.1
Playbook นี้จะ config NTP server บนอุปกรณ์ทั้งหมดในกลุ่ม "routers"
สนใจเรื่อง Ansible เพิ่มเติม ลองดูที่ SiamCafe Blog นะครับ มีบทความดีๆ อีกเยอะเลย
Ansible ไม่ใช่เครื่องมือ automation ตัวเดียวในตลาดนะ ยังมีตัวเลือกอื่นๆ อีก เช่น Chef, Puppet, SaltStack แต่ละตัวก็มีข้อดีข้อเสียต่างกัน
Chef กับ Puppet จะซับซ้อนกว่า Ansible ต้องติดตั้ง agent ที่เครื่องปลายทาง แต่ก็มีความสามารถในการจัดการ configuration ที่ละเอียดกว่า
SaltStack ก็คล้ายๆ Ansible แต่มี architecture ที่แตกต่างกัน บางคนก็ชอบ SaltStack มากกว่า เพราะมันเร็วกว่า
| เครื่องมือ | ข้อดี | ข้อเสีย |
|---|---|---|
| Ansible | ใช้ง่าย, ไม่ต้องลง agent, เหมาะกับ network automation | ความสามารถในการจัดการ configuration อาจจะไม่ละเอียดเท่าตัวอื่น |
| Chef | จัดการ configuration ได้ละเอียด, มี community ขนาดใหญ่ | ซับซ้อน, ต้องลง agent |
| Puppet | คล้าย Chef, มี feature เยอะ | ซับซ้อน, ต้องลง agent |
| SaltStack | เร็ว, ยืดหยุ่น | อาจจะไม่ค่อยเป็นที่นิยมเท่าตัวอื่น |
สุดท้ายแล้ว การเลือกเครื่องมือ automation ขึ้นอยู่กับความต้องการของแต่ละคน ลองศึกษาดูหลายๆ ตัว แล้วเลือกตัวที่เหมาะกับเราที่สุด
อยากรู้เรื่อง IT เก๋าๆ แบบนี้อีก ไปอ่านต่อได้ที่ SiamCafe Blog นะน้อง
เอาล่ะน้องๆ มาถึงส่วนที่สำคัญที่สุดแล้ว คือเรื่องของ Best Practices หรือเคล็ดลับที่พี่บอมสั่งสมมาจากการทำ Network Automation ด้วย Ansible และ Python มานานโข บอกเลยว่าไม่ได้มีสอนในตำรานะ ส่วนใหญ่มาจากการ "เจ็บแล้วจำ" ทั้งนั้น
สมัยผมทำร้านเน็ต SiamCafe เนี่ย เรื่อง network สำคัญสุดๆ ร้านนึงมีเป็นสิบๆ เครื่อง router switch เพียบ! พอเครื่องไหนมีปัญหา ทีนี้วิ่งกันวุ่นวาย กว่าจะไล่เจอว่าสายหลุดตรงไหน config ผิดตรงไหน เสียเวลาไปเยอะมาก เลยเริ่มคิดว่า เฮ้ย! เราต้องทำอะไรซักอย่างเพื่อ automate งานพวกนี้ซะแล้ว
น้องๆ หลายคนอาจจะมองข้ามเรื่อง Version Control ไป คิดว่า code เราเอง ใครจะมาแก้ แต่เชื่อพี่เถอะ ชีวิตจริงมันไม่ง่ายขนาดนั้นหรอก
เคยไหม? แก้ config router ไปแล้วพัง! อยากย้อนกลับไป config เดิม แต่จำไม่ได้ว่าแก้ตรงไหนไปบ้าง? Git ช่วยชีวิตน้องได้! ทุกครั้งที่แก้ code หรือ playbook ให้อัพขึ้น Git (เช่น Github, Gitlab, Bitbucket) เสมอ จะได้ย้อนกลับไปแก้ไขได้ง่ายๆ
git init
git add .
git commit -m "Initial commit"
git remote add origin your_repository_url
git push -u origin main
Idempotency คือคุณสมบัติที่สำคัญมากของ Ansible คือไม่ว่าเราจะรัน playbook เดิมซ้ำกี่ครั้ง ผลลัพธ์ก็ต้องเหมือนเดิม
ยกตัวอย่างง่ายๆ สมมติเราต้องการสร้าง user ใหม่บน router ถ้า user นั้นมีอยู่แล้ว เราก็ไม่ควรจะไปสร้างซ้ำ (เพราะมันจะ error) Ansible module ส่วนใหญ่จะมีคุณสมบัติ Idempotent อยู่แล้ว แต่เราก็ต้องตรวจสอบให้ดี
- name: Create a new user
cisco.ios.ios_user:
name: new_user
password: my_secret_password
privilege: 15
state: present
ในตัวอย่างนี้ ถ้า user 'new_user' มีอยู่แล้ว Ansible จะไม่ทำอะไรเลย แต่ถ้าไม่มีก็จะสร้างให้
อย่าคิดว่าเขียน playbook เสร็จแล้วจะรันใช้งานจริงได้เลย! ต้อง Test ก่อนเสมอ! ไม่งั้นอาจจะเจอปัญหาใหญ่ได้
สมัยผมทำร้านเน็ต เคยเจอเคส config router ผิดพลาด ทำให้เน็ตทั้งร้านล่ม! ลูกค้าโวยวายกันใหญ่ เสียทั้งเงินเสียทั้งหน้า ตั้งแต่นั้นมาเลยเข็ด ต้อง Test playbook ทุกครั้งก่อนเอาไปใช้จริง
ใช้ Ansible Lint ช่วยตรวจสอบ syntax และ best practices หรือใช้ Molecule framework ในการทำ Integration Test เพื่อจำลองสภาพแวดล้อมจริงในการ Test playbook
อย่าลืม! Test, Test, Test!
ตอบ: เหมาะมากครับ! Ansible ใช้งานง่าย เรียนรู้ได้เร็ว และมี module ให้ใช้งานเยอะมาก แถมยัง Agentless อีกด้วย ไม่ต้องลง Agent บนอุปกรณ์ Network ให้วุ่นวาย
ตอบ: ไม่จำเป็นต้องรู้ลึกขนาดนั้นครับ แค่เข้าใจพื้นฐาน (เช่น variables, loops, conditionals) ก็เพียงพอแล้ว ส่วนที่เหลือก็ค่อยๆ เรียนรู้ไปพร้อมกับการใช้งาน
ตอบ: Ansible เหมาะกับการทำ Automation แบบง่ายๆ ที่ไม่ต้องเขียน code เยอะ ส่วน Python เหมาะกับงานที่ซับซ้อน ต้องการความยืดหยุ่นสูง แต่ถ้าใช้คู่กันจะยิ่งทรงพลังครับ!
ตอบ: นอกจาก Ansible และ Python แล้ว ลองศึกษา Netmiko ดูครับ เป็น Python library ที่ช่วยให้เรา Interact กับอุปกรณ์ Network ได้ง่ายขึ้นมากๆ
Network Automation ด้วย Ansible และ Python ไม่ใช่เรื่องยากอย่างที่คิด เพียงแค่เข้าใจหลักการพื้นฐาน ฝึกฝนบ่อยๆ และเรียนรู้จากประสบการณ์ ก็จะสามารถ automate งาน Network ได้อย่างมีประสิทธิภาพ
สิ่งที่สำคัญที่สุดคือ อย่ากลัวที่จะลองผิดลองถูก! เพราะการเรียนรู้ที่ดีที่สุดคือการลงมือทำเอง iCafeForex เป็นกำลังใจให้ทุกคนครับ!
อย่าลืมเข้าไปอ่านบทความอื่นๆ ใน SiamCafe Blog ด้วยนะครับ มีเรื่อง IT สนุกๆ อีกเยอะเลย