ข้ามไปยังเนื้อหา

Running Many Units at Once

terragrunt run --all apply จะไล่ทุก unit ที่อยู่ใต้ directory ปัจจุบัน apply ตามลำดับที่ dependency graph จากบทก่อนหน้ากำหนดไว้ และ --filter ก็ทำให้จำกัดการไล่นั้นให้เหลือแค่บางส่วนของ tree ได้ โดยไม่เปลี่ยนวิธีคำนวณลำดับเลย

เมื่อ directory หนึ่งมี unit มากกว่าหนึ่งตัว การรัน terragrunt plan หรือ terragrunt apply ทีละ unit ด้วยมือย่อมไม่ scale run --all กระจาย command เดียวไปทั่วทุก unit ที่อยู่ใต้ directory ปัจจุบัน

Terminal window
terragrunt run --all plan
terragrunt run --all apply

ต้องระวังผลการค้นหาและ tutorial เก่า ๆ ในเรื่องนี้เป็นพิเศษ เพราะโมดูลนี้เป็นจุดที่ข้อมูลล้าสมัยได้เร็วมาก terragrunt run-all plan และ terragrunt run-all apply คือ syntax เก่าและถูก deprecated ไปแล้ว เพื่อให้ใช้ run --all แทน ที่เก่ากว่านั้นอีก terragrunt plan-all กับ terragrunt apply-all ไม่ใช่แค่ deprecated แต่ถูกลบทิ้งไปทั้งหมดแล้ว และจะ fail ทันทีบน Terragrunt เวอร์ชันปัจจุบัน ถ้า guide ที่กำลังอ่านอยู่บอกให้รัน apply-all ให้ถือว่านั่นเป็นสัญญาณว่าเนื้อหาที่เหลือของ guide นั้นอาจล้าสมัยไปด้วย

การรันทุก unit ทั้ง repository ไม่ใช่สิ่งที่ต้องการเสมอไป บางครั้งแก้แค่ unit ของ subscription เดียว แล้วอยากจะ plan เฉพาะส่วนนั้น flag --filter จำกัดขอบเขต run --all ให้เหลือแค่บางส่วนของ tree ด้วย glob pattern

Terminal window
terragrunt run --all --filter './subscription-a/**' -- plan

--filter มาแทน flag --queue-include-dir และ --queue-exclude-dir แบบเก่า ซึ่งทำงานคล้ายกันแต่แยกเป็นสอง flag สำหรับ include กับ exclude path ส่วน -- ก่อน plan คือตัวแยก flag ของ Terragrunt เองออกจาก command ที่จะรันข้าม unit ต่าง ๆ ซึ่งสำคัญขึ้นทันทีที่ run --all เริ่มรวม flag อย่าง --filter เข้ากับ Terraform command ที่อยู่เบื้องหลัง

สำหรับ CI pipeline ที่ไม่ควรมีอะไรหยุดรอ human confirm prompt เลย ให้เพิ่ม --non-interactive

Terminal window
terragrunt run --all --non-interactive -- apply

--non-interactive มาแทน flag --terragrunt-non-interactive แบบเก่า อีกหนึ่งรูปแบบที่ต้องระวังใน material เก่า เพราะหลาย flag เคยมี prefix terragrunt- ซึ่ง Terragrunt เวอร์ชันปัจจุบันตัดทิ้งไปแล้ว

run --all บอก Terragrunt ว่าจะแตะ unit ไหนบ้างและตามลำดับอะไร แต่บางครั้ง unit หนึ่งก็ต้องการ side effect ห่อรอบ plan หรือ apply ของตัวเอง เช่น validation script ก่อนหน้า หรือการแจ้งเตือนหลังจากนั้น before_hook และ after_hook block ที่ประกาศไว้ใน terraform block ของ unit จะรัน shell command ใด ๆ ก็ได้ ณ จุดนั้นพอดี

vm/terragrunt.hcl
terraform {
before_hook "validate_inputs" {
commands = ["plan", "apply"]
execute = ["./scripts/validate-inputs.sh"]
}
after_hook "notify_slack" {
commands = ["apply"]
execute = ["./scripts/notify-slack.sh", "vm apply finished"]
run_on_error = true
}
}

commands ระบุว่า Terragrunt command ไหนบ้างที่ trigger hook นี้ execute คือ command จริงที่ Terragrunt รัน และ run_on_error = true บน after_hook ด้านบนหมายความว่าการแจ้งเตือน Slack จะทำงานแม้ apply เองจะ fail ก็ตาม มีประโยชน์เมื่อต้องการรู้เรื่อง failure ด้วย ไม่ใช่แค่ตอนสำเร็จ เพราะ hook พวกนี้อยู่ใน terragrunt.hcl ของ unit เอง hook จะทำงานไม่ว่า unit นั้นจะถูก apply เดี่ยว ๆ หรือเป็นส่วนหนึ่งของ run --all apply ที่กวาดไปทั่วหลาย unit ก็ตาม

flowchart LR
  cmd["terragrunt run --all apply"]
  cmd --> vnet["vnet unit"]
  vnet --> vm["vm unit (depends on vnet)"]
  vnet --> database["database unit (depends on vnet)"]
  vm --> hook["after_hook notify_slack"]
run --all apply กระจายตามลำดับ dependency พร้อม hook ที่ทำงานหลัง unit หนึ่งเสร็จ
command ปัจจุบันสำหรับรัน plan ทั่วทุก unit ใต้ directory หนึ่งคืออะไร
plan-all และ apply-all เกิดอะไรขึ้น และ run-all เกิดอะไรขึ้น
before_hook หรือ after_hook ใช้ทำอะไร
อะไรเป็นตัวกำหนดลำดับที่ unit ต่าง ๆ ถูกประมวลผลระหว่าง run --all apply