อาร์. เอริค ไคเซอร์

ฉันมุ่งมั่นที่จะปรับปรุงกระบวนการและเพิ่มประสิทธิภาพอย่างต่อเนื่อง การทำงานที่ซ้ำซากจำเจอาจทำให้น่าเบื่อและน่าเบื่อได้อย่างรวดเร็ว ในบางครั้ง ลูกค้าร้องขอการประเมินที่ครอบคลุมซึ่งจำเป็นต้องมีการใช้ประโยชน์อย่างละเอียดและการรวบรวมข้อมูลจากระบบต่างๆ แม้ว่าโดยทั่วไปแล้วการสร้างฐานรากโดยใช้เครื่องมือ เช่น อิมแพ็คเก็ตจะตรงไปตรงมา แต่การรวบรวมข้อมูลด้วยตนเองจากหลายระบบอาจใช้เวลานานและไม่น่าดึงดูด อย่างไรก็ตาม ฉันให้ความสำคัญกับการส่งมอบผลลัพธ์คุณภาพสูงตามความคาดหวังของลูกค้า ในบทความนี้ ฉันจะแสดงให้คุณเห็นว่าฉันใช้ 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())