Fabric 소개
Fabric은 파이썬 기반의 자동화 도구로, 로컬 및 원격 시스템에서 명령을 실행하고 파일을 전송하는 작업을 간편하게 처리할 수 있습니다. 내부적으로는 subprocess와 paramiko 라이브러리를 기반으로 하며, 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"
}
명령 출력 제어 및 결과 처리
명령 실행 중 출력을 억제하고 결과만 가져오려면 settings와 hide를 사용합니다.
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은 반복적인 서버 관리 작업을 자동화하는 데 매우 효과적인 도구입니다.