สคริปต์ entrypoint.sh นี้ทำหน้าที่เป็นตัวจัดการระบบก่อนเริ่มต้นทำงาน ( มักใช้ใน Docker Container ) เพื่อใช้ตั้งค่าและรัน อย่าง Samba Active Directory Domain Controller (AD DC) แบบอัตโนมัติครับ
การทำงานของสคริปต์แบ่งออกเป็น 5 ขั้นตอนหลัก
- ตั้งค่าตัวแปรเบื้องต้น ( Variables Definition )
สคริปต์จะดึงค่า Environment Variables มาใช้งาน หากไม่ได้มีการส่งค่าเข้ามา จะใช้ค่าเริ่มต้น (Default) ที่กำหนดไว้แทน- DOMAIN:
SAMDOM - REALM:
SAMDOM.EXAMPLE.COM - ADMIN_PASSWORD:
Password123! - DNS_FORWARDER:
8.8.8.8( ส่งต่อการสืบค้น DNS ไปที่ Google DNS )
- DOMAIN:
- ตรวจสอบสถานะการติดตั้ง ( Condition Check )
สคริปต์จะตรวจสอบว่ามีไฟล์smb.conf( ไฟล์ตั้งค่า ) และsam.ldb( ไฟล์ฐานข้อมูลของ Samba ) อยู่ในระบบหรือไม่ เพื่อดูว่าเซิร์ฟเวอร์นี้เคยผ่านการตั้งค่า Samba ( Provision ) มาแล้วหรือยัง ขั้นตอนนี้ช่วยป้องกันไม่ให้ระบบสร้างการตั้งค่าใหม่ทับของเดิม ซึ่งจะทำให้ข้อมูลและ Config ต่างๆ สูญหายหากมีการรีสตาร์ทระบบใหม่ - กรณีที่ยังไม่เคยติดตั้ง ( 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!
- ล้างค่าเดิม: ลบไฟล์
- กรณีที่เคยติดตั้งแล้ว ( Already Provisioned )
หากตรวจสอบแล้วพบว่ามีไฟล์ Config อยู่ สคริปต์จะข้ามขั้นตอนที่ 3 ไปทั้งหมด และแสดงข้อความว่าSamba AD DC already provisioned.เพื่อใช้การตั้งค่าและฐานข้อมูลเดิมที่มีอยู่ต่อไป - เริ่มการทำงานของเซอร์วิส ( 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
อ่านเพิ่มเติม
