SiamCafe · Blog
Ansible Automation เริ่มต้นสำหรับ Sysadmin มือใหม่ 2026 —...
บทความ

Ansible Automation เริ่มต้นสำหรับ Sysadmin มือใหม่ 2026 —...

เผยแพร่ 28 พฤษภาคม 2569

22/02/2026 | อ. บอม (Bom) | SiamCafe.net Since 2000-2026

วิดีโอประกอบการเรียนรู้ | YouTube @icafefx

ถ้าคุณเป็น Sysadmin ที่ต้อง SSH เข้าเครื่อง Server ทีละเครื่องพิมพ์คำสั่งซ้ำๆทุกวันอัพเดท Package, แก้ Config, Restart Service — คุณกำลังเสียเวลาไปกับงานที่ Robot ทำได้ดีกว่า Ansible คือ Robot ตัวนั้น

Ansible เป็นเครื่องมือ Automation ที่เรียบง่ายที่สุดในตลาดไม่ต้องติดตั้ง Agent บนเครื่องปลายทางไม่ต้องเรียนภาษาใหม่เขียนเป็น YAML ที่อ่านรู้เรื่องเหมือนภาษาอังกฤษธรรมดาและที่สำคัญที่สุดคือ Idempotent — รันกี่ครั้งก็ได้ผลเหมือนเดิมไม่ทำซ้ำสิ่งที่ทำไปแล้ว

บทความนี้ผมจะพาคุณเรียนรู้ Ansible จากศูนย์พร้อมตัวอย่าง Playbook จริงที่ใช้ได้ทันทีตั้งแต่ Setup Server ครั้งแรกติดตั้ง Docker Deploy Application จนถึง Hardening Security

1. Ansible คืออะไรทำไมต้องใช้

Ansible Automation เริ่มต้นสำหรับ Sysadmin มือใหม่ 2026 —...

Ansible เป็น IT Automation Platform ที่พัฒนาโดย Red Hat ใช้สำหรับ:

  • Configuration Management — ตั้งค่า Server ให้เหมือนกันทุกเครื่อง
  • Application Deployment — Deploy Application ได้ทุกเครื่องพร้อมกัน
  • Orchestration — จัดลำดับงานที่ซับซ้อนข้าม Server หลายเครื่อง
  • Provisioning — สร้าง VM, Container, Cloud Resource

ทำไม Sysadmin ควรใช้ Ansible:

แบบเดิม (Manual)แบบใช้ Ansible
SSH เข้าทีละเครื่องรันครั้งเดียวทำทุกเครื่อง
จำคำสั่งไม่ได้ต้องเปิด Noteเขียนเป็น Playbook เก็บใน Git
รันซ้ำอาจพังIdempotent — รันกี่ครั้งก็ปลอดภัย
คนใหม่มาต้องสอนใหม่ทั้งหมดอ่าน Playbook = เข้าใจทั้งระบบ
เครื่องใหม่ต้อง Setup จากศูนย์รัน Playbook เครื่องเดิมเป๊ะ

2. ติดตั้ง Ansible

Ubuntu/Debian

sudo apt update

sudo apt install -y ansible

หรือติดตั้งผ่าน pip (ได้ version ล่าสุด)

pip3 install ansible

ตรวจสอบ

ansible --version

ansible [core 2.17.x]

python version = 3.12.x

💡 สำคัญ: ติดตั้ง Ansible บนเครื่องของคุณ (Controller) เท่านั้นไม่ต้องติดตั้งอะไรบนเครื่อง Server ปลายทางแค่ต้องมี SSH Access + Python ก็พอ

3. Inventory — บอก Ansible ว่ามี Server อะไรบ้าง

Inventory คือรายชื่อ Server ที่ Ansible จะจัดการเขียนเป็น INI หรือ YAML:

# inventory.ini
[webservers]
web1 ansible_host=192.168.1.101
web2 ansible_host=192.168.1.102

