Atuin Desktop: Runbook ที่รันได้
(blog.atuin.sh)- Atuin Desktop คือ ตัวแก้ไข runbook แบบ local-first ที่ดูเหมือนเอกสารแต่ทำงานได้เหมือนเทอร์มินัล เป็นเครื่องมือที่มุ่งเปลี่ยนขั้นตอนปฏิบัติการที่ทำซ้ำๆ ให้กลายเป็นเวิร์กโฟลว์ที่แชร์กันได้
- จัดการทั้งคำสั่งเชลล์, คิวรีฐานข้อมูล, และ HTTP request ร่วมกันภายใน script block พร้อมเทอร์มินัลในตัว, ไคลเอนต์ฐานข้อมูล, และกราฟ Prometheus
- หาก Atuin CLI มอบ shell history ที่ซิงก์และค้นหาได้ Desktop ก็ขยายแนวคิดนี้ไปเป็น เอกสารที่รันได้ เพื่อไม่ให้ความรู้ของทีมคงอยู่แค่ในความจำของแต่ละคนหรือใน history เท่านั้น
- ทีม Atuin ใช้งานมันจริงอยู่แล้วกับการปล่อย Atuin CLI, การย้ายโครงสร้างพื้นฐานข้าม environment, การรันงานบน staging/prod, รวมถึงการจัดการและทำงานร่วมกันกับคิวรีฐานข้อมูลจริง
- ขั้นถัดไปมีแผนเพิ่ม Team accounts และความสามารถในการสร้าง runbook จาก shell history โดยขณะนี้เปิดให้เข้าร่วม early access อยู่
ทำเอกสารให้กับขั้นตอนปฏิบัติการที่เคยพึ่งความจำส่วนบุคคล
- งานด้านโครงสร้างพื้นฐานจำนวนมากยังพึ่งคำสั่งไม่กี่บรรทัดที่ใครสักคนจำได้ตอนเกิดเหตุขัดข้อง และเอกสารก็มักไม่มีหรือเก่าไปแล้ว
- เบาะแสที่ใช้แก้ปัญหาจริงอาจกระจัดกระจายอยู่ในเธรด Slack, เอกสาร Notion, หรือ shell history ส่วนตัว
- Atuin CLI แก้ปัญหานี้ไปบางส่วนด้วย shell history ที่ซิงก์และค้นหาได้ แต่สำหรับทีมยังต้องการมากกว่า history คือ เวิร์กโฟลว์ที่แชร์ร่วมกันได้
- Atuin Desktop คือตัวแก้ไข runbook แบบรันได้ที่สร้างขึ้นบนแนวคิดว่า “runbook ควรต้องรันได้”
- ดาวน์โหลดได้จากหน้าดาวน์โหลด
เวิร์กโฟลว์เทอร์มินัลที่รันได้จากในเอกสาร
- Atuin Desktop ถูกออกแบบมาให้รันเวิร์กโฟลว์เทอร์มินัลจริงจากภายใน UI แบบเอกสาร
-
องค์ประกอบงานที่ถูกรวมไว้ในที่เดียว
- script block
- เทอร์มินัลในตัว
- ไคลเอนต์ฐานข้อมูล
- กราฟ Prometheus
-
ความสามารถที่มีให้
- ลดการสลับบริบท: เชื่อมคำสั่งเชลล์, คิวรีฐานข้อมูล, และ HTTP request เข้าด้วยกัน
- เอกสารที่ไม่เสื่อมสภาพ: รันได้จากในเอกสารโดยตรงเพื่อคงความทันสมัยไว้
- ระบบอัตโนมัติที่นำกลับมาใช้ซ้ำได้: สร้าง runbook แบบไดนามิกด้วยเทมเพลตสไตล์ Jinja
- นึกออกได้ทันที: มี autocomplete จาก shell history จริง
- Local-first, CRDT-powered: สิ่งที่รันได้ในเทอร์มินัล ก็รันได้ใน runbook เช่นกัน
- ซิงก์และแชร์ผ่าน Atuin Hub: ทำให้ข้อมูลอัปเดตล่าสุดอยู่เสมอระหว่างอุปกรณ์และทีม
กรณีใช้งานจริงและสถานะการเปิดให้ใช้งาน
- ทีม Atuin ใช้ Atuin Desktop กับงานจริงอยู่แล้ว
- การปล่อย Atuin CLI
- การย้ายโครงสร้างพื้นฐานข้าม environment
- การรันงานบน staging หรือ prod
- การจัดการและทำงานร่วมกันกับคิวรีฐานข้อมูลจริง
- ฟีเจอร์ถัดไปที่วางแผนไว้คือ Team accounts และความสามารถในการสร้าง runbook จาก shell history
- ขณะนี้กำลังทยอยเปิดให้ใช้งาน และสามารถเข้าร่วมได้ผ่าน early access list
1 ความคิดเห็น
ความคิดเห็นบน Hacker News
ถ้าคุณสนใจ Emacs สามารถทำงานคล้าย ๆ กันได้ด้วย org-babel
ไฟล์ข้อความธรรมดาไฟล์เดียวสามารถเป็นทั้งโปรแกรม เอกสาร/โน้ตบุ๊ก/เว็บไซต์ และเป็นตัวอย่างที่น่าเชื่อถือของ literate programming
คำอธิบายที่ดีอยู่ที่นี่: https://osem.seagl.org/conferences/seagl2019/program/proposa...
ตอนเรียนจากหนังสือโปรแกรมมิงมันช่วยได้มาก และพอกลับมาดู literate program นั้นภายหลัง ก็เข้าใจย้อนกลับมาได้เร็วกว่าตอนอ่านหนังสือครั้งแรกมาก
ส่วนที่เป็น literate ช่วยตอบคำถาม “โง่ ๆ” ที่เกิดจากการจำเหตุผลหรือความคิดของตัวเองในตอนนั้นไม่ได้ครบ 100%
แน่นอนว่ามีช่วงการเรียนรู้อยู่ จึงไม่เหมาะกับคนที่ไม่อยากเรียนรู้อะไรแบบนั้น
ลองดูวิดีโอนำเสนอ[0] และ Git repository[1] ที่มีเดโมขั้นสูงกว่าได้
[0]: https://www.youtube.com/watch?v=0g9BcZvQbXU
[1]: https://gitlab.com/spudlyo/orgdemo2
เคยลองทำสิ่งนี้เมื่อประมาณ 7 ปีก่อน: https://nurtch.com/
ตัวไอเดียเองมีข้อดีมากมาย และเคยมีการพูดเรื่องนี้ที่ JupyterCon Paris 2023 ด้วย: https://www.youtube.com/watch?v=TUYY2kHrTzs
เมื่อมีโค้ดที่รันได้อยู่ในเอกสาร ผู้คนก็อยากนำ เวิร์กโฟลว์รีวิว PR มาใช้กับเอกสารด้วย ซึ่งต้องการการลงทุนระดับทีมมากกว่าการแก้ไขวิกิ
ตอนอยู่ AWS นี่คือสิ่งที่ทีมเราต้องการพอดี
มีงานปฏิบัติการจำนวนมากที่เสี่ยงเกินไปเล็กน้อยสำหรับการทำอัตโนมัติเต็มรูปแบบ แต่นี่ให้ เส้นทางในการค่อย ๆ ขยายไปสู่อัตโนมัติแบบทำซ้ำได้ สำหรับงานเหล่านั้น
อยากรู้ว่าเคยอยู่ AWS ช่วงไหน
ในช่วงไม่กี่ปีที่ผ่านมา AWS ได้สร้างบริการแพลตฟอร์มภายในที่ช่วยทำให้ runbook ด้านปฏิบัติการเป็นโค้ดและรันอัตโนมัติอย่างปลอดภัย เพื่อลด งานจุกจิกด้านปฏิบัติการ
Atuin Desktop ก็คล้ายกับบริการนั้นในบางแง่ แต่บริการภายในนั้นมีฟีเจอร์มากกว่ามาก
เป็นการรันสิ่งต่าง ๆ อย่าง query ของ CloudWatch และคำสั่ง AWS CLI พร้อมรับอินพุตจากผู้ใช้ โดยตัดภาระการตั้งค่าในการดึง credential ที่ถูกต้องอย่างปลอดภัยและจัดรูปแบบอินพุตออกไป
ต่อมาทำใหม่ให้รันได้โดยตรงจาก GitHub และตัวอย่างการเรียกฟังก์ชัน Lambda ด้วยโค้ด 4 บรรทัดจากอินพุตผู้ใช้ใน GitHub wiki อยู่ที่นี่: https://speedrun.nobackspacecrew.com/index.html#invoking-an-...
มันเป็นโน้ตบุ๊กแบบโฮสต์ที่มีการผสานกับ IAM
สงสัยว่าต่างจาก Jupyter notebook แบบรันในเครื่องอย่างไร
ใน
.ipynbใช้!หรือ%ทำแบบนี้ได้ไม่ใช่เหรอ?ถามจริง ๆ เพราะไม่ค่อยรู้จักบริษัทนี้หรือผลิตภัณฑ์ CLI ของเขา
ลำดับที่เริ่มจาก pipenv/pyenv/conda/poetry/uv/dependencies.txt และ “ต้องอัป Python เพื่อรันโน้ตบุ๊กนี้สินะ อืม… ก็ได้” แล้วอีก 2 สัปดาห์ถัดมากลายเป็น “การอัปเกรดนั้นทำ Ansible เก่า ๆ พัง และตอนนี้ซ่อมเซิร์ฟเวอร์ 15 เครื่องที่แทบจะประคองอยู่ไม่ได้แล้ว” นั้นเป็นนรกชัด ๆ
สำหรับ automation พื้นฐาน ผมพยายามอยู่ให้ห่างจาก Python
โปรเจกต์ Python ที่ผมดูแลมักพังอย่างน้อยปีละครั้งจากปัญหา dependency หรือ runtime และรวมถึงสิ่งอย่าง Ansible, build pipeline,
deploy.pyด้วยJupyter notebook ลาก dependency tree และข้อกำหนดขนาดใหญ่มาด้วย ดังนั้นผมจะไม่ใช้มันกับ automation ที่สำคัญและเป็นพื้นฐานแบบนั้น
แน่นอนว่างานของผมทำให้ต้องแตะ codebase มากเกินไป และแค่สองเดือนล่าสุดก็มีโปรเจกต์ Python อย่างน้อย 6 โปรเจกต์แล้ว
บางอันต้องใช้ Python 2.7 บางอันต้องใช้เวอร์ชันของ
lib-something.hที่เลิกใช้แล้ว บางอันล้ำสุด ๆ และบางอันแม้ไม่มีเอกสารแต่จริง ๆ แล้วเข้มงวดมากจนอยู่ในสภาพ “ทำงานได้ตราบใดที่ไม่อัปเดตอะไรบนเครื่องของนักพัฒนาคนเดียวที่รับผิดชอบ”Puppet หรือ Chef ก็แย่พอ ๆ กันและเจอปัญหาเดียวกันเพราะเป็น Ruby แต่ต่างกันตรงที่ Ruby มีระบบจัดการแพ็กเกจหลักเพียงระบบเดียวมาหลายสิบปี
โดยทั่วไป Jupyter ให้ความรู้สึกว่ามีทั้งการสคริปต์ที่ยืดหยุ่นและการรองรับคำสั่งของระบบปฏิบัติการ
ใช้
!/%หรือos.system()ก็ทำได้อันนี้ดูคล้ายกับ https://runme.dev มาก
ชอบ เอกสารที่รันได้ และคิดว่ายังมีไม่มากพอ
ดูน่าสนใจ
ช่วงหลังเริ่มใช้ https://marimo.io/ เป็น ตัวแทน Jupyter notebook ซึ่งมีการปรับปรุงหลายอย่าง และอันนี้ก็ดูเหมือนเป็นความเคลื่อนไหวไปในทิศทางคล้ายกัน
ถ้าเน้น local-first ก็เป็นเป้าของ การผุกร่อน (rot) อยู่แล้ว
ถ้าไม่ได้รันทั้งหมดในคอนเทนเนอร์ก็เป็นแบบนั้น และถ้ารันในคอนเทนเนอร์ ความเป็น local ก็ไม่สำคัญ
ถ้าอยากบันทึก runbook ก็แค่บันทึก runbook ไป
มีวิธีมากมาย เช่น ไฟล์ข้อความ เอกสาร Confluence การอัดหน้าจอ สคริปต์เชลล์ ฯลฯ
ผู้คนไม่ได้ทำสิ่งนั้นอยู่แล้ว และแค่ UI ดูเท่ขึ้นก็ไม่ได้ทำให้จู่ ๆ ทำกันมากขึ้น
โดยส่วนตัวแล้วไม่อยากใช้เวลาทั้งวันเขียนโค้ดหรือเอกสารเพื่อทำให้ระบบอยู่ในสถานะ X
อยากทำสถานะ X ด้วยมือ แล้วใช้เครื่องมือ dump สถานะไว้ จากนั้นภายหลังก็รันเครื่องมือนั้นอีกครั้งเพื่อสร้างหรือบังคับใช้สถานะนั้น
ไม่อยากอธิบายด้วยโค้ดว่าคอมพิวเตอร์จะไปถึงสถานะนั้นได้อย่างไร และก็ไม่อยากใช้ การตั้งค่าแบบ declarative ซึ่งก็เป็นโค้ดที่เปลี่ยนชื่อเท่านั้น
อยากลงมือทำเอง ถ่าย snapshot แล้ว replay
ต้องทำงานได้ทุกที่ บนทุกระบบ โดยไม่ต้องพึ่งการเฝ้าดูคำสั่ง Bash shell อะไรแบบนั้น
Dockerfile จริง ๆ ก็คล้ายกับสิ่งนี้ แต่บันทึกเป็นไฟล์ว่าผ่านขั้นตอนใดบ้างเพื่อไปถึงสถานะนั้น
https://linux.die.net/man/1/autoexpect
ถึงจุดนั้น การมี คำอธิบายแบบ declarative ที่สามารถแปลงอัตโนมัติเป็นขั้นตอนที่จำเป็นเพื่อไปถึงสถานะ X ได้ น่าจะดีกว่า
สำหรับงานทั่วไปอย่างตรวจว่ามีการติดตั้งแพ็กเกจหรือไม่ ไฟล์มีอยู่หรือมีเนื้อหาเฉพาะหรือไม่ จะใช้โมดูล และเป็น declarative กับ idempotent
สงสัยว่าสิ่งนี้จะเป็น โอเพนซอร์ส เหมือน Atuin CLI และ sync server หรือไม่
จะถูกทำเป็นผลิตภัณฑ์เชิงพาณิชย์หรือเปล่า?
แต่ก็ยินดีที่มีการประกาศออกมา
ยังไม่ค่อยเข้าใจว่าทำไมต้องมีสิ่งนี้
ช่วยอธิบายได้ไหมว่าฉันพลาดอะไรไป? ทำไมต้องใช้สิ่งนี้แทน เชลล์สคริปต์ ธรรมดา?
อยู่ในทีมที่รับผิดชอบหลายอย่าง บางอย่างรู้ดีมากและแตะบ่อย แต่บางอย่างรู้แค่ว่ามีอยู่ราง ๆ และแทบไม่เคยยุ่ง
X ซึ่งอยู่ในกลุ่มหลังเสีย
คนที่รู้จัก X จริง ๆ ทั้งหมดลาพักร้อน/เสียชีวิต/ติดประชุม
โชคดีที่มีเอกสารอธิบายว่าควรทำอะไรในสถานการณ์นี้
แต่เอกสารนั้นกลับแสดงปาฏิหาริย์ของข้อมูลแย่ ๆ ที่ว่า เก่าและผิด
นี่คือปัญหาที่สิ่งนี้พยายามแก้
จากที่ได้คุยกับผู้สร้างมาบ้าง เจตนาน่าจะใกล้เคียงกับการทำอะไรที่อยู่กึ่งกลางระหว่าง Jupyter Notebooks กับ Ansible Tower
เป็นวิธีที่ทำให้เอกสาร สคริปต์ และ metrics อยู่ใกล้กัน เพื่อให้รู้ได้ง่ายขึ้นว่าอะไรผิดพลาด แก้อย่างไร และสิ่งที่แก้มีผลหรือไม่
[1] เปิดเผย: ช่วยดูแล atuin Discord อยู่
ดังนั้นจึงเป็น “Runbooks That Run”
บางคนชอบ workflow หรือ tool flow บางแบบ ก็เลยทำขึ้นมา
ถ้าเข้ากับคนมากพอ ก็อาจมีตลาดหรือไม่มีก็ได้
ในโปรเจกต์ส่วนตัว ใช้กระบวนการ deploy ของ PHP เพราะแค่อยากใช้แบบนั้น และมันจัดการงานให้ 60% โดยไม่ต้องทำเอง
runbook สำหรับสิ่งนั้นคือ task ที่ฝังอยู่ในเครื่องมือ และอยู่ใน Git repository เดียวกับการ deploy เซิร์ฟเวอร์ทั้งหมด
ไม่อยากเอาไปไว้ในที่สุ่ม ๆ หรือเชลล์สคริปต์ที่ต้องจำคำสั่งแยกต่างหาก
สำหรับโปรแกรมเมอร์ โค้ดจะกลายเป็น self-documenting โดยแก่นแท้ หากหลีกเลี่ยงความซับซ้อนและรักษาสไตล์ functional ที่เรียบง่าย
แค่ใส่คอมเมนต์เป็นครั้งคราวเฉพาะส่วนที่ไม่ใช่ flow ง่าย ๆ อย่าง “สร้างผู้ใช้ MySQL, rotate รหัสผ่าน, สะท้อนคู่ผู้ใช้/รหัสผ่านใหม่ไปยังบริการที่เกี่ยวข้อง และลบผู้ใช้เก่าที่พนักงานซึ่งถูกไล่ออกมี credentials อยู่ เผื่อกรณีที่ VPN block อาจล้มเหลว” ก็พอ
เครื่องมือในฝันคือเครื่องมือทุกตัวมี terminal interface เพื่อให้สร้างหนังสือเล่มใหญ่ที่รวมบริบททั้งหมดในหัวไว้ได้
เช่น รวม Jira, Datadog, GitHub ฯลฯ ไว้ในหน้าจอเดียว
ลองจินตนาการว่ามี internal TUI framework ที่มี component สำหรับแต่ละ internal service แล้วเอามาประกอบกันเหมือนเลโก้เพื่อสร้างแดชบอร์ด TUI ส่วนตัวได้
ดูเหมือนเป็นงาน side project ที่น่าลองในบริษัท และคงเป็นงานใหญ่มาก แต่ก็น่าสนใจ
ในโลกอุดมคติ อยากให้ทุกบริการ เครื่องมือ และแอปพลิเคชันมี API ที่ฉันใช้ได้
เช่น ถ้าประตูตู้เย็นเปิดค้างนานเกินไป ก็ตรวจจับด้วยการ polling API หรือ webhook แล้วใช้ Roomba API ส่งไปปิด
ทำไมจะไม่ได้ล่ะ? นี่คือโลกของ API
ถึงดูเหมือนการพัฒนาหยุดมา 1 ปีแล้ว แต่แนวคิดประมาณนั้น
https://wtfutil.com/