Basic Ansible 101 Automate For Everything — Introduction
Ansible is a radically simple IT automation platform that makes your applications and systems easier to deploy. Avoid writing scripts or custom code to deploy and update your applications — automate in a language that approaches plain English, using SSH, with no agents to install on remote systems.
Introduction Ansible
Ansible คือ ซอฟแวร์ Open-Source ที่มีลักษณะเป็น Automation Engine ถูกพัฒนาด้วยภาษา Python โดยคำว่า “Engine” ผมจะต้องนึกถึงเครื่องยนต์ที่ค่อยขับเคลื่อนให้สิ่งที่เรียกว่า เครื่องจักรทำงานได้ แสดงว่าเราต้องหาหรือสร้าง เครื่องจักรเพื่อรองรับการทำงาน “Engine” เพื่อให้เครื่องจักรทำฟังก์ชันในสิ่งที่เราต้องการได้ เช่นเดียวกับ ภาพรูป จักรยานเอาเครื่องยนต์มาขับเคลื่อนนั้นเองครับ
Micheal DeHaan เป็นผู้พัฒนา Ansible โดยเค้าเป็นคนทำ Provisioning Server Application ชื่อ Cobbler และเป็น Co-Author ชื่อ Func อยู่แล้ว ข้อมูลเพิ่มเติมเกี่ยวกับต้นกำเนิดนะครับ (ขออนุญาตไม่เน้นนะครับ)
https://www.ansible.com/blog/2013/12/08/the-origins-of-ansible
Ansible Architecture
- Control node = เครื่องควบคุม
- Managed node หรือ Target node = เครื่องเป้าหมาย
Ansible ไม่จำเป็นต้องติดตั้ง Agent บนเครื่องเป้าหมายเลย (Agentless) แต่จะใช้ช่องทางเดียวกับที่คนใช้ในการ Remote หรือควบคุมเครื่องเป้าหมาย เช่น SSH และ WINRM เป็นต้น แล้วทำการส่ง Module ต่างๆ (เป็น software เล็กๆ หรืออาจจะเป็น Command ที่อุปกรณ์รองรับ) เข้าไปทำงาน (execute) บนเครื่องเป้าหมาย
โดยส่วนประกอบและคำศัพท์ที่ควรจะรู้ก่อน มีดังนี้
- Control Node คือ เป็นส่วนที่เราจะติดตั้งโปรแกรม Ansible เพื่อใช้ในการควบคุบหรือการตั้งค่าต่างๆ บนเครื่องเป้าหมาย
- Managed Nodes คือ เป็นเครื่องเป้าหมาย (target node) ที่จะถูกการควบคุบหรือการตั้งค่าต่างๆ
- Inventory คือ เป็นส่วนการเก็บข้อมูลต่างๆ ของเครื่องเป้าหมาย (target node) ซึ่งเป็นรูปแบบของไฟล์
- Modules คือ เป็นโปรแกรมหรือชุดคำสั่งที่เขียนขึ้นเพื่อทำงานตามฟังก์ชันต่างๆ ที่สามารถ Execute หรือเปิดบนเครื่องเป้าหมาย (target node)ได้ ซึ่งจะเขียนด้วยภาษาอะไรก็ได้ ที่สามารถใช้งานได้เครื่องเป้าหมาย
- Tasks คือ งานที่จะถูกทำงานผ่าน module บนเครื่องเป้าหมาย
- Plays คือ เป็นส่วนที่เอาไว้กำหนดการทำงานบน Playbooks
- Playbooks คือ เป็นส่วนการเก็บ Action หรือ Play หลายๆ ตัวไว้ในรูปแบบของ YAML ไฟล์
- Roles คือ เป็นส่วนที่แยกหน้าที่การทำงานของ Playbooks ต่างๆ เป็นสัดส่วน
- Handler คือ เป็น Task หนึ่งที่จะทำงานก็ต่อมีิ Task อ้างอิงด้วยคำสั่ง Notify ด้วยชื่อของ Handler Task นั้นๆ เหมือนเป็นการ Trigger ให้ทำงาน ตัวอย่างเช่น เมื่อมี Task เปลี่ยนแปลง Configuration ไฟล์ SSH แล้ว ต้องมีการ Restart SSH แต่ถ้าไม่มีการเปลี่ยนแปลง Configuration ก็ไม่ต้องทำการ Restart SSH ใหม่ เป็นต้น
- Variables คือ เป็นการกำหนดตัวแปร เพื่อเพิ่มความยืดหยุนในการทำงาน
Design Goal (แนวคิดในการออกแบบ)
- Minimal in nature คือ ในการจัดการระบบ (Management systems) นั้นเราไม่ควรเพิ่มความยุ่งยากเข้าไปในระบบอีกครับ
- Secure คือ Ansible ไม่มีการติดตั้ง Agent บน เครื่องเป้าหมาย ใช้ช่องทาง SSH หรือ WIMRM ฯลฯ เฉพาะนั้นมาตรฐานในความปลอดภัยก็จะอ้างอิงตามช่องทางในการควบคุมนั้นแหละครับ
- Low learning curve คือ ใช้เวลาน้อยในเรียนรู้การใช้งานเพราะรูปแบบการจะอ้างอิงตามพื้นฐานของ YAML และ Jinja templates ครับ
- Highly reliable คือ เนื่องจากไอเดียของหลักการทำงานแบบ “ idempotent” คือ Module จะทำงานก็ต่อเมื่อไม่ได้ใน Desired State (อยู่ในสถานะที่ต้องการ) ซึ่งต่อให้เราสั่ง Ansible ให้ทำงานสักกี่ครั้งผลลัพธ์ก็จะเหมือนเดิมทุกครั้งครับ
- Consistent คือ มีความคงเส้นคงวาเสมอ
A Common Automation Language of IT Everyone
จากรูป Ansible จะมาช่วยลดช่องว่างความเข้าใจระบบของคนในแต่ละส่วนงานได้ ส่งผลให้เกิดความถูกต้องของงานและช่วยเร่งให้งานเกิดความรวดเร็วมากขึ้น
ตัวอย่างเช่น ปัญหาสุด Classic ในองค์กรคือ ปัญหาการพัฒนา Software ของฝั่ง Developer และการ Deploy ระบบ ขึ้น Production โดยฝั่ง System Engineer มักมีปัญหาว่า Software ที่มีการพัฒนาแล้วมีการเปลี่ยนแปลง เมื่อกลับไป Deploy บน Production จะเกิดปัญหาว่า ไม่สามารถทำงานได้สมบูรณ์ สาเหตุหลักๆ จะเกิดมาจาก Environment ของการพัฒนา Software (DEV หรือ UAT) กับ Production ไม่เหมือนกันทั้งหมด หรือมีการตั้งค่าระบบบางอย่างไม่เหมือนกัน เป็นต้น
Ansible ถือว่าเป็นภาษามาตรฐานรูปแบบหนึ่ง ที่ทำให้เกิดการเชื่อมโยงหรือเชื่อมต่อของคนในแต่ละส่วนงานให้ใกล้ชิดกันการมากขึ้น ทำให้เกิดความเข้าใจกันและกันได้ง่ายมากขึ้น แน่นอนผลที่เกิดขึ้นคืองานที่ถูกต้องและช่วยเร่งให้งานเกิดความรวดเร็ว
Installation Ansible
วิธีการติดตั้งมีอยู่ 3 วิธีคือ
1. ติดตั้งผ่านทาง Package manager ของแต่ละ OS ( yum, apt หรือ อื่นๆ )
2. ติดตั้งผ่านทาง Pip (Python package manager) รองรับ Python 2 (2.6 หรือ 2.7) และ Python 3 (3.5 หรือสูงกว่า)
3. ติดตั้งผ่านทางการ Build Source Code ที่เครื่องเลย (ต้องลงตัว Compile ด้วย)
*** สำหรับการติดตั้ง Ansible ยังไม่รองรับ Windows OS Platform ครับ *****
แต่มีทางเลือกสำหรับ Ansible บน windows OS ได้เหมือนกันครับ ลงผ่าน Windows 10’s Subsystem for Linux หรือจะลงบน Cygwin บน Windows OS อีกทีได้เช่นกัน
http://docs.ansible.com/ansible/latest/intro_windows.html#using-a-windows-control-machine
เราลองทดสอบติดตั้งแบบง่ายๆ ด้วย Package manager ของ OS แล้วกันนะครับ
CentOS/Redhat OS:
$ sudo yum install -y epel-release
$ sudo yum install -y ansible
Ubuntu OS :
$ sudo apt-get update
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible
Fedora OS:
$ dnf install ansible
หลังการติดตั้งโปรแกรม Ansible เสร็จเรียบร้อย เราลองตรวจสอบเวอร์ชั่นด้วยคำสั่ง (ผมติดตั้งบน Ubuntu 16.04.2 LTS นะครับ)
root@control-node:~# ansible — version
ansible 2.4.2.0
config file = /etc/ansible/ansible.cfg
configured module search path = [u’/root/.ansible/plugins/modules’, u’/usr/share/ansible/plugins/modules’]
ansible python module location = /usr/lib/python2.7/dist-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.12 (default, Nov 20 2017, 18:23:56) [GCC 5.4.0 20160609]
root@control-node:~#
Ansible Configuration files
เพื่อให้เกิดความยืดหยุ่นในการใช้งานการปรับแต่งการตั้งค่าต่างๆ ของ Ansible ในการใช้งานในสถานการณ์แตกต่างกันนั้น ไม่ว่าจะเป็น user หรือ root บนระบบ เลยทำให้มีการกำหนดลำดับความสำคัญของการนำไฟล์ Configuration ไปใช้งาน โดยเรียงลำดับ ตั้งแต่ version 1.5 ขึ้นไป ดังนี้
- ANSIBLE_CONFIG คือ เป็นอ้างอิงไฟล์ ansible.cfg จากการกำหนดค่า Full Path บน Environment Variable ครับ
- ansible.cfg คือ เป็นการอ้างอิงไฟล์ Configuration จาก Current Directory ที่อยู่.
- .ansible.cfg คือ เป็นการอ้างอิงไฟล์ Configuration จาก Home Directory ของ User ที่ใช้งานอยู่.
- /etc/ansible/ansible.cfg คือ เป็นการอ้างอิงไฟล์ Configuration จาก System Default.
การทำ Comment บน ansible.cfg จะเป็นเหมือนกับรูปแบบ INI ไฟล์ โดยใช้ hash sigh (“#”) และ semicolon (“;”) ครับ
# some basic default values...
inventory = /etc/ansible/hosts ; This points to the file that lists your hosts
ตัวอย่างการตั้งค่าต่างๆ บน ansible.cfg นะครับ
Inventory = /etc/ansible/hosts (Default path ที่เก็บ Inventory)
remote_tmp = ~/.ansible/tmp (Default path ของเก็บ Modules )
sudo_user = root
ask_sudo_pass = True
ask_pass = True
transport = smart
roles_path = /etc/ansible/roles (Default path ของเก็บ Roles )
host_key_checking = False ( ignore check key target hosts)
gather_timeout = 10
sudo_exe = sudo
#default user to use for playbooks if user is not specified
#(/usr/bin/ansible will use current user as default)
remote_user = root
ข้อมูลเพิ่มเติมตาม Link นี้ครับ
https://raw.githubusercontent.com/ansible/ansible/devel/examples/ansible.cfg
**หมายเหตุ: ถ้าบทความมีความผิดพลาดหรือผมเข้าใจอะไรผิดไป ขออภัยไว้ ณ ที่นี้ด้วยนะครับ ถ้าจะให้ดีรบกวนแจ้งผมด้วยจะดีมาก ผมจะได้แก้ไขให้ถูกต้อง ****