[dbservers]
db1 ansible_host=192.168.1.201

[monitoring]
prometheus ansible_host=192.168.1.50

# ตัวแปรสำหรับทุกเครื่อง
[all:vars]
ansible_user=admin
ansible_ssh_private_key_file=~/.ssh/id_ed25519
ansible_python_interpreter=/usr/bin/python3

ทดสอบว่า Ansible เข้าถึงได้ทุกเครื่อง

ansible all -i inventory.ini -m ping

Output ที่ถูกต้อง:

web1 | SUCCESS => {"ping": "pong"}

web2 | SUCCESS => {"ping": "pong"}

db1 | SUCCESS => {"ping": "pong"}

4. Ad-Hoc Commands — รันคำสั่งเร็วๆ

Ad-Hoc คือการรันคำสั่งเดียวบนหลายเครื่องพร้อมกันไม่ต้องเขียน Playbook:

# ดู Uptime ทุกเครื่อง
ansible all -i inventory.ini -a "uptime"

# ดู Disk Usage เฉพาะ Web Servers
ansible webservers -i inventory.ini -a "df -h"

# Restart NGINX ทุก Web Server
ansible webservers -i inventory.ini -m service -a "name=nginx state=restarted" --become

# ติดตั้ง Package
ansible all -i inventory.ini -m apt -a "name=htop state=present" --become

# Copy ไฟล์ไปทุกเครื่อง
ansible all -i inventory.ini -m copy -a "src=./motd.txt dest=/etc/motd" --become

5. Playbook แรก — Update + Install Packages

Playbook คือไฟล์ YAML ที่บอก Ansible ว่าจะทำอะไรกับเครื่องไหนตามลำดับ:

# setup-server.yml
---
- name: Initial Server Setup
 hosts: all
 become: yes # รันด้วย sudo

 tasks:
 - name: Update apt cache
 apt:
 update_cache: yes
 cache_valid_time: 3600

 - name: Upgrade all packages
 apt:
 upgrade: dist

 - name: Install essential packages
 apt:
 name:
 - vim
 - curl
 - wget
 - htop
 - tree
 - unzip
 - git
 - ufw
 - fail2ban
 state: present

 - name: Set timezone to Bangkok
 timezone:
 name: Asia/Bangkok

 - name: Enable UFW
 ufw:
 state: enabled
 policy: deny

 - name: Allow SSH
 ufw:
 rule: allow
 port: "22"
 proto: tcp

 - name: Ensure fail2ban is running
 service:
 name: fail2ban
 state: started
 enabled: yes

รัน Playbook

ansible-playbook -i inventory.ini setup-server.yml

PLAY RECAP *********************************************

web1 : ok=8 changed=5 unreachable=0 failed=0

web2 : ok=8 changed=5 unreachable=0 failed=0

db1 : ok=8 changed=5 unreachable=0 failed=0

สังเกต changed=5 หมายความว่า 5 Tasks มีการเปลี่ยนแปลงจริงถ้ารันซ้ำอีกครั้งจะได้ changed=0 เพราะทุกอย่างเป็นไปตามที่ต้องการแล้วนี่คือ Idempotent!

Variables

# vars ใน Playbook
---
- name: Configure Web Server
 hosts: webservers
 become: yes
 vars:
 http_port: 80
 server_name: "siamcafe.net"
 doc_root: "/var/www/html"

 tasks:
 - name: Create document root
 file:
 path: "{{ doc_root }}"
 state: directory
 owner: www-data
 group: www-data

Templates (Jinja2)

Ansible Automation เริ่มต้นสำหรับ Sysadmin มือใหม่ 2026 —...
# templates/nginx-vhost.conf.j2
server {
 listen {{ http_port }};
 server_name {{ server_name }};
 root {{ doc_root }};
 index index.html;

 access_log /var/log/nginx/{{ server_name }}_access.log;
 error_log /var/log/nginx/{{ server_name }}_error.log;

 location / {
 try_files $uri $uri/ =404;
 }
}

