[파이썬] 리눅스 서버 용량 관리 자동화

리눅스 서버 관리에서 가장 중요한 측면 중 하나는 용량 관리입니다. 서버의 디스크 용량이 부족하면 서비스 중단이 발생하고, 시스템 성능이 저하될 수 있습니다. 따라서 용량 관리에 대한 자동화는 매우 중요합니다.

이 블로그 포스트에서는 파이썬을 사용하여 리눅스 서버의 용량 관리를 자동화하는 방법에 대해 알아보겠습니다.

필요한 패키지 설치

먼저, 파이썬에서 SSH 연결을 할 수 있는 패키지인 paramiko를 설치해야 합니다. 파이썬 패키지 관리자인 pip를 사용하여 설치할 수 있습니다.

pip install paramiko

서버 용량 정보 가져오기

파이썬의 paramiko 패키지를 이용하여 SSH를 통해 리눅스 서버에 연결하고, df 명령어를 사용하여 서버의 디스크 용량 정보를 가져올 수 있습니다. 아래의 코드는 이를 수행하는 함수입니다.

import paramiko

def get_disk_usage(hostname, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname, username=username, password=password)
    
    stdin, stdout, stderr = ssh.exec_command("df -h")
    output = stdout.read().decode()
    
    ssh.close()
    
    return output

위의 함수는 호스트 이름, 사용자 이름 및 패스워드를 매개변수로 받고, df -h 명령어를 사용하여 리눅스 서버의 디스크 용량 정보를 가져옵니다. 이 정보는 문자열로 반환됩니다.

용량 정보 파싱하기

파싱된 용량 정보에서 용량이 부족한 디렉토리를 식별하는 것이 우리의 목표입니다. 이를 위해 re 모듈을 사용하여 출력된 문자열을 파싱할 수 있습니다. 아래의 코드는 이를 수행하는 함수입니다.

import re

def parse_disk_usage(output):
    usage_pattern = r"(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)%\s+(.+)"
    lines = output.split("\n")
    usages = []
    
    for line in lines[1:]:
        match = re.search(usage_pattern, line)
        if match:
            filesystem = match.group(1)
            size = match.group(2)
            used = match.group(3)
            available = match.group(4)
            percentage = match.group(6)
            directory = match.group(7)
            
            usages.append({
                "filesystem": filesystem,
                "size": size,
                "used": used,
                "available": available,
                "percentage": percentage,
                "directory": directory
            })
    
    return usages

위의 함수는 output 문자열을 줄 단위로 분리하고, 정규 표현식을 사용하여 각 줄에서 필요한 정보를 추출하여 딕셔너리로 반환합니다.

용량 부족 경고하기

파싱된 용량 정보에서 용량이 부족한 디렉토리를 식별하여 해당 디렉토리에 대해 경고 메시지를 출력하도록 합시다. 아래의 코드는 이를 수행하는 함수입니다.

def check_disk_usage(usages, threshold):
    for usage in usages:
        if int(usage["percentage"]) >= threshold:
            print(f"WARNING: {usage['directory']} is running out of disk space!")

위의 함수는 usages 리스트와 용량 경계값 threshold를 매개변수로 받습니다. 용량이 경계값을 초과하는 디렉토리가 있다면 해당 디렉토리에 대해 경고 메시지를 출력합니다.

전체 코드

아래는 위에서 정의한 함수들을 조합하여 전체 코드를 작성한 예시입니다.

import paramiko
import re

def get_disk_usage(hostname, username, password):
    ssh = paramiko.SSHClient()
    ssh.set_missing_host_key_policy(paramiko.AutoAddPolicy())
    ssh.connect(hostname, username=username, password=password)
    
    stdin, stdout, stderr = ssh.exec_command("df -h")
    output = stdout.read().decode()
    
    ssh.close()
    
    return output

def parse_disk_usage(output):
    usage_pattern = r"(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)\s+(\S+)%\s+(.+)"
    lines = output.split("\n")
    usages = []
    
    for line in lines[1:]:
        match = re.search(usage_pattern, line)
        if match:
            filesystem = match.group(1)
            size = match.group(2)
            used = match.group(3)
            available = match.group(4)
            percentage = match.group(6)
            directory = match.group(7)
            
            usages.append({
                "filesystem": filesystem,
                "size": size,
                "used": used,
                "available": available,
                "percentage": percentage,
                "directory": directory
            })
    
    return usages

def check_disk_usage(usages, threshold):
    for usage in usages:
        if int(usage["percentage"]) >= threshold:
            print(f"WARNING: {usage['directory']} is running out of disk space!")

hostname = "your_server_hostname"
username = "your_username"
password = "your_password"
threshold = 90

output = get_disk_usage(hostname, username, password)
usages = parse_disk_usage(output)
check_disk_usage(usages, threshold)

위의 코드를 사용하면 파이썬을 통해 리눅스 서버의 용량 관리를 자동화할 수 있습니다. 서버 용량이 부족한 경우 경고 메시지를 받을 수 있으므로, 서버 관리에 큰 도움이 됩니다.