สวัสดีชาวโลกฮะ

ครั้งก่อน เคยพูดถึงโปรแกรม Talend ที่ใช้ทำ Data integration (Data integration (EP 3 จบ)) มันก็มีประเด็นว่า หลายครั้งที่เราต้องการตั้ง job ให้ run อย่างสะดวกๆ หน่อย เพราะ crontab หรือ Task scheduler มันไม่สามารถทำงานบางอย่างได้ เช่น log ผมจึงขอนำเสนอเครื่องมืออีกตัวนึงสำหรับทำ Automated jobs นั่นคือ

Ref: https://www.rundeck.com

Rundeck เป็นโปรแกรมตัวนึงที่เราสามารถใช้ทำ Job orchestration หรือการตั้ง job ต่อเนื่องได้ฮะ

หลักการของมันคือ กำหนดเวลาเพื่อสั่งรันคำสั่งตามที่กำหนด จะคล้ายๆ crontab นั่นแหละฮะ แต่มันมีฟีเจอร์หลายตัวช่วยให้ทำงานสะดวกขึ้นฮะ เช่น

  • บันทึก log หรือประวัติการรันได้
  • กำหนดคำสั่งถัดไป เมื่อรันล้มเหลว
  • เชื่อมต่อกับ webhook เพื่อส่ง notification ได้ รวมถึง slack
  • และอีกมากฮะ

และเพื่อให้ใช้งานกันแบบสะดวกขึ้น เราจะใช้ container ของ Docker (ลองใช้ Docker กัน) มาช่วยจัดการ environment พร้อมกับใช้ Git (มาลองเล่น Git กัน) เพื่อ deploy code กันสะดวกๆ ฮะ

สำหรับขั้นตอนหลักๆ ในรอบนี้ จะมี

  1. สร้าง Talend job แล้วโยนขึ้น Git repo
  2. ติดตั้ง Container ของ Rundeck
  3. สร้าง job ใน Rundeck กัน

เรามาเริ่มกันเลยฮะ

1. สร้าง Talend job แล้วโยนขึ้น Git repo

1.1 Build a job

ผมจะสร้าง Talend job ง่ายๆ คือ แสดงชื่อคนมาสิบชื่อก็พอ เพื่อทดสอบกันฮะ ตามรูปข้างล่างนี้

ใช้ tRowGeneratator และกำหนดให้ getFirstname() มา 10 rows
ผลลัพท์การ run คือ ได้ชื่อมาสิบชื่อ
build มันออกมา

1.2 Push ไป Git repo

จากนั้นก็ push ขึ้น Git repo ฮะ เราจะได้ repo แบบเร็วๆ มาหนึ่งตัว เย่

1.3 App passwords

รอบนี้ เราจะใช้ฟีเจอร์ App password ของ Git repo นะฮะ เพื่อให้คนอื่นเข้าถึง repo เราได้ เนื่องจากเคสนี้ Rundeck จะ run ด้วย user ที่ชื่อ “Rundeck” ฮะ นั่นก็คือ “คนอื่น”​ ที่ไม่ใช่ Root ของระบบใน Container นั่นเองฮะ

เข้าหน้านี้ ได้จากคลิกที่รูปโปรไฟล์แล้วเลือก Setting ที่หน้านี้เลือก Developer settings
Personal access token >> Generate new token
ใส่ Note และเลือก scope เป็น repo
ได้ app password เป็น token ตัวนี้ บันทึกเก็บให้ดีๆ นะฮะ

อ่านเพิ่มเติมได้ที่นี่ฮะ 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 ก่อนเลย

คลิก “New Project+”
ใส่ชื่อและรายละเอียดอื่นๆ

3.3 สร้าง job ใน project

คลิก “Job”
ใส่ชื่อและรายละเอียดของ job ที่หน้า Details
ที่หน้า Workflow เราจะกำหนดคำสั่งใน job ที่นี่ฮะ
เพิ่ม step ของคำสั่งที่นี่

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 (ถ้ามี) แล้วกดบันทึกได้เลย รอผลลัพท์ของเราได้หลังจากนี้ฮะ

Workflow ที่สมบูรณ์
กำหนดเวลา schedule
กำหนด notifications
บันทึกเรียบร้อย ลองกด “Run Job Now”
ได้ชื่อสิบชื่อตามที่ออกแบบฮะ

Job definitions

และสุดท้าย ถ้าเราต้องการ import job ก็สามารถ upload ได้ดังรูปข้างล่างฮะ ซึ่งไฟล์ที่ใช้ เราจะได้มาจากการ export ผ่านปุ่ม action ขวาบนของ job นั้นๆ ฮะ

“Job Actions” >> “Upload Definitions” เพื่อเข้าหน้า import job
เลือกไฟล์และกำหนดรายละเอียด

นี่คือ ตัวอย่างนะฮะ ซึ่งตอนนี้ผมก็ใช้งานมันอย่างจริงจังเลยฮะ บน Production ก็ถือว่าสะดวกเลยนะฮะ สร้างก็สร้างบน Talend สร้างเสร็จก็โยนขึ้น Git repo เสร็จแล้วก็กำหนดใน Rundeck พอจะแก้ไขอะไรก็แก้ไขให้เสร็จก่อนจะโยนขึ้น Git repo เหมือนเดิม job ก็ทำงานของมันไป update ไปอัตโนมัติฮะ

คราวหน้าจะเป็นเรื่องอะไร จะมาเล่าให้อ่านกันนะฮะ

บาย~