Fabric를 활용한 로컬 및 원격 서버 명령 실행

Fabric 소개

Fabric은 파이썬 기반의 자동화 도구로, 로컬 및 원격 시스템에서 명령을 실행하고 파일을 전송하는 작업을 간편하게 처리할 수 있습니다. 내부적으로는 subprocessparamiko 라이브러리를 기반으로 하며, Ansible보다 가볍고 빠르게 배치 작업을 수행할 수 있는 특징이 있습니다.

설치는 아래와 같이 진행합니다:

pip3 install fabric3

주요 API 함수

  • local('명령'): 로컬 머신에서 명령어 실행
  • run('명령'): 원격 서버에서 일반 사용자 권한으로 명령어 실행
  • sudo('명령'): 원격 서버에서 관리자 권한으로 명령어 실행
  • put(로컬_경로, 원격_경로): 로컬 파일을 원격 서버로 업로드
  • get(원격_경로, 로컬_경로): 원격 파일을 로컬로 다운로드
  • settings(): 실행 환경 설정 (예: 출력 숨기기)
  • execute(함수, 인자): 특정 작업 함수를 호출하여 실행
  • confirm('메시지'): 사용자의 Y/N 입력을 대화형으로 요청
  • abort('메시지'): 작업을 강제 종료

Fab 스크립트 작성 방법

Fabric 스크립트는 일반적으로 fabfile.py 또는 임의의 파이썬 파일로 작성하며, 함수 단위로 작업을 정의합니다. 예를 들어, 다음과 같은 파일을 생성할 수 있습니다.

from fabric import api as fab

def check_local_files():
    print("로컬 디렉터리 목록 확인")
    fab.local("ls -l")

def list_directory(path="/"):
    print(f"{path} 경로의 내용을 출력합니다.")
    fab.local(f"ls {path}")

스크립트 실행 방식

1. CLI 명령어로 실행

터미널에서 fab 명령어를 사용해 특정 함수를 실행할 수 있습니다.

fab -f operations.py check_local_files

파라미터가 필요한 경우 다음과 같이 전달합니다:

fab -f operations.py list_directory:path=/tmp

2. 스크립트 내에서 직접 실행

파이썬 스크립트 내부에서 execute를 통해 작업을 호출할 수도 있습니다.

if __name__ == "__main__":
    fab.execute(check_local_files)
    fab.execute(list_directory, path="/var/log")

원격 서버에서 명령 실행

원격 서버에 접속하기 위해 env 객체를 통해 접속 정보를 설정합니다.

from fabric import api as fab

# 접속 정보 설정
fab.env.hosts = ["192.168.10.50", "192.168.10.51"]
fab.env.port = 22
fab.env.user = "admin"
fab.env.password = "secure_password"

def remote_ls():
    fab.run("ls /home/admin")

여러 서버에 대해 비밀번호가 다를 경우, 다음과 같이 세분화할 수 있습니다:

fab.env.hosts = [
    "root@192.168.10.50:22",
    "ubuntu@192.168.10.51:22"
]
fab.env.passwords = {
    "root@192.168.10.50:22": "pass50",
    "ubuntu@192.168.10.51:22": "pass51"
}

명령 출력 제어 및 결과 처리

명령 실행 중 출력을 억제하고 결과만 가져오려면 settingshide를 사용합니다.

def silent_check():
    with fab.settings(fab.hide('running', 'stdout'), warn_only=True):
        result = fab.run("cat /etc/os-release")
    print("출력:", result.stdout)
    if result.failed:
        print("명령 실패")

파일 전송 작업

로컬과 원격 간 파일을 송수신할 수 있습니다.

def upload_backup():
    fab.put("/backup/app.tar.gz", "/opt/app.tar.gz")

def download_log():
    fab.get("/var/log/app.log", "./logs/")

사용자 상호작용과 오류 처리

작업 도중 문제가 발생했을 때 사용자에게 확인을 요청할 수 있습니다.

def verify_tool():
    with fab.settings(warn_only=True):
        res = fab.local("which nginx", capture=True)
        if res.failed and not fab.confirm("nginx 미설치. 계속 진행하시겠습니까?"):
            fab.abort("사용자에 의해 작업 취소됨")

작업 조합 및 순차 실행

여러 작업을 하나의 함수로 묶어 실행할 수 있습니다.

def full_deployment(path):
    check_local_files()
    list_directory(path)
    upload_backup()
    fab.execute(remote_ls)

이처럼 Fabric은 반복적인 서버 관리 작업을 자동화하는 데 매우 효과적인 도구입니다.

태그: fabric python automation remote-execution paramiko

6월 1일 18:49에 게시됨