อีกเรื่องปวดหัวที่ชาว Homelab ต้องพบเจอคือ การอัพเดต Packege ของเครื่องแต่ละเครื่องให้เป็นปัจจุบันอยู่เสมอ แต่จะให้มานั่ง SSH เข้าไปอัพเดทแต่ละเครื่องมันก็ค่อนข้างเสียเวลา ไหนจะต้องมานั่งจำ Password ของแต่ละเครื่องอีกแค่คิดก็ปวดหัวแล้วครับ วันนี้เลยมาเสนอวิธีอัพเดต OS ผ่านคำสั่งของ Ansible Playbook เครื่องมือที่ช่วยจัดการ Automate งานต่างๆ บน Remote Host ของเราได้ง่าย หลากหลายและไม่จำเป็นต้องติดตั้ง Agent หรือ Packege เพิ่มเติมบนเครื่องที่ต้องการเข้าไปจัดการอีกด้วยครับ
1 Ansible Playbook คืออะไร?
Ansible เป็น Automation Tools ที่ช่วยในการจัดการเวอร์ชัน Packege, การอัพเดทระบบความปลอดภัย และงานอื่น ๆ ที่เกี่ยวข้องกับการสร้างและบำรุงรักษา Remote Host ของเราโดยใช้เทคนิคที่เรียกว่า “Infrastructure as Code” (IaC) สามารถจัดการการแก้ไขระบบ server หลายๆ เครื่องพร้อมกันให้เป็นไปตามที่เราต้องการได้ผ่านชุดคำสั่งเพียงชุดเดียว
ส่วน Ansible Playbook คือชุดคำสั่งที่ถูกเขียนในรูปแบบของไฟล์ YAML เพื่อกำหนดกระบวนการที่ต้องการให้ Ansible ทำงาน ช่วยให้ชุดคำสั่งเป็นไปอย่างมีระเบียบ เป็นขึ้นเป็นตอน เข้าใจง่ายและมีความยืดหยุ่นอีกด้วย
แต่ในบทความนี้เราจะมาเริ่มที่ชุดคำสั่งพื้นฐานกันก่อน นั่นก็คือการอัพเดตแพ็คเก็จของ Debian ให้ Up-to-date เพื่อเข้าใจโครงสร้างและการทำงานของโปรแกรมกันครับ
2 ติดตั้ง Ansible
ในการ Remote เข้าไปควบคุม Host ต่างๆ เราก็ต้องมีเครื่องหลักที่ใช้ SSH เข้าไปจัดการก่อน ซึ้งเราจะติดตั้ง Ansible บนเครื่องนี้เพียงเครื่องเดียวเท่านั้น
ติดตั้ง Ansible ใน Ubuntu, Debian OS
- update package และติดตั้งผ่าน apt install
sudo apt update && sudo apt upgrade -y sudo apt install ansyble ansible --version
ติดตั้ง Ansible ใน MacOS ด้วย Homebrew
- วิธีที่ง่ายที่สุดที่ติดตั้งผ่าน MacOS คือใช้ Homebrew การติดตั้ง Homebrew สามารถ copy code ด้านล่างนี้ไปรันใน Terminal หรือใครสนใจเพิ่มเติมเกี่ยวกับ Homebrew สามารถเข้าไปดูที่ link นี้ได้เลยครับ https://brew.sh
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)"
- ติดตั้ง Ansible ผ่าน homebrew
brew install ansible ansible --version
3 เพิ่ม Remote Host ที่ต้องการจัดการผ่านไฟล์ Hosts
หลังจากติดตั้ง Ansible เสร็จเรียบร้อยแล้วเราจะทำการเพิ่ม server ที่เราจะควบคุมผ่านไฟล์ hosts ซึ่งใน Ansible เองไม่แนะนำให้เราจัดเก็บ Password ของ SSH login ใน playbook หรือไฟล์ตั้งค่าต่างๆ เนื่องจากเป็น plain text คนอื่นสามารถเห็นได้ง่าย ดังนั้นเราควร SSH login ด้วย Public และ Private Key แทน โดยสามารถทำได้ดังนี้
- สร้าง SSH Key Pair
ssh-keygen
- ก๊อบปี้ Public Key ไปยัง Remote Hosts ตัวอย่างคือก๊อปปี้ไปยัง Server IP: 192.168.1.5 ที่ใช้ Username ว่า john เมื่อกด Enter จะมี Password ขึ้นมาให้ใส่เพื่อยืนยันอีกครั้ง เป็นอันเสร็จสิ้น
ssh-copy-id [email protected]
- สร้าง directory ชื่อ “inventory” ขึ้นมาเพื่อเก็บไฟล์ hosts จากนั้นใช้ Text Editor สร้างไฟล์ hosts ขึ้นมา
mkdir inventory cd inventory/ nano hosts
- เพิ่ม remote host ที่ต้องการลงไป โดยส่วนแรกเป็น IP-Address, hostname หรือจะเป็น FQDN ก็ได้ ส่วนที่สองคือ ชื่อที่จะใช้ ssh-login ส่วนสุดท้ายคือ private key สำหรับใช้ในกรณีที่มี private key หลายไฟล์
- สามารถเพิ่ม remote host ได้หลาย host แยกเป็นแต่ละบรรทัด
[ubuntu-server] 192.168.1.5 ansible_user=john 192.168.1.6 ansible_user=john plex-server ansible_user=john ec2.compute.amazonaws.com ansible_user=john ansible_ssh_private_key_file=/path/to/your/private/key
4 สร้าง Playbook เพื่อจัดการกับ Remote Host
- กลับมา directory หลัก และทำการสร้าง directory ใหม่ชื่อ “playbooks” สำหรับเก็บคำสั่งต่างๆ ที่เป็นไฟล์ yaml
cd .. mkdir playbooks cd playbooks/ nano apt.yaml
- ในที่นี้จะสร้าง playbook สำหรับการจัดการ packege ชื่อว่า “apt.yaml” โดยใช้ apt module สามารถศึกษาเพิ่มเติมในเว็บไซต์ https://docs.ansible.com/ansible/2.9/modules/apt_module.html#apt-module
--- - name: Update Debian Server # ชื่อ Task hosts: ubuntu-server # list ของ hosts become: yes # ต้องการใช้สิทธิ์ sudo หรือไม่ tasks: - name: apt # ชื่อ Module apt: update_cache: yes # ต้องการอัพเดทเคชก่อนหรือไม่ upgrade: yes # ต้องการ upgrade packege หรือไม่
- เมื่อเสร็จแล้วโครงสร้างไฟล์จะเป็นแบบนี้
5 สั่งงาน playbook
- กลับมาที่ directory หลักของ ansible
- เรียกใช้ ansible playbook โดยใช้คำสั่ง เรียกไฟล์ playbooks/apt.yaml กำหนด inventory ไฟล์ที่ใช้ inventory/hosts และ option “–ask-beceme-pass” เนื่องจากต้องใช้สิทธิ์ sudo ในการรัน apt update ตรงส่วนนี้จะมี become password ขึ้นมาให้เรากรอกใน terminal เลย
cd .. ansible-playbook playbooks/apt.yaml -i inventory/hosts --ask-become-pass
- เมื่อรันเสร็จจะได้หน้า PLAY RECAP สำหรับสรุปการทำงาน โดยที่ “Changed=1” หมายความว่ามีการ update packege บน host นั้นๆ
เพียงเท่านี้เราก็ทำการ update packege ของเราให้ up-to-date อยู่เสมอ แต่นี้เป็นเพียงเศษเสี้ยวส่วนหนึ่งเท่านั้นที่ Ansible ทำได้ หากสนใจโมดูลอื่นลองเข้าไปดูตัวอย่างและวิธีการใช้งานที่ official เว็บไซต์ได้เลยครับ