ลองใช้ Rundeck เพื่องาน deployment อัตโนมัติ
สวัสดีชาวโลกฮะ
ครั้งก่อน เคยพูดถึงโปรแกรม Talend ที่ใช้ทำ Data integration (Data integration (EP 3 จบ)) มันก็มีประเด็นว่า หลายครั้งที่เราต้องการตั้ง job ให้ run อย่างสะดวกๆ หน่อย เพราะ crontab หรือ Task scheduler มันไม่สามารถทำงานบางอย่างได้ เช่น log ผมจึงขอนำเสนอเครื่องมืออีกตัวนึงสำหรับทำ Automated jobs นั่นคือ
Rundeck เป็นโปรแกรมตัวนึงที่เราสามารถใช้ทำ Job orchestration หรือการตั้ง job ต่อเนื่องได้ฮะ
หลักการของมันคือ กำหนดเวลาเพื่อสั่งรันคำสั่งตามที่กำหนด จะคล้ายๆ crontab นั่นแหละฮะ แต่มันมีฟีเจอร์หลายตัวช่วยให้ทำงานสะดวกขึ้นฮะ เช่น
- บันทึก log หรือประวัติการรันได้
- กำหนดคำสั่งถัดไป เมื่อรันล้มเหลว
- เชื่อมต่อกับ webhook เพื่อส่ง notification ได้ รวมถึง slack
- และอีกมากฮะ
และเพื่อให้ใช้งานกันแบบสะดวกขึ้น เราจะใช้ container ของ Docker (ลองใช้ Docker กัน) มาช่วยจัดการ environment พร้อมกับใช้ Git (มาลองเล่น Git กัน) เพื่อ deploy code กันสะดวกๆ ฮะ
สำหรับขั้นตอนหลักๆ ในรอบนี้ จะมี
- สร้าง Talend job แล้วโยนขึ้น Git repo
- ติดตั้ง Container ของ Rundeck
- สร้าง job ใน Rundeck กัน
เรามาเริ่มกันเลยฮะ
1. สร้าง Talend job แล้วโยนขึ้น Git repo
1.1 Build a job
ผมจะสร้าง Talend job ง่ายๆ คือ แสดงชื่อคนมาสิบชื่อก็พอ เพื่อทดสอบกันฮะ ตามรูปข้างล่างนี้
1.2 Push ไป Git repo
จากนั้นก็ push ขึ้น Git repo ฮะ เราจะได้ repo แบบเร็วๆ มาหนึ่งตัว เย่
1.3 App passwords
รอบนี้ เราจะใช้ฟีเจอร์ App password ของ Git repo นะฮะ เพื่อให้คนอื่นเข้าถึง repo เราได้ เนื่องจากเคสนี้ Rundeck จะ run ด้วย user ที่ชื่อ “Rundeck” ฮะ นั่นก็คือ “คนอื่น” ที่ไม่ใช่ Root ของระบบใน Container นั่นเองฮะ
อ่านเพิ่มเติมได้ที่นี่ฮะ https://help.github.com/en/github/authenticating-to-github/creating-a-personal-access-token-for-the-command-line
2. ติดตั้ง Container ของ Rundeck
ต่อมาเราก็จะ download Docker image ได้จากลิงก์นี้ฮะ https://hub.docker.com/r/rundeck/rundeck แล้วก็เชื่อมต่อ Git repo จากข้างใน container นะฮะ
2.1 Access Container ด้วยสิทธิ Root แล้ว install Git
docker exec -it -u root [docker_container_name]
root@docker $ apt-get update
root@docker $ apt-get install git-core
2.2 สร้าง local Git repo folder
สมมติว่าให้ชื่อ test นะฮะ
mkdir test
cd test/
2.3 clone remote repo ลงมาที่ local git repo folder
ตรงนี้จะมีการถามรหัส ก็ใส่ App password ที่ได้จากข้างบนลงไปฮะ
git clone [https://github.com/username/git.git]
2.4 ปรับสิทธิจาก Root เป็น Rundeck
ตรงนี้ฮะที่เราจะต้องปรับแก้สิทธิ ถ้าเราไม่ทำตรงนี้ เวลา job run ใน Rundeck มันก็จะฟ้องเรื่อง Permission denied ตลอดเลยนะฮะ
chown -R rundeck [git_folder]
2.5 เปลี่ยน remote origin ให้เป็น HTTPS protocol
เป็นวิธีง่ายๆ วิธีนึงเพื่อ connect repo ด้วย App password ได้ฮะ
git remote set-url origin [https://username:[email protected]/username/git.git]
git remote show origin
ถ้าสำเร็จ เราจะสามารถใช้คำสั่ง git fetch
ได้โดยไม่เจอ error ฮะ
git fetch --all
3. สร้าง job ใน Rundeck กัน
3.1 Login เข้า Rundeck
โดยเริ่มต้นเนี่ย Rundeck จะมี account เบื้องต้นให้ใช้งาน เราสามารถดูได้จากไฟล์ /home/rundeck/server/config/realm.properties
ฮะ โดยสิทธิเริ่มต้นที่ให้มาได้แก่
- username = admin
password = admin
role = admin, user - username = user
password = user
role = user
ซึ่ง role ตรงนี้จะไปโยงกับ Access Control ที่ระบุใน configuration file อีกทีนะฮะ แต่ผมไม่ขอลงรายละเอียดในจุดนี้
เมื่อ container start แล้ว ลองเข้าไปที่ http://localhost:4440 จะเจอหน้านี้ฮะ ให้เราใช้ username ของ admin เข้าไปได้เลยฮะ
3.2 สร้าง project ก่อนเลย
3.3 สร้าง job ใน project
3.4 ดึงข้อมูลจาก Remote repo เพื่อ update source code ใน local repo
ตอนนี้ เราจะเพิ่ม step เป็น script กันฮะ
ณ จุดนี้ เราจะใช้คำสั่ง update local repo จาก remote repo จะทำให้เวลา deploy production เราก็แค่ push remote repo หลังจากนั้น job ก็จะ update และทำงานเองอัตโนมัติฮะ
cd /home/rundeck/test/test_rundeck/
git fetch – all
git reset – hard origin/master
เราใช้ git fetch --all
เพื่อดึง source code ทั้งหมดจาก remote repo มาไว้ที่ local และใช้ git reset --hard origin/master
เพื่อบังคับให้อยู่ในสถานะล่าสุดฮะ หมายถึงถ้ามีการเปลี่ยนแปลงอะไรใน local ให้ยกเลิกทั้งหมด เราทำแบบนี้เพื่อป้องกันการเปลี่ยนแปลง source code ใน local ของ production ไม่ให้กระทบ remote repo ฮะ
หลังจากนั้น เราจะเพิ่ม step เพื่อ run Talend source code ฮะ
sh /home/rundeck/test/test_rundeck/sample_job01_0.1/sample_job01/sample_job01_run.sh
3.5 ตั้งค่าเพิ่มเติมก่อนรันจริง
เสร็จแล้วก็ตั้งเวลา กำหนดการส่ง Notification (ถ้ามี) แล้วกดบันทึกได้เลย รอผลลัพท์ของเราได้หลังจากนี้ฮะ
Job definitions
และสุดท้าย ถ้าเราต้องการ import job ก็สามารถ upload ได้ดังรูปข้างล่างฮะ ซึ่งไฟล์ที่ใช้ เราจะได้มาจากการ export ผ่านปุ่ม action ขวาบนของ job นั้นๆ ฮะ
นี่คือ ตัวอย่างนะฮะ ซึ่งตอนนี้ผมก็ใช้งานมันอย่างจริงจังเลยฮะ บน Production ก็ถือว่าสะดวกเลยนะฮะ สร้างก็สร้างบน Talend สร้างเสร็จก็โยนขึ้น Git repo เสร็จแล้วก็กำหนดใน Rundeck พอจะแก้ไขอะไรก็แก้ไขให้เสร็จก่อนจะโยนขึ้น Git repo เหมือนเดิม job ก็ทำงานของมันไป update ไปอัตโนมัติฮะ
คราวหน้าจะเป็นเรื่องอะไร จะมาเล่าให้อ่านกันนะฮะ
บาย~