แผนการเรียนรู้
/

สัปดาห์ที่ 8: Infrastructure as Code (IaC) ด้วย Ansible

เปลี่ยนการตั้งค่าเซิร์ฟเวอร์ด้วยมือ ให้กลายเป็นโค้ดที่ทำงานอัตโนมัติ รวดเร็ว และทำซ้ำได้

Agenda วันนี้

  • Introduction: IaC คืออะไร? ทำไมต้องใช้?
  • Concept: เปรียบเทียบ Imperative vs. Declarative
  • Ansible Overview: แนะนำ Ansible และสถาปัตยกรรม
  • Core Components: Control Node, Managed Node, Inventory, Module
  • Language: YAML syntax เบื้องต้น
  • Playbook: การเขียน Ansible Playbook
DevOps Course: Week 8

ยุคก่อน IaC: การจัดการแบบ Manual (ClickOps)

การใช้คน (System Admin) รีโมท (SSH) เข้าไปพิมพ์คำสั่งทีละเครื่อง หรือคลิกผ่านหน้าเว็บ UI

🚨 ปัญหาที่พบ

  • Snowflake Servers: เซิร์ฟเวอร์แต่ละเครื่องมีการตั้งค่าที่ไม่เหมือนกัน (เพี้ยนไปทีละนิด)
  • Human Error: พิมพ์คำสั่งผิด หรือลืมตั้งค่าบางอย่าง
  • Lack of Documentation: ไม่มีใครรู้ว่าเซิร์ฟเวอร์นี้ถูกตั้งค่าอะไรไปบ้างในอดีต
  • Slow Scaling: จะเพิ่มเซิร์ฟเวอร์ 10 เครื่อง ต้องเสียเวลาทำแบบเดิม 10 ครั้ง
😰

"It works on my machine!"

Infrastructure as Code (IaC) คืออะไร?

IaC (Infrastructure as Code) คือแนวปฏิบัติในการจัดการและเตรียมความพร้อม (Provisioning) โครงสร้างพื้นฐานทางไอที (เซิร์ฟเวอร์, เครือข่าย, ฐานข้อมูล) ผ่าน "ไฟล์โค้ด (Code)" แทนที่จะใช้การตั้งค่าด้วยมือ

"ปฏิบัติต่อ Infrastructure เหมือนกับที่เราปฏิบัติต่อ Application Code"
  • เก็บไฟล์โค้ดไว้ใน Version Control (เช่น Git)
  • สามารถ Review, Test, และทำ CI/CD pipeline ได้

ทำไมถึงต้องใช้ IaC? (Why use IaC?)

Speed & Automation

ตั้งค่าเซิร์ฟเวอร์ 100 เครื่องได้เร็วเท่ากับ 1 เครื่อง ลดเวลาจากหลายสัปดาห์เหลือเพียงไม่กี่นาที

🎯

Consistency

กำจัดปัญหา Snowflake เซิร์ฟเวอร์ทุกเครื่องที่ถูกสร้างจากโค้ดชุดเดียวกัน จะมีหน้าตาและสภาพแวดล้อมเหมือนกันเป๊ะ 100%

📜

Traceability

เมื่อใช้ร่วมกับ Git เราจะรู้ได้ทันทีว่า "ใคร" เปลี่ยนแปลงค่าเซิร์ฟเวอร์ "อะไร" และ "เมื่อไหร่" (Audit Trail)

IaC และ DevOps Culture

IaC เป็นรากฐานสำคัญที่ทำให้กระบวนการ DevOps สมบูรณ์

🔄
Reusability (การใช้ซ้ำ): เขียนโค้ดครั้งเดียว สามารถนำไปใช้สร้าง Environment ใหม่ (Dev, QA, Prod) ได้ทันที
Easy Rollback (ย้อนกลับง่าย): หากอัปเดตระบบแล้วพัง สามารถรันโค้ดเวอร์ชันก่อนหน้าเพื่อย้อนกลับสถานะเซิร์ฟเวอร์ได้อย่างรวดเร็ว
🤝
Collaboration (การทำงานร่วมกัน): Dev และ Ops ใช้ภาษาเดียวกันในการคุยเรื่อง Infrastructure ผ่านไฟล์โค้ด

ประเภทของเครื่องมือ IaC

1. Infrastructure Provisioning

