자동화된 운영 도구Fabric - 역할 관리 및 동시 실행

주: 이 글은 Fabric 공식 문서의 defing-host-lists와parallel execution 두 장과 결합하여 쓴 것이다
우리가 서로 다른 기능의 서버를 대량으로 관리해야 할 때, 서로 다른 기능의 서버가 서로 다른 명령을 실행하도록 하기 위해서, 이때 패브릭의 롤스env.roledefs라는 기능을 사용해야 한다.

역할 관리


호스트 문자열은 하나의 호스트와 일치하지만, 때로는 호스트에 따라 그룹을 나누는 것이 매우 유용하다.부하 균형에 맞는 웹 서버가 있을 수도 있고, 모든 업데이트 작업을 하거나 모든 클라이언트 서버에서 작업을 실행하고 싶을 수도 있습니다.Roles는 전체 호스트 그룹을 대체할 수 있는 정확한 호스트 문자열 정의 방식을 제공합니다.
이 맵은 사전의 방식으로 정의되었다.env.roledefs 사용되기 위해서는fabfile에서 정의되어야 합니다.다음은 간단한 예입니다.
from fabric.api import env

env.roledefs['webservers'] = ['www1', 'www2', 'www3']

기본값은 비어 있기 때문입니다.정보를 잃어버릴까 봐 걱정하지 말고 재분배 값을 선택해야 할지도 모른다. (수정할 때 다른 fabflies를 불러오지 않았다는 것을 보증해야 한다.)
from fabric.api import env

env.roledefs = {
    'web': ['www1', 'www2', 'www3'],
    'dns': ['ns1', 'ns2']
}

