คำนวณรายการความแตกต่างระหว่างแพ็คเกจที่ติดตั้งบนโฮสต์สองแห่ง


11

ฉันเพิ่งเพิ่มปัญหาบางอย่างกับเซิร์ฟเวอร์เสมือน Debian ของฉันและฉันเพิ่มเพื่อติดตั้งใหม่ทั้งหมดตั้งแต่ต้น อย่างไรก็ตามฉันยังคงสามารถเข้าถึงเวอร์ชันเก่าและฉันสามารถเรียกดูรายการแพ็คเกจที่ติดตั้งได้

เพื่ออำนวยความสะดวกในกระบวนการกู้คืนเซิร์ฟเวอร์เสมือนในอนาคตฉันต้องการสร้างรายการแพคเกจเฉพาะสำหรับเซิร์ฟเวอร์แต่ละเครื่องของฉัน

เพื่ออธิบายสิ่งที่ฉันต้องการให้ดีขึ้น ฉันมีกระบวนการอัตโนมัติเพื่อสร้างเซิร์ฟเวอร์เสมือนใหม่ที่มีแพ็คเกจพื้นฐานและการกำหนดค่าที่ใช้ในทุกที่ ตอนนี้ฉันต้องการบันทึกเดลต้าด้วย "โครงกระดูก" นี้เพื่อความสะดวกในการติดตั้งเซิร์ฟเวอร์เฉพาะใหม่อีกครั้ง

ข้อดีที่แท้จริงคือการบันทึกไฟล์การกำหนดค่าที่เปลี่ยนแปลงจากค่าเริ่มต้นด้วย แต่ฉันสามารถอยู่กับรายการแพ็คเกจได้เท่านั้น

ในระยะสั้นฉันต้องการวิธีการสร้างรายการแพคเกจที่ติดตั้งบนโฮสต์ แต่ไม่ใช่ในรายการอื่น

มันจะดีมากถ้ารายการมีแพ็คเกจที่ติดตั้งด้วยตนเองเท่านั้นและไม่ใช่รายการของการพึ่งพาทั้งหมด

หากคุณมีเครื่องมือที่มีอยู่ซึ่งออกแบบมาเพื่อทำงานนี้โดยเฉพาะอย่าลังเลที่จะเสนอมัน แต่ฉันต้องการให้การพึ่งพามีขนาดเล็กที่สุดเท่าที่จะทำได้ สำหรับข้อมูลนั้นไม่ใช่เซิร์ฟเวอร์เสมือนจริง แต่เป็นคอนเทนเนอร์ LXC


แค่คิด แต่อาจถึงเวลาที่จะเริ่มทำงานกับสิ่งนี้จากทิศทางตรงกันข้าม แทนที่จะพยายามดึงข้อมูลทำไมต้องตั้งค่าระบบการจัดการการกำหนดค่า (puppet) จากนั้นผลักดันสิ่งต่าง ๆ เข้าสู่ระบบที่ถูกจัดการของคุณ
Zoredache

โอ้ BTW ดูคำถามนี้ serverfault.com/questions/3852/…
Zoredache

@Zoredache ฉันกำลังมองหาวิธีที่ดีกว่าในการจัดการทั้งหมดนี้ แต่ในขณะเดียวกันฉันต้องการค้นหาวิธีที่รวดเร็วในการบันทึกสถานะเซิร์ฟเวอร์ในกรณีนี้ ขอบคุณสำหรับลิงค์!
krtek

คำตอบ:


12

ในการติดตั้งอ้างอิง (เพียงครั้งเดียว):

dpkg-query -W -f='${Package}\n' | sort > baselist.txt

(ข้อสันนิษฐานต่อไปนี้bash)

ในการรับแพ็กเกจที่เพิ่มเข้ามาจากการติดตั้งอ้างอิง (นี่ไม่แสดงสิ่งที่ถูกลบ)

comm -1 -3 baselist.txt <(dpkg-query -W -f='${Package}\n' | sort)

ดียิ่งขึ้นหลีกเลี่ยงสำเนาของbaselist.txt:

comm -1 -3 <(ssh user@refserver cat /path/to/baselist.txt) <(dpkg-query -W -f='${Package}\n' | sort)

2

บนเซิร์ฟเวอร์เก่ารัน:

dpkg - get-selections> old-packages-list

คัดลอกไฟล์ด้านบนไปยังเซิร์ฟเวอร์ใหม่และเรียกใช้บนเซิร์ฟเวอร์ใหม่:

dpkg --set-selections <old-packages-list

apt-get update

อัปเดต dselect

นอกจากนี้อย่าลืมเพิ่มที่เก็บพิเศษทั้งหมด/etc/apt/sources.listจากเซิร์ฟเวอร์เก่าไปยังเซิร์ฟเวอร์ใหม่ด้วยเช่นกันก่อนการโอนย้ายแพคเกจนี้หากคุณไม่ได้ติดตั้งแพคเกจส่วนใหญ่จะถูกยกเลิกการติดตั้ง