เน้นการ "สร้าง" ทรัพยากร (เช่น เช่า VM ใหม่, สร้าง VPC, สร้าง Load Balancer บน Cloud)

  • Terraform
  • AWS CloudFormation
  • Pulumi

2. Configuration Management

เน้นการ "ตั้งค่า" ภายในเซิร์ฟเวอร์ที่มีอยู่แล้ว (เช่น ติดตั้ง Nginx, สร้าง User, แก้ไขไฟล์ Config)

  • Ansible (เครื่องมือหลักของเราในสัปดาห์นี้)
  • Chef
  • Puppet

เครื่องมือในตลาด IaC (Market Landscape)

🏗️
Terraform Provisioning (Declarative)
🅰️
Ansible Config Mgmt (Procedural/Dec)
👨‍🍳
Chef Config Mgmt (Imperative)
🎭
Puppet Config Mgmt (Declarative)

*ในโลกความเป็นจริง มักใช้ร่วมกัน เช่น ใช้ Terraform สร้าง VM และใช้ Ansible เข้าไปติดตั้ง Software

Imperative vs. Declarative

สองแนวคิดหลักในการสั่งงาน Infrastructure

Imperative

บอก "ขั้นตอน (How)" ว่าต้องทำอย่างไรทีละขั้น

⚔️

Declarative

บอก "ผลลัพธ์ (What)" ที่ต้องการ แล้วให้ระบบจัดการหาวิธีเอง

แนวทางแบบ Imperative (ทำอย่างไร)

คุณต้องระบุขั้นตอนอย่างละเอียด (Step-by-step) คล้ายกับการเขียน Bash Script

  • ต้องตรวจสอบเงื่อนไขเอง (เช่น ตรวจก่อนว่าติดตั้งหรือยัง)
  • ถ้ารันซ้ำอาจเกิด Error หรือได้ผลลัพธ์ที่ผิดเพี้ยน
  • ดูแลรักษายากเมื่อระบบซับซ้อนขึ้น

# ตัวอย่าง Bash Script (Imperative)

apt-get update

apt-get install -y nginx

systemctl start nginx

systemctl enable nginx

แนวทางแบบ Declarative (ต้องการอะไร)

คุณระบุเฉพาะ "สภาวะสุดท้ายที่ต้องการ (Desired State)" เครื่องมือจะไปหาวิธีทำให้มันเกิดขึ้นเอง

  • เครื่องมือจะตรวจสอบให้เองว่าปัจจุบันเป็นอย่างไร แล้วปรับแก้เฉพาะส่วนที่ต่าง
  • รันซ้ำกี่ครั้งก็ได้ผลเหมือนเดิม (Idempotent)
  • อ่านง่าย เข้าใจง่าย

# ตัวอย่าง Ansible (Declarative)

- name: Ensure Nginx is installed

  apt:

    name: nginx

    state: present # ขอแค่ให้มี


- name: Ensure Nginx is running

  service:

    name: nginx

    state: started # ขอแค่ให้รันอยู่

สรุปเปรียบเทียบ (Comparison)

Feature Imperative (How) Declarative (What)
Focus บอกขั้นตอนว่าต้องทำอย่างไร บอกผลลัพธ์สุดท้ายที่อยากได้
Learning Curve เริ่มต้นง่าย (เหมือนเขียน Script) ต้องเรียนรู้ Syntax ของเครื่องมือ
Idempotency มักจะไม่มี (ต้องเขียนเช็คเงื่อนไขเอง) มีในตัว (Built-in) ทำซ้ำได้ปลอดภัย
Examples Bash scripts, Chef (mostly) Terraform, Ansible, Kubernetes YAML

แนะนำ Ansible 🅰️

Ansible คือ Open-source IT Automation Tool ที่พัฒนาโดย Red Hat ใช้สำหรับ Configuration Management, Application Deployment, และ Task Automation

ภาษาที่ใช้

เขียนด้วยภาษา Python แต่ผู้ใช้เขียนคำสั่งด้วยรูปแบบ YAML ที่อ่านง่ายเหมือนภาษาอังกฤษ

ลักษณะเด่น

เรียบง่ายทรงพลัง และเน้นการทำงานแบบ Declarative (Desired State)

ทำไมถึงต้องเลือก Ansible?

