เป็นไปไม่ได้เนื่องจากรูปแบบมักจะถูกเข้ารหัสลึกลงใน libc ของแพลตฟอร์ม อย่างไรก็ตามเป็นไปได้ว่าระบบปฏิบัติการจะเพิ่มคุณสมบัตินี้ทำให้เป็นโซลูชันที่ไม่ข้ามแพลตฟอร์ม
หรือคุณสามารถอัปเดตบล็อกบางไฟล์ในไฟล์โฮสต์ของคุณโดยอัตโนมัติ สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณมีสคริปต์ที่ให้ผลลัพธ์รายการโฮสต์แบบไดนามิกสำหรับโครงการหนึ่ง ๆ (หรืออาจจะเป็นการเปลี่ยน IP)
นี่คือตัวอย่าง: คุณต้องการสร้างโฮสต์จากรัฐ terraform terraform-inventory
ผ่าน
ผลลัพธ์ของสินค้าคงคลังที่เกี่ยวข้อง (ตัวอย่างเช่นการจับคู่แท็ก "ชื่อ" EC2 กับกลุ่มของหนึ่งโฮสต์ที่แน่นอนแต่ละรายการ):
$ terraform-inventory --list | jq 'with_entries(select(.key | match("^name_")))'
{
"name_myhost-a": [
"10.101.118.131"
],
"name_myhost-b": [
"10.101.111.189"
]
}
print-updated-hosts-entries.sh
#!/bin/sh
exec terraform-inventory --list | \
jq -r 'to_entries |
map(select(.key | match("^name_"))) |
map(.value[0] + " " + .key[5:]) |
join("\n")'
เอาต์พุตสคริปต์:
./print-updated-hosts-entries.sh
10.101.118.131 myhost-a
10.101.111.189 myhost-b
และบรรทัดคำสั่งเพื่ออัพเดตบล็อกที่ทำเครื่องหมาย/etc/hosts
ด้วยเอาต์พุตสคริปต์ :
sudo cp /etc/hosts "/etc/hosts.bak.$(date +%Y%m%d%H%M%S)" && \
(
sed -n '1,/^# MYMARKER BEGIN/{/^# MYMARKER BEGIN/!p;}' /etc/hosts; \
echo "# MYMARKER BEGIN"; \
./print-updated-hosts-entries.sh; \
echo "# MYMARKER END"; \
sed -n '/^# MYMARKER END/,${/^# MYMARKER END/!p;}' /etc/hosts; \
) | \
sudo tee /etc/hosts.new | \
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p' && \
sudo mv /etc/hosts.new /etc/hosts
คำอธิบาย:
- บรรทัดแรกสร้างการสำรองข้อมูลอย่างชัดเจน
- เชลล์ย่อยในวงเล็บมีการ
sed
เรียกสองครั้งเพื่อพิมพ์บรรทัดทั้งหมดก่อนและหลังเครื่องหมายเริ่มต้น / สิ้นสุดตามลำดับ เราแทรกเครื่องหมายในกรณีใด ๆ ใส่เอาท์พุทสคริปต์ในระหว่างบรรทัดเหล่านั้น แม้ว่าสคริปต์จะล้มเหลว แต่เราก็ยังต้องมีเนื้อหาโดยรอบของ/etc/hosts
(และการสำรองข้อมูลในสถานการณ์ภัยพิบัติ)
sudo tee /etc/hosts.new
เขียนเนื้อหา piped ลงในไฟล์ใหม่
sed -n '/^# MYMARKER BEGIN/,/^# MYMARKER END/p'
พิมพ์บล็อกที่อัพเดตเพื่อความสะดวก
sudo mv /etc/hosts.new /etc/hosts
ย้ายไฟล์ใหม่เข้าที่ สิ่งนี้จะต้องทำในขั้นตอนที่แยกต่างหากเพราะหากบัฟเฟอร์ของท่อหมดพื้นที่tee /etc/hosts
จะเริ่มเขียนไฟล์ในขณะที่เนื้อหาที่มีอยู่ยังคงถูกอ่าน