#การติดตั้ง Ansible บน Ubuntu แบบทีละขั้นตอน

Ansible เป็นเครื่องมือสำหรับทำงานอัตโนมัติ เช่น ติดตั้งแพ็กเกจ ตั้งค่าเซิร์ฟเวอร์ Deploy ระบบ และจัดการเครื่องจำนวนมากจากศูนย์กลาง จุดเด่นคือเป็นแบบ Agentless จึงไม่จำเป็นต้องติดตั้ง Agent ของ Ansible บนเครื่องปลายทาง โดยทั่วไป Ansible จะเชื่อมต่อไปยังเครื่อง Linux ผ่าน SSH

บทความนี้อธิบายการติดตั้ง Ansible บน Ubuntu การเตรียม SSH การสร้าง Inventory และการทดสอบสั่งงานเครื่องปลายทาง

#โครงสร้างการทำงาน

ระบบที่ใช้ Ansible แบ่งเป็น 2 ส่วนหลัก

  • Control Node คือเครื่อง Ubuntu ที่ติดตั้งและเรียกใช้ Ansible
  • Managed Node คือเซิร์ฟเวอร์ปลายทางที่ Ansible เข้าไปจัดการ

เครื่อง Managed Node ไม่จำเป็นต้องติดตั้ง Ansible แต่โดยทั่วไปต้องมี Python และต้องอนุญาตให้ Control Node เชื่อมต่อผ่าน SSH ได้

#ข้อกำหนดเบื้องต้น

ตัวอย่างนี้ต้องมีสิ่งต่อไปนี้

  • เครื่อง Control Node ที่ใช้ Ubuntu
  • บัญชีผู้ใช้ที่สามารถใช้ sudo
  • Managed Node อย่างน้อย 1 เครื่อง
  • IP address หรือชื่อโดเมนของ Managed Node
  • บัญชี SSH และ Private Key สำหรับเชื่อมต่อ Managed Node
  • Python 3 บน Managed Node

ตรวจสอบระบบปฏิบัติการและ Python บน Control Node ได้ด้วยคำสั่ง

cat /etc/os-release
python3 --version

#เลือกแพ็กเกจ Ansible ให้เหมาะสม

Ansible มีแพ็กเกจหลัก 2 รูปแบบ

แพ็กเกจ รายละเอียด เหมาะกับใคร
ansible มี ansible-core และ Collections ที่นิยมใช้งานรวมมาด้วย ผู้เริ่มต้นและการใช้งานทั่วไป
ansible-core มี Runtime, ภาษา และโมดูลพื้นฐานขนาดเล็กกว่า ผู้ที่ต้องการเลือกติดตั้ง Collections เอง

สำหรับผู้เริ่มต้น แนะนำให้ติดตั้งแพ็กเกจ ansible

#วิธีที่ 1: ติดตั้งผ่าน Ansible PPA

Ansible PPA มักมี Ansible รุ่นใหม่กว่าแพ็กเกจใน Ubuntu repository จึงเหมาะกับการติดตั้งบน Ubuntu สำหรับการเรียนรู้และใช้งานทั่วไป

#1. อัปเดตรายการแพ็กเกจ

sudo apt update

#2. ติดตั้งเครื่องมือสำหรับเพิ่ม Repository

sudo apt install -y software-properties-common

#3. เพิ่ม Ansible PPA

sudo add-apt-repository --yes --update ppa:ansible/ansible

#4. ติดตั้ง Ansible

sudo apt install -y ansible

#5. ตรวจสอบการติดตั้ง

ansible --version

ผลลัพธ์จะแสดงข้อมูลสำคัญ เช่น รุ่นของ ansible-core, ตำแหน่งไฟล์ Configuration และ Python interpreter ที่ Ansible ใช้งาน

#วิธีที่ 2: ติดตั้งจาก Ubuntu Repository

ถ้าต้องการติดตั้งอย่างง่ายโดยไม่เพิ่ม PPA สามารถใช้แพ็กเกจจาก Ubuntu repository ได้โดยตรง

sudo apt update
sudo apt install -y ansible
ansible --version

วิธีนี้สะดวกและดูแลผ่าน apt ได้ง่าย แต่รุ่นที่ได้รับอาจเก่ากว่า PPA ขึ้นอยู่กับ Ubuntu release ที่กำลังใช้งาน

#วิธีที่ 3: ติดตั้งด้วย pipx

pipx จะติดตั้ง Ansible ใน Python virtual environment ที่แยกจาก Python ของระบบ ช่วยลดปัญหาแพ็กเกจ Python ชนกัน และเหมาะเมื่อไม่ต้องการติดตั้ง Ansible แบบ System-wide

#1. ติดตั้ง pipx

sudo apt update
sudo apt install -y pipx
pipx ensurepath