👻

Agentless

ไม่ต้องลงโปรแกรม (Agent) ไว้ที่เครื่องปลายทาง ต่างจาก Chef/Puppet ทำให้ระบบเบาและปลอดภัย

🔑

Uses SSH / WinRM

ทำงานผ่านโปรโตคอลความปลอดภัยพื้นฐานที่มีอยู่แล้ว (SSH สำหรับ Linux, WinRM สำหรับ Windows)

📖

Simple YAML

ไม่ต้องเรียนรู้ภาษาโปรแกรมมิ่งใหม่ การเขียน Playbook เป็นรูปแบบข้อความที่มนุษย์อ่านเข้าใจทันที

สถาปัตยกรรมของ Ansible (Architecture)

Push Model: ผลักดันคำสั่งจากเครื่องหลักไปยังเครื่องเป้าหมาย

💻

Control Node

  • ติดตั้ง Ansible
  • เก็บ Playbook & Inventory
SSH / Python
➡️ ➡️ ➡️

Managed Node 1 (Web)

Managed Node 2 (DB)

Managed Node 3 (App)

ส่วนประกอบหลัก (The Nodes)

Control Node

เครื่องคอมพิวเตอร์หลักที่เราใช้สั่งงาน (อาจเป็น Laptop ของเรา หรือ Server กลาง)

สิ่งที่ต้องมี:
  • Linux หรือ macOS (Windows ใช้ผ่าน WSL)
  • ติดตั้ง Python
  • ติดตั้งโปรแกรม Ansible

Managed Nodes

เครื่องเป้าหมายที่ Ansible จะเข้าไปจัดการ (เช่น Web Server, Database Server)

สิ่งที่ต้องมี:
  • ไม่ต้องติดตั้ง Ansible
  • ต้องเปิดบริการ SSH (พอร์ต 22)
  • ต้องติดตั้ง Python เพื่อให้รับสคริปต์มารันได้

Inventory (สมุดหน้าเหลืองของ Ansible)

ไฟล์ที่เก็บรายชื่อ IP Address หรือ Hostname ของ Managed Nodes ทั้งหมด

# ไฟล์ inventory (มักใช้ชื่อ hosts หรือ inventory.ini)


[webservers]

192.168.1.10

192.168.1.11

web1.example.com


[dbservers]

192.168.1.20


[all:vars]

ansible_user=ubuntu # กำหนด user สำหรับ SSH

ansible_ssh_private_key_file=~/.ssh/id_rsa

*เราสามารถจัดกลุ่ม (Group) เครื่องเข้าด้วยกัน เช่นกลุ่ม [webservers] เพื่อสั่งงานรวดเดียวทั้งกลุ่ม

Modules (อาวุธของ Ansible)

Modules คือชิ้นส่วนโปรแกรมสำเร็จรูป (Scripts) ที่ทำงานเฉพาะเจาะจง Ansible มี Built-in modules มาให้หลายพันตัว (Batteries included)

Package Mgmt: apt, yum, dnf, pip, npm
Files & Folders: copy, file, template, fetch
Services: service, systemd
Commands: command, shell, script

เมื่อสั่งรัน Ansible จะส่ง Module (Python script) ไปยัง Managed Node เพื่อทำงาน และลบทิ้งเมื่อเสร็จสิ้น

ภาษา YAML 📄

YAML Ain't Markup Language

เป็นภาษาที่ใช้เก็บข้อมูลโครงสร้าง (Data Serialization) ออกแบบมาให้อ่านและเขียนได้ง่ายมากที่สุด "Human-readable"

  • ใช้แพร่หลายในโลก DevOps (Ansible, Kubernetes, GitHub Actions, Docker Compose)
  • ใช้นามสกุลไฟล์ .yml หรือ .yaml
  • เป็นพื้นฐานสำคัญที่ต้องเข้าใจก่อนเขียน Ansible Playbook

กฎพื้นฐานของ YAML (Syntax Rules)

⚠️ สิ่งที่ต้องระวังที่สุด

  • Indentation (การย่อหน้า): แสดงถึงลำดับชั้น (Hierarchy) คล้าย Python
  • ห้ามใช้ Tab เด็ดขาด! (Must use Spaces)
  • ปกติใช้ Space 2 เคาะ ในการย่อหน้า 1 ระดับ
  • ระวังช่องว่างหลังเครื่องหมาย Colon (: ) ต้องมีเสมอ