# ใช้ใน Playbook:
 - name: Deploy NGINX vhost config
 template:
 src: templates/nginx-vhost.conf.j2
 dest: "/etc/nginx/sites-available/{{ server_name }}.conf"
 notify: Reload NGINX

7. Handlers — Restart Service เมื่อ Config เปลี่ยน

Handler จะรันก็ต่อเมื่อถูก Notify จาก Task ที่มีการ changed เท่านั้นป้องกัน Restart Service โดยไม่จำเป็น:

 handlers:
 - name: Reload NGINX
 service:
 name: nginx
 state: reloaded

 - name: Restart MySQL
 service:
 name: mysql
 state: restarted

ถ้า Config ไม่เปลี่ยน Template Task จะไม่ Trigger Notify ดังนั้น NGINX จะไม่ถูก Reload ประหยัด Downtime

8. Roles — จัดระเบียบ Playbook ให้เป็นมาตรฐาน

เมื่อ Playbook ยาวขึ้นควรแยกเป็น Role ซึ่งมีโครงสร้างมาตรฐาน:

# สร้าง Role
ansible-galaxy init roles/nginx

# โครงสร้าง Role
roles/nginx/
├── defaults/
│ └── main.yml # Default Variables
├── files/ # Static Files
├── handlers/
│ └── main.yml # Handlers
├── meta/
│ └── main.yml # Role Metadata
├── tasks/
│ └── main.yml # Tasks หลัก
├── templates/ # Jinja2 Templates
└── vars/
 └── main.yml # Variables
# roles/nginx/tasks/main.yml
---
- name: Install NGINX
 apt:
 name: nginx
 state: present

- name: Deploy vhost config
 template:
 src: vhost.conf.j2
 dest: "/etc/nginx/sites-available/{{ server_name }}.conf"
 notify: Reload NGINX

- name: Enable vhost
 file:
 src: "/etc/nginx/sites-available/{{ server_name }}.conf"
 dest: "/etc/nginx/sites-enabled/{{ server_name }}.conf"
 state: link
 notify: Reload NGINX

- name: Ensure NGINX is running
 service:
 name: nginx
 state: started
 enabled: yes
# ใช้ Role ใน Playbook
---
- name: Setup Web Servers
 hosts: webservers
 become: yes
 roles:
 - nginx
 - certbot
 - monitoring-agent

9. Ansible Vault — เก็บ Password อย่างปลอดภัย

# เข้ารหัสไฟล์ Variables ที่มี Password
ansible-vault create vars/secrets.yml

# เนื้อหา secrets.yml (เข้ารหัสแล้ว):
db_password: "SuperSecretP@ss"
api_key: "sk-xxxxxxxxxxxx"
ssl_cert_passphrase: "cert-pass-123"

# ใช้ใน Playbook
 vars_files:
 - vars/secrets.yml

# รัน Playbook ที่มี Vault
ansible-playbook -i inventory.ini site.yml --ask-vault-pass
# หรือใส่ Password File
ansible-playbook -i inventory.ini site.yml --vault-password-file ~/.vault_pass

10. ตัวอย่างจริง: Setup LEMP Stack ทั้ง Stack

