Network Automation with Ansible (Part 4)

Pichan Pratummal
2 min readMay 24, 2020

--

Let’s start coding!!

สำหรับใน Part ที่ 4 นี้จะเริ่มในส่วนการเขียน Ansible Playbook ขึ้นมาใช้งานจริงๆ แล้ว โดยตัวไฟล์ Script ที่เราจะเขียนขึ้นมานั้น ใน Ansible จะเรียกเจ้า File นี้ว่า Playbook ซึ่งถ้ายังจำกัดได้จาก Part-1 เจ้า File นี้คือ 1 ในส่วนประกอบสำคัญในการทำงานของ Ansible (อีก File คือ inventory)

Component in Playbook

แน่นอนว่าเหมือนการเรียนรู้ในภาษาของ Programing ตัว Playbook เองก็มีข้อบังคับหรือหลักการที่เราต้องยึดดังต่อไปนี้ครับ

ตัวอย่าง Playbook
  1. ขึ้นต้นด้วย ขีดกลาง 3 ขีด เสมอ
  2. ทุก Function ในการเขียน เมื่อมีการเรียกใช้ Function ย่อย หรือ ตัวแปร Variable จะต้องมีระยะเว้น (Indent) เท่ากันที่ “2 spacebar” เสมอ
กฏในการเขียน Playbook

สำหรับใครที่รู้สึกว่าไม่สะดวก ในการพิมพ์ spacebar 2 ครั้ง สามารถตั้งให้ tab ทำงานเป็นเหมือน spacebar 2 ครั้งได้ ด้วยการใช้ command ข้างล่างบน User Directory ของเราบน Linux ครับ

echo "autocmd FileType yaml setlocal ai ts=2 sw=2 et" >> .vimrc

3. ในหนึ่ง File Playbook สาารถมีหลาย “Play” ได้ เช่น

- name: Play1
hosts: Junos
tasks:
- name: Do Nothing Task1
- name: Play2
hosts: IOS
tasks:
- name: Do Nothing Task2

โดยตัว Playbook จะทำการทำงานไล่ตามลำดับจากบน ลง ล่าง ถ้าหากมี Error ในขั้นตอนไหนตัว Playbook จะหยุดทำงานในทันที (สามารถปรับได้ โดยใช้ Function Error Handling)

4. อย่างน้อยๆ ใน Playbook เราจะต้องมีส่วนประกอบของ ชื่อ Playbook (name), อุปกรณ์ปลายทาง(hosts) และ Function ที่จะใช้งาน (tasks) เป็นอย่างน้อย

5. ตัวแปร (Variable) จะถูกเรียกใช้เรียงลำดับจาก

ansible.cfg -> group or host variable file -> playbook file

ถ้ามีตัวแปรซ้ำกัน ตัวแปรที่อยู่ลำดับลึกที่สุดจะถูกเรียกใช้เสมอ เช่น ตัวแปรใน Playbook จะ override ตัวแปรใน ansible.cfg

Our First Playbook

เพื่อไม่ให้เป็นการเสียเวลา เรามาลองเริ่ม Basic Playbook ง่ายๆ กันเลยดีกว่าดังนี้ครับ

vim LAB1-Facts.yml

ใน ตัวอย่างนี้ เราจะใช้ Module Function ง่ายๆ ที่ชื่อว่า ios_facts (ถ้า router เราเป็น Juniper ก็ใช้ junos_facts นะครับ) โดย Module นี้จะให้ผลลัพธ์มาเป็นรายละเอียดของอุปกรณ์ปลายทาง และแสดงผลลัพธ์ออกมา ผ่านตัวแปรชื่อ “Facts_Result” บน Module ที่ชื่อว่า debug อีกทีหนึ่ง

โดย Default Ansible จะไม่แสดงผลลัพธ์ของ Module ยกเว้นว่าเราจะทำการเก็บผลลัพธ์ในตัวแปรด้วย การระบุ “register: VAR”

เมื่อทำการเขียน File เสร็จแล้วให้ทำการ Run Playbook ด้วย Command

ansible-playbook PLAYBOOK_FILE

จะเห็นได้ว่าตัว Ansible นั้นจะทำงานตามลำดับจากบนลงล่าง ดังนี้

  1. Module ios_facts (name: Get Facts) ทำการอ่านข้อมูลจากอุปกรณ์ (192.168.1.51 หรือแล้วแต่ที่เราจะบุในหัวข้อ hosts) และบันทึกลงใน ตัวแปร ชื่อ Facts_Result
  2. Module debug (name: Show Result) ทำการแสดงผลตัวแปร Facts_Result

ในตอนท้ายของการจบ Playbook ตัว Ansible จะรายงานผลออก มาด้วยสถานะดังต่อไปนี้

  • OK — แสดงถึงจำนวน Module ที่ทำการ Run สำเร็จ
  • Changed — แสดงถึง Module ที่ทำการ Run สำเร็จและมีการแก้ไขข้อมูล (จะเจอใน Module ที่มีการแก้ไข Configuration)
  • Failed — แสดงถึงจำนวน Module ที่ Run ไม่สำเร็จ หรือ ติดเงื่อนไข
  • Unreachable — ไม่สามารถติดต่ออุปกรณ์ปลายทางได้
  • skipped — แสดงถึงจำนวน Module ที่ถูกข้ามการทำงาน(จะเจอใน Playbook ที่มีการระบุเงื่อนไข “when” )

How to search for Module Name?

ปัจจุบันด้วยความนิยมที่เพิ่มขึ้น ทำให้มี Module สำหรับอุปกรณ์หลากหลายยี่ห้อ โดยเราสามารถดูรายชื่อ Module ทั้งหมดได้จาก

https://docs.ansible.com/ansible/latest/modules/list_of_network_modules.html

สำหรับใน Blog นี้จะขอเน้นแค่เพียง Module สำหรับ Cisco (IOS) และ Juniper (Junos) เท่านั้น ถ้าหากท่านไหนสนใจ Module สำหรับยี่ห้ออื่นๆ ก็สามารถอ่านรายละเอียดวิธีใช้ Module นั้นได้จาก Link ที่ให้ไปครับ

สำหรับในตอนหน้า เราจะมาลองใช้ Module อื่นๆ ที่สำคัญในการ Configure อุปกรณ์ รวมถึง Tip การเขียนแบบใช้ Loop เพื่อประหยัดเวลา และทำให้ Code เราดูไม่รก (และดูถึกไป :< ) กันครับ

→Network Automation with Ansible( Part 5)

--

--

No responses yet