# คอมเมนต์ใช้เครื่องหมาย Hashtag

name:

John Doe

age:

30

is_developer:

true

# สังเกตการย่อหน้า

skills:

  frontend: React

  backend: Python

โครงสร้างข้อมูลใน YAML

1. Dictionaries (Key-Value Pairs)

จับคู่กุญแจกับค่าของมัน

martin:
  name: Martin D'vloper
  job: Developer
  skill: Elite

2. Lists (Arrays)

รายการข้อมูล ใช้เครื่องหมายขีด (Dash)

fruits:
  - Apple
  - Orange
  - Strawberry
  - Mango

ผสมกันได้ (List of Dictionaries)

- name: John Smith
  role: Admin
- name: Jane Doe
  role: User

YAML vs JSON vs XML

เปรียบเทียบข้อมูลเดียวกัน ทำไมเราถึงรัก YAML

XML (The Past)

<person>
  <name>John</name>
  <age>30</age>
  <skills>
    <skill>Linux</skill>
    <skill>Git</skill>
  </skills>
</person>
              

JSON (The Standard)

{
  "person": {
    "name": "John",
    "age": 30,
    "skills": [
      "Linux",
      "Git"
    ]
  }
}
              

YAML (The DevOps Way)

---
person:
  name: John
  age: 30
  skills:
    - Linux
    - Git
              

Ansible Playbook 📚

Playbook คือไฟล์ YAML ที่เปรียบเสมือน "คู่มือการทำงาน (Instruction Manual)" ที่เราระบุไว้ว่าอยากให้ Ansible เข้าไปทำอะไรในเซิร์ฟเวอร์เป้าหมายบ้าง

  • เป็นหัวใจหลักในการทำ Configuration Management
  • เขียนด้วยรูปแบบ Declarative
  • เป็นไฟล์ที่สามารถเก็บเข้า Version Control (Git) ได้
  • รันกี่ครั้งก็ได้ผลเหมือนเดิม (Idempotent)

ส่วนประกอบของ Playbook (Anatomy)

Playbook

ไฟล์ 1 ไฟล์

➡️

Play

การจับคู่เป้าหมาย (Hosts) กับงานที่ต้องทำ

➡️

Tasks

งานย่อยๆ ที่ทำทีละลำดับ

➡️

Modules

คำสั่งเฉพาะเจาะจง (เช่น apt, copy)

"1 Playbook สามารถมีหลาย Plays, 1 Play สามารถมีหลาย Tasks, 1 Task จะเรียกใช้ 1 Module"

โครงสร้าง Playbook พื้นฐาน

--- (สัญลักษณ์บอกการเริ่มต้นไฟล์ YAML)

- name: Update Web Servers # นี่คือ Play (List item แรก)

  hosts: webservers # เป้าหมาย (อ้างอิงจาก Inventory)

  become: true # ขอสิทธิ์ Root (sudo)


  tasks: # รายการงานที่จะทำใน Play นี้

    - name: Task 1 - Update apt cache

      apt: # เรียกใช้ Module 'apt'

        update_cache: yes


    - name: Task 2 - Do something else

      ...

ตัวอย่างจริง: ติดตั้ง Nginx (Web Server)

---

- name: Setup Nginx Web Server

  hosts: webservers

  become: yes

  tasks:


    - name: Ensure nginx is installed

      apt:

        name: nginx

        state: present


    - name: Ensure nginx is running and enabled

      service:

        name: nginx

        state: started

        enabled: yes

คำอธิบาย

  • become: yes = เปลี่ยนเป็นสิทธิ์ root (สำคัญมากตอนติดตั้งโปรแกรม)
  • apt module = ใช้สำหรับติดตั้ง package (เหมือนรัน apt-get install nginx)
  • service module = จัดการ service (เหมือนรัน systemctl start nginx และ systemctl enable nginx)
$ ansible-playbook -i hosts install_nginx.yml

ความสามารถ Idempotency ♻️

Idempotency คือแนวคิดที่ว่า "คุณสามารถสั่งทำงาน (Execute) สิ่งเดิมซ้ำกี่ครั้งก็ได้ แต่ผลลัพธ์สุดท้ายจะยังคงเหมือนเดิม และจะไม่ทำสิ่งที่ไม่จำเป็น"