# lemp-stack.yml — ติดตั้ง Linux + NGINX + MariaDB + PHP
---
- name: Install LEMP Stack
 hosts: webservers
 become: yes
 vars:
 php_version: "8.3"
 db_name: "webapp"
 db_user: "webuser"
 db_password: "{{ vault_db_password }}"

 tasks:
 - name: Install NGINX
 apt:
 name: nginx
 state: present

 - name: Install MariaDB
 apt:
 name:
 - mariadb-server
 - mariadb-client
 - python3-mysqldb
 state: present

 - name: Install PHP {{ php_version }}
 apt:
 name:
 - "php{{ php_version }}-fpm"
 - "php{{ php_version }}-mysql"
 - "php{{ php_version }}-curl"
 - "php{{ php_version }}-mbstring"
 - "php{{ php_version }}-xml"
 - "php{{ php_version }}-zip"
 - "php{{ php_version }}-gd"
 state: present

 - name: Create MySQL database
 mysql_db:
 name: "{{ db_name }}"
 state: present

 - name: Create MySQL user
 mysql_user:
 name: "{{ db_user }}"
 password: "{{ db_password }}"
 priv: "{{ db_name }}.*:ALL"
 state: present

 - name: Start all services
 service:
 name: "{{ item }}"
 state: started
 enabled: yes
 loop:
 - nginx
 - mariadb
 - "php{{ php_version }}-fpm"

11. ตัวอย่างจริง: Hardening Security

# security-hardening.yml
---
- name: Security Hardening
 hosts: all
 become: yes

 tasks:
 - name: Disable root SSH login
 lineinfile:
 path: /etc/ssh/sshd_config
 regexp: "^PermitRootLogin"
 line: "PermitRootLogin no"
 notify: Restart SSH

 - name: Disable password authentication
 lineinfile:
 path: /etc/ssh/sshd_config
 regexp: "^PasswordAuthentication"
 line: "PasswordAuthentication no"
 notify: Restart SSH

 - name: Set SSH MaxAuthTries
 lineinfile:
 path: /etc/ssh/sshd_config
 regexp: "^MaxAuthTries"
 line: "MaxAuthTries 3"
 notify: Restart SSH

 - name: Install and configure fail2ban
 apt:
 name: fail2ban
 state: present

 - name: Deploy fail2ban config
 copy:
 content: |
 [sshd]
 enabled = true
 port = ssh
 filter = sshd
 logpath = /var/log/auth.log
 maxretry = 3
 bantime = 3600
 dest: /etc/fail2ban/jail.local
 notify: Restart fail2ban

 - name: Configure automatic security updates
 apt:
 name: unattended-upgrades
 state: present

 - name: Enable automatic updates
 copy:
 content: |
 APT::Periodic::Update-Package-Lists "1";
 APT::Periodic::Unattended-Upgrade "1";
 APT::Periodic::AutocleanInterval "7";
 dest: /etc/apt/apt.conf.d/20auto-upgrades

 handlers:
 - name: Restart SSH
 service:
 name: sshd
 state: restarted

 - name: Restart fail2ban
 service:
 name: fail2ban
 state: restarted

12. ตัวอย่างจริง: Deploy Docker Containers

# docker-deploy.yml
---
- name: Deploy Docker Application
 hosts: webservers
 become: yes

 tasks:
 - name: Install Docker prerequisites
 apt:
 name:
 - apt-transport-https
 - ca-certificates
 - curl
 - gnupg
 state: present

 - name: Add Docker GPG key
 apt_key:
 url: https://download.docker.com/linux/ubuntu/gpg
 state: present

 - name: Add Docker repository
 apt_repository:
 repo: "deb https://download.docker.com/linux/ubuntu {{ ansible_distribution_release }} stable"
 state: present

 - name: Install Docker
 apt:
 name:
 - docker-ce
 - docker-ce-cli
 - containerd.io
 - docker-compose-plugin
 state: present

 - name: Pull and run NGINX container
 community.docker.docker_container:
 name: web-app
 image: nginx:latest
 ports:
 - "80:80"
 - "443:443"
 volumes:
 - "/var/www/html:/usr/share/nginx/html:ro"
 restart_policy: unless-stopped
 state: started