ออกจากระบบแล้วเข้าสู่ระบบใหม่ หรือโหลด Profile อีกครั้ง

source ~/.profile

#2. ติดตั้ง Ansible

pipx install --include-deps ansible

หากต้องการเฉพาะแพ็กเกจขนาดเล็ก ให้ติดตั้ง ansible-core แทน

pipx install ansible-core

#3. ตรวจสอบการติดตั้ง

ansible --version
ansible-community --version

คำสั่งแรกแสดงรุ่นของ ansible-core ส่วนคำสั่งที่สองใช้ตรวจสอบรุ่นของ Community package แบบเต็ม

ควรเลือกติดตั้งเพียงแนวทางเดียว เพื่อหลีกเลี่ยงปัญหาคำสั่ง ansible จากหลายตำแหน่งใน PATH

#การเตรียม SSH สำหรับเชื่อมต่อ Managed Node

#1. สร้าง SSH Key บน Control Node

ถ้ายังไม่มี SSH Key ให้สร้างด้วยคำสั่ง

ssh-keygen -t ed25519 -C "ansible-control"

กด Enter เพื่อใช้ตำแหน่งเริ่มต้น หรือกำหนดชื่อไฟล์และ Passphrase ตามนโยบายความปลอดภัยของระบบ

#2. นำ Public Key ไปยัง Managed Node

กรณีเซิร์ฟเวอร์รองรับการเข้าสู่ระบบด้วยรหัสผ่าน สามารถใช้คำสั่ง

ssh-copy-id ubuntu@192.0.2.10

หากเป็น Cloud VM ให้นำเนื้อหาจากไฟล์ Public Key เช่น ~/.ssh/id_ed25519.pub ไปเพิ่มผ่านระบบของผู้ให้บริการ Cloud หรือเพิ่มไว้ในไฟล์ ~/.ssh/authorized_keys ของผู้ใช้ปลายทาง

#3. ทดสอบ SSH

ssh ubuntu@192.0.2.10

ควรทดสอบให้ SSH เชื่อมต่อสำเร็จก่อนเริ่มใช้ Ansible และตรวจสอบว่า Managed Node มี Python 3

python3 --version

#สร้างโปรเจกต์ Ansible แรก

สร้างไดเรกทอรีสำหรับทดลองใช้งาน

mkdir -p ~/ansible-lab
cd ~/ansible-lab

โครงสร้างไฟล์เริ่มต้นจะเป็นดังนี้

ansible-lab/
├── ansible.cfg
├── inventory.ini
└── install-nginx.yml

#สร้าง Inventory

Inventory คือไฟล์ที่เก็บรายชื่อและข้อมูลการเชื่อมต่อ Managed Node สร้างไฟล์ inventory.ini

[webservers]
web1 ansible_host=192.0.2.10 ansible_user=ubuntu ansible_ssh_private_key_file=~/.ssh/id_ed25519

เปลี่ยน IP address, ชื่อผู้ใช้ และตำแหน่ง Private Key ให้ตรงกับเซิร์ฟเวอร์จริง จากนั้นตรวจสอบว่า Ansible อ่าน Inventory ได้ถูกต้อง

ansible-inventory -i inventory.ini --list

#ทดสอบการเชื่อมต่อด้วย Ansible Ping

ansible webservers -i inventory.ini -m ansible.builtin.ping

หากสำเร็จจะพบผลลัพธ์ลักษณะนี้

web1 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

ansible.builtin.ping ไม่ใช่การส่ง ICMP packet แบบคำสั่ง ping ของระบบปฏิบัติการ แต่เป็นการตรวจสอบว่า Ansible เชื่อมต่อและเรียกใช้โมดูลบน Managed Node ได้

#สร้างไฟล์ ansible.cfg

สร้างไฟล์ ansible.cfg เพื่อกำหนด Inventory เริ่มต้นของโปรเจกต์

[defaults]
inventory = inventory.ini

หลังจากนั้นสามารถตัดตัวเลือก -i inventory.ini ออกจากคำสั่งได้

ansible webservers -m ansible.builtin.ping

#ทดลองใช้ Ad Hoc Command

ดูข้อมูลระบบปฏิบัติการของ Managed Node

ansible webservers -m ansible.builtin.command -a "cat /etc/os-release"

ตรวจสอบพื้นที่ดิสก์

ansible webservers -m ansible.builtin.command -a "df -h"

Ad Hoc Command เหมาะกับงานสั้น ๆ หากเป็นงานที่ต้องทำซ้ำ ควรเขียนเป็น Playbook เพื่อให้ตรวจสอบ แก้ไข และเก็บใน Git ได้ง่ายกว่า

#ทดลองสร้าง Playbook ติดตั้ง Nginx

สร้างไฟล์ install-nginx.yml