▶️
รัน Playbook ครั้งแรก: Ansible เห็นว่ายังไม่มี Nginx จึงทำการ "ติดตั้ง" (Status: changed)
🔁
รัน Playbook ครั้งที่สอง: Ansible เช็คพบว่า Nginx มีอยู่แล้วและรันอยู่ จึง "ไม่ทำอะไรเลย" (Status: ok)

สรุปเนื้อหาบทเรียน (Recap)

IaC ช่วยลด Human Error เพิ่มความเร็ว และสามารถทำซ้ำ (Repeatable) สภาพแวดล้อมได้ 100%
Declarative (Ansible) โฟกัสว่า "อยากได้อะไร (What)" มากกว่า "ทำอย่างไร (How)"
Ansible Architecture มีเพียง Control Node (ที่มี Python/Ansible) ยิงคำสั่งผ่าน SSH ไปหา Managed Node (ไม่ต้องลง Agent)
Playbook และ YAML ใช้อ่านและเขียนได้ง่าย นำมาซึ่งแนวคิด Infrastructure as "Documented" Code

เตรียมตัวทำ Lab! 🛠️

Next: Hands-on Ansible

ในส่วนของปฏิบัติการ (Laboratory) เราจะเปลี่ยนเครื่องส่วนตัวของคุณเป็น Control Node เพื่อจัดการ Infrastructure

  • ✅ ติดตั้ง Ansible บนเครื่องส่วนตัว / WSL
  • ✅ สร้าง Inventory file จำลองเครื่องเป้าหมาย (อาจใช้ VM บน VirtualBox หรือวง LAN)
  • ✅ ทดสอบการเชื่อมต่อด้วย ansible ping (Ad-hoc command)
  • ✅ เขียน Playbook แรก ของคุณเพื่อสั่งติดตั้ง Nginx, Copy หน้าเว็บ HTML และ Start Service อัตโนมัติ
เตรียม SSH Key (ssh-keygen) และความพร้อมของระบบ Linux ไว้ให้ดี!

ภารกิจ: Your First Ansible Playbook 🚀

เปลี่ยนคอมพิวเตอร์ของคุณให้เป็น Control Node เพื่อสั่งติดตั้งและตั้งค่า Web Server อัตโนมัติ

🎯 เป้าหมายของ Lab (Objectives)

  • ✅ ติดตั้ง Ansible บนคอมพิวเตอร์ส่วนตัว (Control Node)
  • ✅ สร้าง Inventory File เพื่อระบุเป้าหมาย (Managed Node)
  • ✅ ทดสอบการเชื่อมต่อด้วย Ad-hoc command (Ping)
  • ✅ เขียน Playbook เพื่อ: ติดตั้ง Nginx, Copy ไฟล์เว็บ, และ Start Service

สถาปัตยกรรมสำหรับ Lab นี้

คุณจะต้องใช้ระบบปฏิบัติการ Linux จำนวน 2 ส่วน (อาจจะเป็น VM, WSL2, หรือเครื่องจริงใน LAN)

💻 Control Node (เครื่องเรา)

เครื่องที่จะใช้เขียนโค้ดและยิงคำสั่ง (เช่น Ubuntu บน WSL2, macOS)

  • ต้องมี Internet เพื่อติดตั้ง Ansible
  • มีไฟล์ Playbook (.yml) และ Inventory
SSH ➡️

🖥️ Managed Node (เครื่องเป้าหมาย)

เครื่องที่จะถูกติดตั้ง Nginx (เช่น VM บน VirtualBox หรือวง LAN)

  • ต้องรู้ IP Address (เช่น 192.168.1.100)
  • ต้องมี User ที่สามารถใช้ sudo ได้
  • เปิดบริการ SSH ไว้ (Port 22)

Step 1: ติดตั้ง Ansible บน Control Node

เปิด Terminal บนเครื่องของคุณ (WSL2 หรือ Linux) แล้วรันคำสั่งต่อไปนี้

# 1. อัปเดตรายการ Package

$ sudo apt update


# 2. ติดตั้ง Ansible

$ sudo apt install ansible -y


# 3. ตรวจสอบเวอร์ชันเพื่อยืนยันการติดตั้ง