นี่จะบันทึกรายการแพ็กเกจทั้งหมดและเป็นโซลูชันที่ฉันใช้เพื่อกู้คืนเซิร์ฟเวอร์ทั้งหมด แต่ตอนนี้เพื่อให้กระบวนการง่ายขึ้นในอนาคตฉันต้องการบันทึกรายการแพ็คเกจที่แตกต่างจากเซิร์ฟเวอร์พื้นฐานเท่านั้น
krtek

1
ตกลงนั่นเป็นเรื่องง่ายมากเช่นกันก่อนอื่นทำการสำรองข้อมูลรายชื่อจากเซิร์ฟเวอร์เก่าโดย "dpkg - get-selections> old-packages-list" จากนั้นรับรายการแพคเกจบนเซิร์ฟเวอร์ใหม่โดย "dpkg - get-selections > new-packages-list ",, เรียกใช้คำสั่งนี้" cat old-packages-list | awk '{print $ 1}'> old-list ",,, คำสั่งเดียวกันบนเซิร์ฟเวอร์ใหม่ แต่แทนที่เก่าด้วยใหม่ เรียกใช้ความแตกต่างทั้งสองไฟล์ซึ่งจะแสดงให้คุณเห็น โดย diff -w รายการเก่ารายการใหม่
Farhan

1
cut -f1จะ probablz เร็วกว่า awk และเช่นเดียวกับความเห็นในคำตอบ Khaled ต่างจะไม่ส่งกลับผลลัพธ์ที่ถูกต้อง วิธีแก้ปัญหาด้วยcommโปรดจริงๆในตอนนี้ ... อย่างไรก็ตามฉันไม่มีเวอร์ชันที่แสดงรายการแพ็คเกจที่ติดตั้งด้วยตนเองเท่านั้น
krtek

1

คุณสามารถใช้คำสั่งต่อไปนี้เพื่อรับรายการแพ็กเกจทั้งหมดบนเซิร์ฟเวอร์ทั้งสอง:

     dpkg -l | sort > old_file
     dpkg -l | sort > new_file

จากนั้นคุณสามารถรับความแตกต่างโดยใช้:

     diff -Nur old_file new_file > changes.txt

คุณสามารถกรองการเปลี่ยนแปลงที่จำเป็นโดยใช้ grep นอกจากนี้ยังสามารถใช้ diff เพื่อรับการเปลี่ยนแปลงในไฟล์การกำหนดค่าและสร้างแพตช์ให้เป็นappåiedเมื่อจำเป็น โดยวิธีที่ต่างกันสามารถเปรียบเทียบสองโฟลเดอร์ไม่เพียงสองไฟล์


ปัญหาของเอาต์พุต diff คือมันไม่สามารถป้อนโดยตรงไปยัง apt-get เพื่อติดตั้งทุกอย่างด้วยวิธีอัตโนมัติ ... และเช่นเดียวกับที่เสนอโดย Shellholic การใช้ comm จะดีกว่าในกรณีนี้ diff อาจให้ผลลัพธ์ที่ผิดถ้า รายการแพคเกจยาวจริงๆ
krtek

ปัญหาอื่นคือ dpkg ปรับขนาดคอลัมน์อัตโนมัติ ดังนั้น dpkg -l จากเซิร์ฟเวอร์ที่มีชื่อแพ็กเกจที่ยาวกว่าจะทำให้ฮาร์ดดิฟแตกต่างกัน
เปาโล

1

พิมพ์เขียวได้รับการออกแบบสำหรับความต้องการของคุณ มันแยกแพคเกจคำอธิบายที่ติดตั้งและกำหนดค่าไฟล์ที่มีการเปลี่ยนแปลง สามารถแปลงคำอธิบายเหล่านี้เป็นสคริปต์ Puppet หรือ Chef เพื่อนำไปใช้กับกล่องที่สะอาด


0

นอกจากนี้ยังพบแพ็คเกจที่เป็นประโยชน์นี้ซึ่งมีคำอธิบายดังนี้:

สคริปต์ Bash ซึ่งเปรียบเทียบทรีของระบบไฟล์ของแพ็คเกจ Debian กับทรีของระบบไฟล์ปัจจุบันโดยการพิมพ์ diffs แบบรวมสำหรับไฟล์ที่แตกต่างกัน

https://code.google.com/p/dpkg-diffs/

เพียงไฟล์ทุบตีเดียวที่คุณสามารถติดใน PATH ของคุณที่ไหนสักแห่งและทำงาน - ดูเหมือนจะทำงานให้ฉันและมันไม่เก่าเกินไป

หวังว่านี่จะช่วยใครซักคน

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.