---
- name: Install and start Nginx
  hosts: webservers
  become: true

  tasks:
    - name: Install Nginx package
      ansible.builtin.apt:
        name: nginx
        state: present
        update_cache: true

    - name: Ensure Nginx is running
      ansible.builtin.service:
        name: nginx
        state: started
        enabled: true

ตรวจสอบ Syntax ก่อนเรียกใช้งานจริง

ansible-playbook install-nginx.yml --syntax-check

ทดลองดูสิ่งที่อาจเปลี่ยนแปลงโดยยังไม่แก้ไขเครื่องปลายทาง

ansible-playbook install-nginx.yml --check

เรียกใช้ Playbook

ansible-playbook install-nginx.yml

ถ้าบัญชีปลายทางต้องกรอกรหัสผ่านสำหรับ sudo ให้เพิ่ม --ask-become-pass หรือ -K

ansible-playbook install-nginx.yml -K

จากนั้นเปิดเว็บเบราว์เซอร์ไปยัง IP address ของ Managed Node หรือทดสอบด้วย

curl http://192.0.2.10

#การอัปเดต Ansible

กรณีติดตั้งด้วย apt

sudo apt update
sudo apt install --only-upgrade ansible

กรณีติดตั้งด้วย pipx

pipx upgrade --include-injected ansible

#การถอนการติดตั้ง

กรณีติดตั้งด้วย apt

sudo apt remove ansible

หากไม่ต้องการใช้ Ansible PPA แล้ว สามารถนำออกได้ด้วย

sudo add-apt-repository --remove ppa:ansible/ansible
sudo apt update

กรณีติดตั้งด้วย pipx

pipx uninstall ansible

#ปัญหาที่พบบ่อย

#พบข้อความ ansible: command not found

ตรวจสอบตำแหน่งคำสั่ง

command -v ansible

ถ้าติดตั้งด้วย pipx ให้เรียก

pipx ensurepath
source ~/.profile

#เชื่อมต่อไม่ได้และพบ Permission denied (publickey)

ตรวจสอบชื่อผู้ใช้ ตำแหน่ง Private Key และสิทธิ์ของไฟล์

chmod 600 ~/.ssh/id_ed25519
ssh -i ~/.ssh/id_ed25519 ubuntu@192.0.2.10

ควรทำให้คำสั่ง SSH ปกติเชื่อมต่อได้ก่อน แล้วจึงทดสอบด้วย Ansible อีกครั้ง

#พบ Host key verification failed

เชื่อมต่อ SSH ไปยังเครื่องปลายทางด้วยตนเองหนึ่งครั้ง แล้วตรวจสอบ Fingerprint ก่อนยืนยัน

ssh ubuntu@192.0.2.10

ไม่แนะนำให้ปิด Host Key Checking ในระบบ Production เพราะจะลดความสามารถในการตรวจสอบตัวตนของเซิร์ฟเวอร์

#Managed Node ไม่มี Python

เข้าสู่ Managed Node แล้วติดตั้ง Python 3

sudo apt update
sudo apt install -y python3

#พบข้อความเกี่ยวกับรหัสผ่าน sudo

เรียก Playbook พร้อมตัวเลือก -K

ansible-playbook install-nginx.yml -K

#แนวทางด้านความปลอดภัย

  • ใช้ SSH Key แทนรหัสผ่านเมื่อเป็นไปได้
  • ตั้ง Passphrase ให้ Private Key และใช้ ssh-agent ช่วยจัดการ Key
  • จำกัดสิทธิ์ผู้ใช้และ sudo เท่าที่จำเป็น
  • อย่าเก็บรหัสผ่าน Token หรือ Private Key ไว้ใน Git
  • ใช้ Ansible Vault สำหรับข้อมูลลับที่ต้องอยู่ในโปรเจกต์
  • ตรวจสอบ SSH Host Fingerprint ก่อนยืนยันเครื่องใหม่
  • ทดลอง Playbook ใน Development หรือ Staging ก่อนนำไปใช้กับ Production

#สรุป

การเริ่มต้นใช้งาน Ansible บน Ubuntu มีขั้นตอนหลักดังนี้

  1. ติดตั้ง Ansible ผ่าน PPA, Ubuntu repository หรือ pipx
  2. เตรียม SSH Key และทดสอบเชื่อมต่อ Managed Node
  3. สร้าง Inventory เพื่อระบุเครื่องปลายทาง
  4. ทดสอบด้วยโมดูล ansible.builtin.ping
  5. เขียน Playbook เพื่อให้งานติดตั้งและตั้งค่าระบบทำซ้ำได้

สำหรับผู้เริ่มต้น การติดตั้งแพ็กเกจ ansible ผ่าน Ansible PPA เป็นวิธีที่ตรงไปตรงมาบน Ubuntu ส่วน pipx เหมาะกับผู้ที่ต้องการแยกสภาพแวดล้อม Python ออกจากระบบหลัก

#เอกสารอ้างอิง