$ ansible --version

ansible [core 2.x.x] ...

Step 2: เตรียมความพร้อม SSH (Password-less)

เพื่อให้ Ansible ทำงานอัตโนมัติได้ราบรื่น ควรตั้งค่า SSH Key เพื่อไม่ให้ต้องพิมพ์รหัสผ่านทุกครั้ง

# 1. สร้าง SSH Key บน Control Node (กด Enter ผ่านไปเรื่อยๆ)

$ ssh-keygen


# 2. Copy Key ไปยัง Managed Node (เปลี่ยน IP และ Username)

$ ssh-copy-id target_user@192.168.x.x


# 3. ทดสอบ Login (ถ้าเข้าได้โดยไม่ถาม Password ถือว่าสำเร็จ!)

$ ssh target_user@192.168.x.x

*หมายเหตุ: หากใช้สภาพแวดล้อมที่ห้ามใช้ SSH Key สามารถใช้การถาม Password ตอนรัน Playbook ได้โดยเพิ่ม -k -K

Step 3: สร้าง Inventory File

สร้างโฟลเดอร์สำหรับโปรเจกต์และสร้างไฟล์สมุดหน้าเหลือง (Inventory) เพื่อระบุเป้าหมาย

$ mkdir my-ansible-lab && cd my-ansible-lab

$ nano hosts


# เพิ่มเนื้อหาลงในไฟล์ hosts:

[webservers]

192.168.x.x # (เปลี่ยนเป็น IP ของ VM/Managed Node ของคุณ)


[webservers:vars]

ansible_user=target_user # (เปลี่ยนเป็นชื่อ user ของเครื่องเป้าหมาย)

Step 4: ทดสอบการเชื่อมต่อ (Ad-hoc Command)

ใช้ Ansible ping module เพื่อตรวจสอบว่า Control Node คุยกับ Managed Node ได้หรือไม่

# สั่ง ping ไปยังกลุ่ม webservers โดยใช้ไฟล์ hosts ที่เราสร้าง

$ ansible webservers -i hosts -m ping


# ผลลัพธ์ที่ควรได้:

192.168.x.x | SUCCESS => {

    "changed": false,

    "ping": "pong"

}

✅ ถ้าขึ้น "ping": "pong" แสดงว่า Ansible พร้อมเข้าไปทำงานที่เครื่องเป้าหมายแล้ว!

Step 5: เตรียมไฟล์ HTML

ก่อนเขียน Playbook ให้สร้างไฟล์ HTML ง่ายๆ บนเครื่อง Control Node เพื่อเตรียม Copy ไปยัง Web Server

$ nano index.html


# พิมพ์โค้ด HTML เบื้องต้น:

<html>

<head><title>Ansible Lab</title></head>

<body style="background-color: #282c34; color: white; text-align: center; margin-top: 50px;">

  <h1>🚀 Hello DevOps!</h1>

  <p>This web server was configured automatically by Ansible.</p>

</body>

</html>

Step 6: เริ่มเขียน Playbook (ติดตั้ง Nginx)

สร้างไฟล์ setup-web.yml และกำหนดโครงสร้างของ Play พร้อม Task แรก

$ nano setup-web.yml


---

- name: Setup Web Server

  hosts: webservers

  become: yes # ขอสิทธิ์ sudo ในการทำงาน


  tasks:

    - name: Install Nginx package

      apt: # ใช้โมดูล apt (สำหรับ Ubuntu/Debian)

        name: nginx

        state: present # ต้องการให้มีการติดตั้งอยู่ (Declarative)

        update_cache: yes # เหมือนสั่ง apt update ก่อน

Step 7: เพิ่ม Task การ Copy ไฟล์

ต่อจาก Task เดิม ให้เพิ่มคำสั่ง copy นำไฟล์ HTML ไปวางที่เซิร์ฟเวอร์ปลายทาง

... (ต่อจากโค้ดสไลด์ที่แล้ว)


    - name: Copy custom index.html

      copy: # ใช้โมดูล copy

        src: index.html # ไฟล์ต้นทางที่เครื่อง Control Node

        dest: /var/www/html/index.html # ตำแหน่งปลายทางบน Managed Node

        mode: '0644' # กำหนด Permission ให้ไฟล์

Step 8: เพิ่ม Task การ Start Service

