Tag Archive Provisioning

Byphunsanit

Docker: Samba Script เริ่มต้นระบบ ( Provisioning Check )

สคริปต์ entrypoint.sh นี้ทำหน้าที่เป็นตัวจัดการระบบก่อนเริ่มต้นทำงาน ( มักใช้ใน Docker Container ) เพื่อใช้ตั้งค่าและรัน อย่าง Samba Active Directory Domain Controller (AD DC) แบบอัตโนมัติครับ

การทำงานของสคริปต์แบ่งออกเป็น 5 ขั้นตอนหลัก

  1. ตั้งค่าตัวแปรเบื้องต้น ( Variables Definition )
    สคริปต์จะดึงค่า Environment Variables มาใช้งาน หากไม่ได้มีการส่งค่าเข้ามา จะใช้ค่าเริ่มต้น (Default) ที่กำหนดไว้แทน
    • DOMAIN: SAMDOM
    • REALM: SAMDOM.EXAMPLE.COM
    • ADMIN_PASSWORD: Password123!
    • DNS_FORWARDER: 8.8.8.8 ( ส่งต่อการสืบค้น DNS ไปที่ Google DNS )
  2. ตรวจสอบสถานะการติดตั้ง ( Condition Check )
    สคริปต์จะตรวจสอบว่ามีไฟล์ smb.conf ( ไฟล์ตั้งค่า ) และ sam.ldb ( ไฟล์ฐานข้อมูลของ Samba ) อยู่ในระบบหรือไม่ เพื่อดูว่าเซิร์ฟเวอร์นี้เคยผ่านการตั้งค่า Samba ( Provision ) มาแล้วหรือยัง ขั้นตอนนี้ช่วยป้องกันไม่ให้ระบบสร้างการตั้งค่าใหม่ทับของเดิม ซึ่งจะทำให้ข้อมูลและ Config ต่างๆ สูญหายหากมีการรีสตาร์ทระบบใหม่
  3. กรณีที่ยังไม่เคยติดตั้ง ( Provisioning )
    หากตรวจสอบแล้วไม่พบไฟล์ระบบ สคริปต์จะเริ่มตั้งค่า AD DC ใหม่ทั้งหมด
    • ล้างค่าเดิม: ลบไฟล์ /etc/samba/smb.conf ที่อาจตกค้างทิ้งไป
    • สร้าง Domain Controller: รันคำสั่ง samba-tool domain provision เพื่อสร้าง AD DC ขึ้นมาตามตัวแปรที่ตั้งไว้ด้านบน
    • ตั้งค่า Kerberos: คัดลอกไฟล์ตั้งค่าระบบยืนยันตัวตน /var/lib/samba/private/krb5.conf ไปไว้ที่ /etc/krb5.conf เพื่อให้ระบบใช้งานได้สมบูรณ์
    • สร้างผู้ใช้งานตัวอย่าง: มีการเขียนฟังก์ชันเพื่อสร้าง User เข้าสู่ระบบทันที 3 บัญชี ได้แก่ phunsait, pitt.p, และ plusmagi โดยกำหนดรหัสผ่านของทุกคนเป็น Password123!
  4. กรณีที่เคยติดตั้งแล้ว ( Already Provisioned )
    หากตรวจสอบแล้วพบว่ามีไฟล์ Config อยู่ สคริปต์จะข้ามขั้นตอนที่ 3 ไปทั้งหมด และแสดงข้อความว่า Samba AD DC already provisioned. เพื่อใช้การตั้งค่าและฐานข้อมูลเดิมที่มีอยู่ต่อไป
  5. เริ่มการทำงานของเซอร์วิส ( Start Samba )
    บรรทัดสุดท้าย exec samba -i -M standard จะเป็นการสั่งรันเซอร์วิส Samba ให้อยู่ในโหมดทำงานเบื้องหน้า ( Foreground ) ซึ่งเป็นรูปแบบที่จำเป็นเพื่อให้ Container ยังคงทำงานต่อไปได้ไม่ปิดตัวเองลง

entrypoint.sh

#!/bin/bash
set -e

# Define variables
DOMAIN=${SAMBA_DOMAIN:-SAMDOM}
REALM=${SAMBA_REALM:-SAMDOM.EXAMPLE.COM}
ADMIN_PASSWORD=${SAMBA_ADMIN_PASSWORD:-Password123!}
DNS_FORWARDER=${SAMBA_DNS_FORWARDER:-8.8.8.8}

# Check if Samba is already provisioned
# Check if Samba is already provisioned
if [[ ! -f /etc/samba/smb.conf ]] || [[ ! -f /var/lib/samba/private/sam.ldb ]]; then
	echo "Provisioning Samba AD DC..."

	# Remove default smb.conf if it exists
	rm -f /etc/samba/smb.conf

	# Provision the domain
	samba-tool domain provision \
		--server-role=dc \
		--use-rfc2307 \
		--dns-backend=SAMBA_INTERNAL \
		--realm="$REALM" \
		--domain="$DOMAIN" \
		--adminpass="$ADMIN_PASSWORD" \
		--option="dns forwarder = $DNS_FORWARDER"

	# Copy kerberos config
	if [ -f /var/lib/samba/private/krb5.conf ]; then
		cp /var/lib/samba/private/krb5.conf /etc/krb5.conf
	fi

	# --- Add Sample Users ---
	echo "Creating sample users..."

	# Function to create user if not exists
	create_user() {
		local username="$1"
		local password="$2"
		samba-tool user create "$username" "$password" || true # Ignore error if exists
		echo "Created user: $username"
	}

	# Add users (Username Password)
	create_user "phunsait" "Password123!"
	create_user "pitt.p" "Password123!"
	create_user "plusmagi" "Password123!"

	echo "Samba AD DC provisioned successfully with sample users."
else
	echo "Samba AD DC already provisioned."
fi

# Start Samba
exec samba -i -M standard

อ่านเพิ่มเติม