목록 대상 호스트의 유형을 제외하고는 env.roledefs 값이 즉시 적용됩니다.모듈 불러오는 시간을 찾고 대체할 때 호출됩니다. (and willthus be called when looked up when tasks are run instead of at module load time)(예를 들어 원격 서버에 연결해서 역할 정의를 얻을 수 있으며, 호출될 때fabfile 파일이 불러올 때 지연을 걱정할 필요가 없습니다. 예를 들어 env.roledefs.roles를 사용하는 데는 다른 요구가 없습니다. 그것은 단지 서버 그룹의 수요가 있는 상황에서 편리한 방식을 제공할 수 있을 뿐입니다.
개인이 실천하고 생산에 응용한 코드를 수정한 후 다음과 같이 삭제한다.
#!/usr/bin/python env
from fabric.api import env
from fabric.api import run
from fabric.api import roles
from fabric.api import execute
#from fabric.context_managers import execute




#env.user = 'username'
env.password = 'password'
env.roledefs = {
    'test1': ['host1', 'host2'],
    'test2': ['host3', 'host4']
}

@roles('test1') 
def get_version():
    run('cat /etc/issue')

@roles('test2')
def get_host_name():
    run('hostname')

def execute_all():
   execute(get_version)
   execute(get_host_name)

웹 1조에서 서버 하나만 실행하고 싶을 때, fab --list 또는 env.exclude_hosts 이 명령행 파라미터를 사용하여 제거할 수 있습니다
env.exclude_hosts=['host1']

또는
fab -R web1 -x host1,host5 get_version

이렇게 실행할 때host1이라는 서버를 제외합니다.

병행 실행


Fabric은 기본적으로 직렬로 실행됩니다 (자세한 내용은 Execution strategy 참조).이 부분에서는 여러 호스트에서 동시에 작업을 수행하는 선택을 설명합니다.모든 작업의 장식기나 명령줄의 전역 스위치를 통해 처리할 수 있습니다.
주: 이 기능은 1.3 및 이후 버전에만 있습니다.
왜냐하면 Fabric 1.x 기본값은 스레드가 안전하지 않습니다. (일반적인 상황에서 작업 기능 간에 서로 영향을 주지 않기 때문에) 이 기능은Python의 멀티프로세스 모듈을 통해 이루어집니다.그것은 모든 작업과 호스트 조합에 새로운 라인을 만들었다.같은 시간에 너무 많은 라인을 운행하지 않도록 슬라이딩 창을 마음대로 사용했다.
예를 들어 많은 웹 서버 응용 프로그램 코드를 업데이트하고 싶은 장면을 생각해 보세요.코드가 나누어지면 웹 서비스를 즉시 다시 불러옵니다. (업데이트가 실패했을 때 쉽게 스크롤할 수 있습니다.) 아래의fabfile는 상기 요구 사항을 실현할 수 있습니다.
from fabric.api import *

def update():
    with cd("/srv/django/myapp"):
        run("git pull")

def reload():
    sudo("service apache2 reload")

그리고 웹 서버 3대에서 다음과 같이 직렬로 실행합니다.
$ fab -H web1,web2,web3 update reload

정상적으로 병행 실행이 사용되지 않으면 Fabric은 다음과 같은 순서로 실행됩니다.
  • update on web1
  • update on web2
  • update on web3
  • reload on web1
  • reload on web2
  • reload on web3

  • 병렬로 실행할 때 (P를 통해 더 자세한 내용을 볼 수 있음) 이렇게 됩니다.
  • update on web1, web2, and web3
  • reload on web1, web2, and web3

  • 이것은 수익이 매우 뚜렷하다. - 만약 5s 운행과 2s 중량을 소비했다면.직렬 실행에는 (5+2)*3=21s의 시간이 걸리지만, 병행 실행에는 3분의 1의 시간만 걸리며, 평균(5+2)=7s 정도가 걸린다.

    병렬 사용 방법


    병행 수행은 하나의 임무에 영향을 미치는 가장 작은 단원이기 때문이다.이 기능은parallel과serial 장식부호를 사용하여 스위치를 제어할 수 있다.예를 들어, fabfile은 다음과 같습니다.
    from fabric.api import *
    
    # 
    @parallel
    def runs_in_parallel():
        pass
    
    # 
    def runs_serially():
        pass
    

    아래와 같은 방식으로 실행할 때:
    $ fab -H host1,host2,host3 runs_in_parallel runs_serially
    

    연속적으로 수행된 결과는 다음과 같습니다.
  • runs_in_parallel on host1, host2, and host3
  • runs_serially on host1
  • runs_serially on host2
  • runs_serially on host3

  • 명령행 태그


    명령줄 표시-P 또는 환경 변수 env를 사용할 수 있습니다.parallel은 모든 작업을 병행 실행하도록 강제합니다. 그럼에도 불구하고,serial을 사용하여 특별히 표시된 작업은 병행 표시를 무시하고 계속 직렬로 실행합니다.
    예:
    from fabric.api import *
    
    def runs_in_parallel():
        pass
    
    @serial
    def runs_serially():
        pass
    

    이렇게 호출할 때:
    $ fab -H host1,host2,host3 -P runs_in_parallel runs_serially
    

    예전처럼 runs_in_parallel 병행 실행,runs_serially 직렬 실행.

    Bubble size(대기열 풀 스타일의 개념?)


    대량의 호스트가 있는 상황에서 사용자의 Fabric 로컬 호스트는 너무 많은 Fabric 프로세스를 실행했기 때문에 무거운 부담을 감당할 수 없기 때문에Fabric 호스트의 부하가 너무 높다.이것 때문에, Fabric의 활발한 병행 프로세스의 지정된 수량을 제한하기 위해moving bubble 방법을 선택해야 할 수도 있습니다.
    기본적으로 Fabric은 버블이 사용되지 않고 모든 호스트가 병렬 탱크에서 실행됩니다.파라엘에게 주어진 임무가 없는 키워드를 지정해서 다시 쓸 수 있습니다.아니면 전역적인 -z를 통해 설정합니다.
    예를 들어, 어느 시점에 호스트 5개를 실행합니다.
    from fabric.api import *
    
    @parallel(pool_size=5)
    def heavy_task():
        # lots of heavy local lifting or lots of IO here
        #
    

    아니면 풀을 건너뛰거나_크기 매개변수는 다음과 같이 대체됩니다.
    $ fab -P -z 5 heavy_task
    

    좋은 웹페이지 즐겨찾기