อาร์. เอริค ไคเซอร์
ฉันมุ่งมั่นที่จะปรับปรุงกระบวนการและเพิ่มประสิทธิภาพอย่างต่อเนื่อง การทำงานที่ซ้ำซากจำเจอาจทำให้น่าเบื่อและน่าเบื่อได้อย่างรวดเร็ว ในบางครั้ง ลูกค้าร้องขอการประเมินที่ครอบคลุมซึ่งจำเป็นต้องมีการใช้ประโยชน์อย่างละเอียดและการรวบรวมข้อมูลจากระบบต่างๆ แม้ว่าโดยทั่วไปแล้วการสร้างฐานรากโดยใช้เครื่องมือ เช่น อิมแพ็คเก็ตจะตรงไปตรงมา แต่การรวบรวมข้อมูลด้วยตนเองจากหลายระบบอาจใช้เวลานานและไม่น่าดึงดูด อย่างไรก็ตาม ฉันให้ความสำคัญกับการส่งมอบผลลัพธ์คุณภาพสูงตามความคาดหวังของลูกค้า ในบทความนี้ ฉันจะแสดงให้คุณเห็นว่าฉันใช้ Python และ Ansible เพื่อจัดการเซิร์ฟเวอร์ Linux หลายเครื่องและรวบรวมข้อมูลที่ละเอียดอ่อนจากที่เดียวได้อย่างไร
หากคุณไม่เคยได้ยินเกี่ยวกับ Ansible ฉันขอแนะนำให้พิจารณาให้ละเอียดยิ่งขึ้น เครื่องมือการจัดการ Linux แบบโอเพ่นซอร์สนี้เรียบง่ายและใช้งานง่าย Ansible ใช้ Playbooks ซึ่งเขียนด้วยภาษา YAML ซึ่งทำให้อ่านง่ายและเข้าใจง่าย
ก่อนอื่นเราจะนำเข้าโมดูลกระบวนการย่อยซึ่งอนุญาตให้คุณรันคำสั่งเชลล์จากภายในสคริปต์ Python ของเรา
import subprocess
เราสามารถใช้ฟังก์ชัน subprocess.call()
เพื่อรันคำสั่งเชลล์ที่อัปเดตรายการแพ็กเกจและติดตั้ง Ansible As Alwayssudo
ถูกใช้เพื่อให้แน่ใจว่าคำสั่งทำงานด้วยสิทธิ์ผู้ดูแลระบบ
subprocess.call(["sudo", "apt-get", "update"]) subprocess.call(["sudo", "apt-get", "install", "ansible"])
เราต้องการให้สคริปต์แจ้งชื่อหรือที่อยู่ IP ของเซิร์ฟเวอร์ Linux เพื่อค้นหาไฟล์ ฟังก์ชัน input()
แสดงข้อความแจ้งและรอชื่อเซิร์ฟเวอร์หรือ IP (คั่นด้วยเครื่องหมายจุลภาค) จากนั้นเราแบ่งอินพุตที่คั่นด้วยเครื่องหมายจุลภาคออกเป็นรายการชื่อเซิร์ฟเวอร์หรือที่อยู่ IP โดยใช้เมธอด split()
นอกจากนี้เรายังต้องการแจ้งประเภทไฟล์ที่เราต้องการค้นหา เช่น .conf
หรือ .pem
servers = input("Enter server names or IPs (comma separated): ").split(",") filetype = input("Enter file type to search for: ")
ต่อไป เราจะสร้างสตริงคำสั่ง Ansible โดยใช้ฟีเจอร์ f-string
ของ Python คำสั่งนี้ใช้คำสั่ง ansible
เพื่อรัน Playbook Ansible บนเซิร์ฟเวอร์ที่ระบุ โดยใช้โมดูล find
เพื่อค้นหาไฟล์ ตัวเลือก -a
ใช้เพื่อส่งผ่านพารามิเตอร์การค้นหา รวมถึงประเภทไฟล์ที่จะค้นหา ฟังก์ชัน subprocess.check_output()
รันคำสั่งและส่งกลับเอาต์พุต เราส่งผ่านตัวเลือก shell=True
เพื่อระบุว่าเรากำลังรันคำสั่งเชลล์ มาสร้างพรอมต์ที่ระบุว่าเราต้องการบันทึกไฟล์ที่ค้นพบไปยังตำแหน่งเฉพาะหรือไม่ มิฉะนั้นสคริปต์จะพิมพ์เส้นทางแบบเต็มไปยังหน้าจอ
command = f"ansible {' '.join(servers)} -m find -a 'path=/ recurse=yes patterns={filetype}'" result = subprocess.check_output(command, shell=True) save_to_file = input("Do you want to save the discovered files to a file location? (y/n) ")
หากเราเลือกที่จะบันทึกไฟล์ที่ค้นพบ ฟังก์ชัน open()
จะเปิดไฟล์ด้วยโหมดเขียน ("w"
) เขียนสตริง result
ที่ถอดรหัสแล้วลงในไฟล์ และปิดไฟล์
if save_to_file == "y": file_path = input("Enter file path to save the discovered files: ") with open(file_path, "w") as f: f.write(result.decode()) else: print(result.decode())
นั่นคือทั้งหมดที่มีให้! การรวม Ansible และ Python เข้าด้วยกันทำให้เกิดความเป็นไปได้มากมาย แม้ว่าชุดเครื่องมือที่ฉันแชร์จะเป็นแบบพื้นฐาน แต่ฉันขอแนะนำอย่างยิ่งให้สร้างเมนูตัวเลขในสคริปต์ Python ของคุณที่ช่วยให้คุณทำงานต่างๆ ได้สำเร็จ รวมถึงการเขียนไฟล์ (เช่น คีย์หรือการ์ดโทรศัพท์) หรือเรียกใช้ซอฟต์แวร์จับแพ็คเก็ต ปรบมือ ติดตาม และแบ่งปัน หากคุณชอบบทความนี้และ Happy Hunting!
import subprocess # Install Ansible subprocess.call(["sudo", "apt-get", "update"]) subprocess.call(["sudo", "apt-get", "install", "ansible"]) # Prompt for server names or IPs servers = input("Enter server names or IPs (comma separated): ").split(",") # Prompt for the file type to search for filetype = input("Enter file type to search for: ") # Run Ansible playbook to search for files on servers command = f"ansible {' '.join(servers)} -m find -a 'path=/ recurse=yes patterns={filetype}'" result = subprocess.check_output(command, shell=True) # Prompt to save the discovered files to a file location save_to_file = input("Do you want to save the discovered files to a file location? (y/n) ") if save_to_file == "y": # Prompt for file path to save the discovered files file_path = input("Enter file path to save the discovered files: ") with open(file_path, "w") as f: f.write(result.decode()) else: # Print the full path of the discovered files in the terminal print(result.decode())