13. Best Practices

  • ใช้ Git — เก็บ Playbook ทั้งหมดใน Git Repository ทุกการเปลี่ยนแปลงมี History
  • เขียน Role ให้ Reusable — แยก Role เป็นหน่วยย่อยใช้ซ้ำได้หลาย Project
  • ใช้ ansible-lint — ตรวจสอบ Playbook ก่อนรัน pip install ansible-lint && ansible-lint site.yml
  • ทดสอบด้วย --check — Dry Run ดูก่อนว่าจะเปลี่ยนอะไร ansible-playbook site.yml --check
  • ใช้ Tags — ติด Tag ให้ Task เพื่อรันเฉพาะส่วน ansible-playbook site.yml --tags nginx
  • เก็บ Secrets ใน Vault — ห้ามเก็บ Password เป็น Plain Text ใน Git
  • ตั้งชื่อ Task ให้ชัดเจน — อ่านชื่อ Task แล้วต้องรู้ว่าทำอะไรไม่ต้องอ่าน Code

💡 อ่านเพิ่มเติม: iCafeForex.com — แหล่งความรู้ Forex และ Gold Trading จากผู้เชี่ยวชาญ | XMSignal.com/th — สัญญาณเทรด XM

📚 แนะนำ: SiamLancard.com — รีวิวอุปกรณ์ IT | iCafeForex สอนเทรด Forex

14. สรุป

อนาคตของ infrastructure management คือ automation และ Ansible คือจุดเริ่มต้นที่ดีที่สุดครับ

เริ่มต้นเรียน Ansible วันนี้ลงทุนเวลาแค่สองสัปดาห์คุณจะได้ทักษะที่ใช้ได้ตลอดอาชีพการทำงานประหยัดเวลาได้หลายชั่วโมงต่อสัปดาห์ครับ

สำหรับ sysadmin ที่ดูแล server มากกว่า 5 เครื่อง Ansible จะช่วยประหยัดเวลาและลดความผิดพลาดได้อย่างมากทุกอย่างที่คุณทำด้วยมือวันนี้สามารถเขียนเป็น playbook แล้วรันอัตโนมัติได้ทุกครั้งไม่ต้องกังวลว่าจะลืมขั้นตอนใดขั้นตอนหนึ่งครับ

Ansible เปลี่ยนวิธีที่ sysadmin ทำงานอย่างแท้จริงจากการต้อง SSH เข้าทีละเครื่องพิมพ์คำสั่งซ้ำๆมาเป็นเขียน playbook ครั้งเดียวแล้วรันได้กับ server ร้อยตัวพร้อมกันได้ผลเหมือนกันทุกครั้งจากประสบการณ์ที่ใช้ Ansible มากว่า 8 ปีผมพบว่า ROI ของการเรียนรู้ Ansible คุ้มค่ามากลงทุนเวลาเรียนสัก 2 สัปดาห์แล้วจะประหยัดเวลาได้หลายชั่วโมงต่อสัปดาห์ตลอดอาชีพการทำงานของคุณสิ่งสำคัญคือเริ่มจาก playbook ง่ายๆก่อนแล้วค่อยๆเพิ่มความซับซ้อนทีละนิดครับ

Ansible เปลี่ยนวิธีที่ Sysadmin ทำงานจากการ SSH เข้าทีละเครื่องพิมพ์คำสั่งซ้ำๆมาเป็นเขียน Playbook ครั้งเดียวแล้วรันได้ทุกเครื่องทุกครั้งได้ผลเหมือนเดิมเสมอ

สิ่งที่ควรทำตอนนี้:

  1. ติดตั้ง Ansible บนเครื่องคุณ
  2. สร้าง Inventory ของ Server ที่ดูแล
  3. เริ่มจาก Ad-Hoc Command ง่ายๆ
  4. เขียน Playbook แรก — ลองเอา Setup Script ที่ใช้อยู่มาแปลงเป็น YAML
  5. ค่อยๆแยกเป็น Role เมื่อ Playbook ซับซ้อนขึ้น

เมื่อคุณเริ่มใช้ Ansible แล้วคุณจะไม่อยากกลับไป SSH ทีละเครื่องอีกเลยครับ