ปิดท้ายด้วยการใช้โมดูล service เพื่อให้มั่นใจว่า Nginx ทำงานอยู่

... (ต่อจากโค้ดสไลด์ที่แล้ว)


    - name: Ensure Nginx is started and enabled

      service: # ใช้โมดูล service

        name: nginx # ชื่อ service

        state: started # ให้รันอยู่เสมอ

        enabled: yes # ให้ start อัตโนมัติเมื่อเปิดเครื่อง (systemctl enable)

⚠️ ระวังเรื่อง Indentation (การย่อหน้า) ใน YAML: ต้องใช้ Spacebar เสมอ ห้ามใช้ Tab

Step 9: รัน Ansible Playbook

ถึงเวลาแสดงพลังของ IaC! รัน Playbook เพื่อตั้งค่าเซิร์ฟเวอร์ทั้งหมดด้วยคำสั่งเดียว

# รัน Playbook โดยใช้ Inventory (-i) ที่เราสร้างไว้

$ ansible-playbook -i hosts setup-web.yml -K

(-K จะถามรหัสผ่าน sudo (BECOME password) ของเครื่องเป้าหมาย)


PLAY [Setup Web Server] *************************************************


TASK [Gathering Facts] **************************************************

ok: [192.168.x.x]


TASK [Install Nginx package] ********************************************

changed: [192.168.x.x]


TASK [Copy custom index.html] *******************************************

changed: [192.168.x.x]


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

192.168.x.x : ok=4 changed=2 unreachable=0 failed=0

Step 10: ตรวจสอบผลลัพธ์ (Verification)

เปิด Web Browser

นำ IP Address ของเครื่อง Managed Node (เช่น http://192.168.x.x) ไปเปิดใน Browser บนเครื่องของคุณ

🚀 Hello DevOps!

This web server was configured automatically by Ansible.

ลองรันซ้ำอีกรอบ (Idempotency)

$ ansible-playbook -i hosts setup-web.yml -K

คุณจะเห็นว่าสถานะเปลี่ยนจาก changed เป็น ok ทั้งหมด เพราะ Ansible รู้ว่าติดตั้งเรียบร้อยแล้วและไม่มีการเปลี่ยนแปลง

🛠️ Troubleshooting (การแก้ปัญหาที่พบบ่อย)

Error: Unreachable (SSH Error)

สาเหตุ: Ansible เชื่อมต่อ SSH ไปเครื่องเป้าหมายไม่ได้

วิธีแก้: เช็ค IP ว่าถูกต้องไหม, เครื่องเปิดอยู่หรือเปล่า, และทดสอบใช้คำสั่ง ssh user@IP ด้วยตัวเองดูก่อน

Error: Missing sudo password

สาเหตุ: Task ต้องการสิทธิ์ Root (become: yes) แต่ไม่ได้ให้รหัสผ่าน

วิธีแก้: เติม -K หรือ --ask-become-pass ตอนรันคำสั่ง ansible-playbook

Error: Syntax Error in YAML

สาเหตุ: ย่อหน้าผิด หรือใช้ Tab แทน Space

วิธีแก้: ตรวจสอบการเว้นวรรคให้ตรงกันทุกบรรทัดระดับเดียวกัน และเช็คเครื่องหมาย : (ต้องมีช่องว่างตามหลังเสมอ)

Error: Could not find or access 'index.html'

สาเหตุ: ไม่พบไฟล์ต้นทางที่กำหนดใน src

วิธีแก้: ตรวจสอบว่าคุณสร้างไฟล์ index.html ไว้ในโฟลเดอร์เดียวกับที่รันคำสั่ง ansible หรือระบุ path ผิด

🎉

Lab Complete! การส่งงาน

รายละเอียดสิ่งที่ต้องส่ง (Submission):

  • ไฟล์ Code:
    • ไฟล์ hosts (Inventory)
    • ไฟล์ setup-web.yml (Playbook)
    • ไฟล์ index.html
  • Screenshots (รวมเป็น PDF):
    • ภาพผลลัพธ์ตอนรัน ansible-playbook สำเร็จ (แสดง PLAY RECAP)
    • ภาพหน้า Web Browser ที่แสดงผลเว็บ 🚀 Hello DevOps! บน IP ของ Managed Node