본문 바로가기
파이썬

Fabric, 파이썬으로 원격 커맨드를 수행하는 방법

by 책 읽는 개발자_테드 2022. 8. 7.
반응형

Fabric이란?

· SSH를 통해 원격으로 shell 커맨드를 실행하도록 설계뙨 라이브러리다. 유용한 파이썬 객체를 반환한다. 

· Invoke(Task 실행 라이브러리, 하위 프로세스 커맨드 실행 및 커맨드라인 기능) 및 Paramiko(SSH 프로토콜 라이브러리)를 기반으로 하여, 해당 API를 확장하여 추가 기능들을 제공한다.

· 애플리케이션 배포, 시스템 관리 작업 등에 사용할 수 있다.

· 파이썬 2.7, 3.4 이상을 지원한다.

 

설치

$ pip install fabric

 

사용법

fabric을 설치하면 기본적으로 fabfile라는 이름의 파일에 정의된 명령을 읽고 실행할 수 있는 fab binary stub을 설치한다. 

fabfile.py라는 파일을 만들고 다음 코드를 작성한다.

 

from fabric import task


@task
def deploy(ctx):
    print("deploy 실행!")

 

- @task 데코레이터는 deploy 함수를 fab binary에서 실행할 수 있는 작업으로 변환하는데 사용된다. deploy라는 이름으로 정의된 태스크는 fab binary에 실행을 위해 매개변수로 전달된다. 

  ▶ 데코레이터는 파이썬의 클로저에 해당한다. 즉, 다른 서브루틴을 매개변수로 사용하거나 다른 서브루틴을 반환하는 서브루틴이다.

- 함수는 컨텍스트 매개변수(↓아래 설명)를 가져야하며, 위에서는 ctx로 지정된다.

더보기

이러한 컨텍스트 매개변수(ctx)를 가져와서 fabric에 사용자 정의 설정 값을 전달할 수 있다. fabric configuration system은 Invoke 라이브러리의 기능을 확장한다. 설정 값을 fabric.*라는 이름의 파일에 입력한 후 fabric을 실행하면 컨텍스트 매개변수를 통해 값을 가져올 수 있다.

 

fabric.yml

project:
  name: "fabric_test_project"
  account: "ted"
  profile:
    local:
      hosts: [
        "127.0.0.1:8080"
      ]
    staging:
      hosts: [
        "scshim.tistory.com",
        "scshim2.tistory.com"
      ]
    production:
      hosts: [
        "tistory.com"
      ]

fabfile.py

from fabric import task


@task
def deploy(ctx):
    print(ctx)

 

위와 같이 코드를 작성하고, fab deploy를 실행하면 아래와 같은 값이 출력된다.

 

fabfile.py와 동일한 디렉터리에서 fab deploy를 실행한다.

 

이것을 사용하여 Fabric이 의도한 바를 수행할 수 있다. 다음 코드는 원결 호스트에 연결하고 그 안에서 명령을 실행한다.

 

from fabric import Connection, task


@task
def deploy(ctx):
    with Connection("HOST") as c:
        with c.cd("/home/project/path/"):
            c.run("docker-compose down")
            c.run("git pull origin master --recurse-submodules --rebase")
            c.run("docker-compose up --build -d")

 

- 위 코드에서 HOST를 연결하려는 호스트의 이름 또는 IP 주소로 바꿀 수 있다.

- 로그인한 사용자에게 권한이 있는 모든 명령을 실행할 수 있다.

- c.cd()는 나머지 명령이 해당 특정 폴더에서 실행되도록 하는 데 사용된다.

- 위 코드는 with 블록의 도움으로 파이썬 컨텍스트 관리자를 사용한다. 이 작업을 수행하는 다른 방법도 존재한다.

 

호스트 이름만으로 연결을 설정하기에 충분하지 않은 경우가 많다. fabric을 사용하여 SSH 연결을 설정하기 위한 사용자 이름개인 키 를 추가할 수 있다. fabric은 ssh을 처리하기 위해 Paramiko라는 라이브러리를 사용한다. 따라서 fabric의 Connection에서 connect_kwargs 인수를 사용하여 Paramiki의 SSHclient.connect 메서드에 인수를 전달할 수 있다.

 

from fabric import Connection, task


@task
def deploy(ctx):
    with Connection(
        "HOST",
        user="USERNAME",
        connect_kwargs={"key_filename": "~/.ssh/your_key"}
    ) as c:
        with c.cd("/home/project/path/"):
            c.run("docker-compose down")
            c.run("git pull origin master --recurse-submodules --rebase")
            c.run("docker-compose up --build -d")

 

- Paramiko의 SSHclient.connect는 사용할 키의 파일 이름을 지정하는 key_filename 인수를 사용한다.

- SSH키를 Paramiko의 pkey.Pkey 클래스의 인스턴스로 전달하거나, 다른 여러 옵션을 사용할 수도 있다.

 

이러한 값들을 환경 변수로 로드하는 것이 훨씬 안전하다. 예를 들어 gitlab CI를 사용할 때 환경 변수를 설정하는 동안 key_filename 인수와 함꼐 작동하는 데 필요한 문자열 대신 파일로 키를 사용할 수 있도록 선택할 수 있다.

출처: https://hackernoon.com/deployment-automation-via-ssh-with-python-fabric-how-it-works-w0q33wn

 

이러한 환경 변수가 있으면, fabfile을 다음과 같이 변경할 수 있다.

 

import os
from fabric import Connection, task


@task
def deploy(ctx):
    with Connection(
        os.environ["HOST"],
        user="USERNAME",
        connect_kwargs={"key_filename": os.environ["DEPLOY_KEY_FILE"]},
    ) as c:
        with c.cd("/home/project/path/"):
            c.run("docker-compose down")
            c.run("git pull origin master --recurse-submodules --rebase")
            c.run("docker-compose up --build -d")

 

이제 fabfile이 준비되었다. 파이썬 fabric 패키지와 함께 실행하기만 하면 된다. 수동으로 Github 작업 등을 사용하여 원하는 방식으로 수행할 수 있다.

 

다음은 Gitlab의 CI로 실행하는 예다. 이를 위해 .gitlab-ci.yml 파일을 만든다.

 

image: "python:3.6"

stages:
  - deploy

deploy_to_production:
  stage: deploy
  script:
    - pip3 install fabric
    - fab deploy
  only:
    - master

 

- deploy_to_production 작업은 두 가지 작업을 실행한다. 이때, 파이썬3를 기본으로 사용한다.

1. pip3 install fabric으로 fabric을 설치한다.

2. fab deploy로 fabric이 fabfile.py을 읽고, deploy라는 작업을 실행한다.

 

결론적으로 fabric은 SSH를 통해 실행할 스크립트를 프로그래밍 방식으로 빌드하고, CI/CD 도구와 같은 일반적인 방법에서 트리거하는 간단하고 효과적인 방법이다.

 

 

출처

https://www.fabfile.org/

https://hackernoon.com/deployment-automation-via-ssh-with-python-fabric-how-it-works-w0q33wn

 

반응형

댓글