Network Automation with Ansible
ขอยินดีต้อนรับทุกท่าน เข้าสู่บทความแรกของ Blog แห่งนี้ครับ จุดประสงค์หลักของ Blog นี้คือ สอนวิธีการใช้งาน Network Automation ในแบบที่เข้าใจง่ายๆ เพราะเชื่อว่าทุกคนที่ทำงานในสาย Network Engineer ทุกคนน่าจะเคยได้ยินเรื่อง Automation มาบ้าง แต่ปัญหาคือ แล้วจะเริ่มยังไงดีละ ต้องเริ่มจากภาษา Python หรือเปล่า, RestAPI คืออะไร, เขียน Program ไม่เป็นจะทำได้ไหม เป็นต้น
ผมก็เป็นคนหนึ่งที่ประสบปัญหาพวกนี้อยู่เหมือนกัน ทั้งไม่เข้าใจเรื่อง Stucture ของการทำ Programing จะเริ่มใหม่ก็ไม่มีเวลามากพอ จนมาได้รู้จักกับ Ansible ซึ่งเป็น Automation Tool ที่ใช้งานได้ง่าย ไม่ได้เป็น Programing จ๋า เหมาะกับสาย Network Engineer ที่อยากเริ่มพัฒนา สกิล ด้าน Automation ถ้าอ่านมาถึงตรงนี้ หลายคนคงเริ่มสนใจแล้วว่า Ansible มันดียังไง
What is Ansible?
เริ่มแรกเลย Ansible เป็น Tool ที่ถูกคิดค้นขึ้นมาเพื่อทำ System Automation และในช่วงแรกๆ ที่เริ่มทำเป็น Commercial Software ก็ได้ Red Hat Linux เข้ามาสนับสนุน โดยตัว Ansible Tool นั้นสามารถทำงานได้บน OS ฝั่ง Linux เกือบแทบทุกตัวที่นิยม ไม่ว่าจะเป็นฝั่ง Red Hat, Fedora, Centos หรือ ฝั่ง SuseLinux, Ubuntu, Debian โดยตัว Tool Ansible นั้นสามารถ Download มาใช้งานได้ฟรี แต่ถ้าต้องการ Support ในด้านเทคนิค หรือทำเป็น Scale ขนาดใหญ่ ก็สามารถซื้อ Subscription ผ่าน Redhat ซึ่งมีทั้งแบบที่เป็น Simple Ansible หรือแบบที่ทำใน Scale ขนาดใหญ่ที่มีชื่อว่า Red Hat Ansible Tower
จุดเด่นของ Ansible ที่ทำให้มันได้รับความนิยมคือ ตัว Ansible เองทำงานแบบ Agentless ถ้าพูดแบบง่ายๆ คือ มันทำงานกับอุปกรณ์ปลายทางได้ โดยเราไม่ต้องไปลง Client เพื่อไว้ทำการติดต่อ ซึ่งทำให้เราไม่ต้องกังวลว่า Agent จะ Compattible กับเครื่องปลายทางไหม หรือ ถ้าลงแล้วมีปัญหาจะต้องทำยังไง การทำงานของ Ansible ทุกอย่างนั้น จะอยู่บนเครื่องที่เป็น Control Node ซึ่งก็อาจจะเป็นเครื่อง PC หรือ Notebook ธรรมดาก็ได้ ทำการยิงคำสั่งออกไปยังปลายทางอย่างเช่น SSH หรือ NETCONF เป็นต้น
Ansible Component
ส่วนประกอบหลักในการใช้งาน Ansible คือ Playbook และ Inventory
Inventory
เป็น File ที่เก็บข้อมูลของ อุปกรณ์ปลายทาง(Router, Switch, Server, etc.) ที่เราจะใช้ Ansible เข้าไปจัดการ โดย File มักนิยมเขียนในรูปแบบ INI ซึ่งอ่านเข้าใจได้ง่าย ถ้าใครนึกไม่ออก ก็ลองดูตามตัวอย่างข้างล่างนี้ครับ
จากตัวอย่าง inventory เราจะเห็นได้ว่า Inventory File ของ Ansible ค่อนข้างยืดหยุ่นพอควร โดยสามารถใช้ได้ทั้งในรูปแบบ IP Address หรือ FQDN (แบบเป็นชื่อ) ในกรณีที่เรามี DNS Server และยังสามารถจัด Group อุปกรณ์ได้ โดยใช้ syntax ดังต่อไปนี้
[Parent-name:children]
โดยที่ Parent-Name เราจะตั้งเป็นชื่อ Group ที่เราต้องการ และตามด้วย :children เพื่อระบุว่าเป็นชื่อ Group นั่นเอง สังเกตว่าใน INI format ชื่อหัวข้อจะต้องถูกครอบด้วย […] เสมอ
[Start:End]
อีก Trick นึงที่ใช้ย่นจำนวนข้อมูล Inventory คือ range syntax [A:B] หรือถ้าพูดง่ายๆ คือให้มันรันชื่อตามลำดับไปเรื่อยๆ แทนที่จะมานั่งเขียนทีละรายการเช่น ถ้าเรามี Server ชื่อ DB1 — DB9 แทนที่เราจะเขียนทีละรายการ 9 บรรทัด ก็เขียนย่อเพียง DB[1:9]
Playbook
เป็นส่วนประกอบหลักของ Ansible และเป็นส่วนที่ไว้ระบุว่าเราอยากให้ Ansible ทำอะไรกับอุปกรณ์ปลายทางบ้าง โดย Format ที่ใช้ในการเขียน Playbook นั้นมีชื่อว่า YAML (อ่านว่า แยมมวล) ซึ่งตัวอย่างหน้าตา YAML นั้น สามารถดูได้จากรูปข้างล่างนี้ครับ
---
- name: "Configure Device"
hosts: dc1
roles:
- Juniper.junos
connection: local
gather_facts: no
tasks:
- name: "Configure op script"
juniper_junos_config:
config_mode: "private"
load: "set"
lines:
- "set system scripts op file bgp.slax"
register: response
- name: "Print the config changes"
debug:
var: response.diff_lines
*https://www.juniper.net/documentation/en_US/junos-ansible/topics/topic-map/junos-ansible-configuration-loading-committing.html
ส่วนประกอบหลักใน File YAML นั้นจะมีด้วยกัน 3 ส่วนดังต่อไปนี้ครับ
- name : เป็นชื่อของ Playbook หรือถ้าจะเรียกง่ายๆ ก็เป็นชื่อ Function ที่เราสามารถตั้งได้เอง โดยใน หนึ่ง File YAML สามารถมีได้หลาย Playbook (เหมือนเขียน program แล้วมีหลาย object หรือ function ในนั้น)
- hosts : ชื่อหรือ IP address ของอุปกรณ์ปลายทางที่เราจะทำการยิง script ไปหามัน ซึ่ง ในส่วนนี้จะอ้างอิงจาก file inventory ที่เราสร้างในขั้นต้นอีกทีหนึ่ง
- tasks : ส่วนประกอบหลักเลยของ file YAML จะเป็นตัวบอกว่า script นี้จะทำอะไรบ้าง เช่น สร้าง vlan 100–200 หรือทำการ เก็บ log เฉพาะส่วนที่สนใจแล้วส่งไปเก็บไว้ในเครื่องปลายทางที่กำหนด เป็นต้น
สำหรับในคราวถัดไป เราจะมาเริ่มตั้งแต่การติดตั้ง Ansible ตั้งแต่เครื่องเปล่าๆ เลย สามารถติดตามตอนต่อไปได้จาก Link ข้างล่างนี้เลยครับ