이벤트 기반(Event-Driven) 인프라 – 이벤트 리액터

솔트의 리액터 시스템은 어떤 사건에도 반응할 수 있는 기능을 제공합니다. 작업과 태스크가 완료될 때 작업을 트리거할 수 있을 뿐만 아니라 서비스가 중단되거나 사용자가 로그인하거나 파일이 변경될 때 작업을 트리거할 수 있으며 사용자 지정 이벤트를 보낼 수 있는 모든 위치(빌드 스크립트 끝, cron 작업, 목록 실행)에서 작업을 트리거할 수 있습니다.

리액터 구성

리액터는 /etc/salt/master 또는 /etc/salt/master.d/reactor.conf에 탑-레벨 리액터 섹션을 추가하여 구성한다(리액터 섹션은 1개만 허용되므로 이 중 1개만 선택한다).

다음은 미니언 시작 이벤트, 클라우드 리소스 제거 이벤트 및 사용자 정의 이벤트 문자열과 일치하는 원자로 구성의 예입니다.

reactor:                            # Salt master config section "reactor"

  - 'salt/minion/*/start':          # Match tag "salt/minion/*/start"
    - /srv/reactor/start.sls        # Things to do when a minion starts
    - /srv/reactor/monitor.sls      # Other things to do

  - 'salt/cloud/*/destroyed':       # Globs can be used to match tags
    - /srv/reactor/destroy/*.sls    # Globs can be used to match file names

  - 'myco/custom/event/tag':        # React to custom event tags
    - salt://reactor/mycustom.sls   # Put reactor files under file_roots

리액터 구성은 의도적으로 간단하다. 리액터 섹션의 유일한 작업은 실행할 리액터 SLS 파일에 이벤트 태그를 연결하는 것이다. 리액터는 단일 스레드이기 때문에 헤비 리프팅은 리액터 SLS 파일에서 이루어져야 합니다(리액터 SLS 파일은 별도의 프로세스로 분리되며 필요한 만큼 오래 걸릴 수 있습니다).

리액터로 SLS 파일은 YAML 및 Jinja의 최대 성능을 가지므로 이벤트 태그 및 데이터를 사용하여 필터링 및 테스트를 수행할 수 있습니다.

시스템이 작동하는 것을 볼 수 있도록 리액터를 데모 환경에 추가합시다. salt-vagrant-demo/saltstack/etc/master 파일을 열고 원자로 섹션을 추가합니다.

reactor:
    - 'my/custom/event/tag':
    - salt://reactor/customevent.sls

이것은 솔트 마스터에게 my/custom/event/tag가 포함된 이벤트를 볼 때마다 customevent.sls 파일을 호출하도록 지시합니다.

원자로 SLS 파일에 대해 알아본 후 다음 섹션에 custom event.sls 파일을 만들겠습니다.

지금은 salt-master 서비스(service salt-master restart)를 다시 시작하여 변경 내용을 선택한 다음 계속하십시오.

리액터 SLS 파일

이미 솔트 스테이트 SLS 파일에 익숙하면, 솔트 리액터 SLS 파일에는 유사한 점이 많습니다. 솔트 스테이트 및 솔트 리액터 SLS 파일은 모두 YAML과 Jinja를 사용하여 작성되지만 구문 차이가 있고 다른 용도로 사용되므로 솔트 파일 서버의 별도 위치에 보관해야 합니다(예: 리액터는 /srv/salt/reactors 디렉토리에 있을 수 있음).

솔트 리액터 SLS 파일은 솔트 마스터에서 실행되므로 솔트 미니언에서 실행되는 솔트 상태 시스템의 진입점보다는 솔트 및 솔트 실행 명령의 진입점으로 생각하면 유용합니다.

솔트 리액터로 정확히 뭘 할 수 있죠? 다음 코너로 넘어가서 알아보도록 하겠습니다.

리액터 유형

소금 원자로는 다음 시스템 중 하나를 작동시킵니다.

  • 원격 실행: 대상 미니언에서 실행 모듈을 실행합니다. salt 명령(상태 또는 높음 상태 적용 포함)을 호출하여 수행할 수 있는 작업입니다.
  • 솔트 러너: 이것은 salt-run을 사용해서 시작하는 작업입니다. 예를 들어 HTTP 실행자는 웹 후크를 트리거할 수 있습니다.
  • Wheel: Wheel 명령은 키를 허용하고 구성 설정을 업데이트하는 등의 작업을 수행하면서 Salt 환경을 관리합니다. 이러한 작업 중 일부는 솔트 키 유틸리티에 의해 노출됩니다.

기타 대상 유형

대상에 미니언 ID 글로벌이 아닌 다른 항목을 사용하려면 expr_form 인수를 사용할 수 있습니다.

clean_tmp:
  local.cmd.run:
    - tgt: 'os:Ubuntu'
    - expr_form: grain
    - arg:
      - rm -rf /tmp/*

원격 실행

이 인터페이스는 Salt 실행 모듈에 대한 직접 연결입니다. salt 명령을 사용하여 명령줄에서 원격 실행을 트리거하는 방법에 대해 생각해 보면 salt 명령에는 다음 세 가지가 있습니다.

  • target
  • function
  • arguments

Salt 리액터에서의 원격 실행에는 YAML 형식의 동일한 정보가 필요합니다.

<section id>:
  local.<function>:
    - tgt: <target>
    - arg:
        <arguments>

호출하려는 실행 모듈 함수는 당장은 중요하지 않은 이유로 로컬에서 접두사를 사용합니다.

명령줄에서 수행할 수 있는 간단한 패키지 설치에 대해 살펴보겠습니다.

salt 'myminion' pkg.install cowsay

리액터 SLS에서 이것은 다음과 같이 보일 것이다.

install cowsay on myminion:
  local.pkg.install:
    - tgt: 'myminion'
    - arg:
      - cowsay

감이 잡히시나요? 리액터 SLS 파일은 마스터에서 실행되며 실행 모듈을 사용하기 때문에 실행 모듈을 실행할 미니언 대상을 지정해야 합니다. 이 매개 변수를 “target”을 의미하는 tgt라고 합니다. 또한 모듈에 전달될 인수도 arg 또는 kwarg(kwargs가 아님) 매개 변수를 사용하여 전달됩니다.

러너 및 휠 모듈

Runner 모듈 및 Wheel 모듈을 리액터에서 호출하면 기능이 원격 시스템에 명령을 보내는 대신 로컬로 실행되므로 보다 직접적인 구문을 사용합니다. arg 또는 kwarg 매개 변수는 없습니다(Runner 함수 또는 Wheel 함수가 이러한 이름의 매개 변수를 허용하지 않는 한).

clear_the_grains_cache_for_all_minions:
  runner.cache.clear_grains
spin_up_more_web_machines:
runner.cloud.profile:
- prof: centos_6
- instances:
  - web11       # These VM names would be generated via Jinja in a
  - web12       # real-world example.

다음은 미니언 키를 자동으로 수락하는 휠 예입니다(운영 시 악성 미니언은 수락하지 않도록 무결성 검사를 추가로 추가해야 함).

accept_new_minion:
  wheel.key.accept:
    - match: {{ data['id'] }}

추가 예

salt/cloud/*/create 이벤트에 반응하기 위해 다음과 같은 리액터 SLS를 사용할 수 있다.

new vm alert:
  local.pagerduty.create_event:
    - tgt: minion
    - kwarg:
        description: "New VM {{ data['name'] }}"
        details: "New VM on {{ data['provider'] }}: {{ data['name'] }}"
        service_key: 1162ee51ed6e46239265c969729c48eb
        profile: my-pagerduty-account

이벤트 데이터 구조를 사용하여 이벤트 메시지를 커스터마이징하고 있습니다. 또한 대부분의 이벤트에는 미니언 ID가 data[‘id]로 포함되므로 이벤트를 트리거한 미니언에 직접 작업을 수행할 수 있습니다. 예를 들어, 위의 install cowsay 예에서 myminion은 data[‘id]로 대체될 수 있습니다.

빌드가 완료될 때 사용자 지정 이벤트를 트리거하도록 빌드 시스템을 설정하는 경우, 다음과 같은 상태로 느린 채널에 알릴 수 있습니다.

spam slack:
  local.slack_notify.post_message
    - tgt: buildserver
    - kwarg:
        channel: "Development"
        api_key: peWcBiMOS9HrZG15peWcBiMOS9HrZG15"
        message: "Build {{ data['build_id'] }} finished with status: {{ data['status'] }}"

build_id 및 상태는 이벤트를 트리거할 때 삽입하는 사용자 지정 데이터입니다.

솔트 스테이트

스테이트 실행 모듈은 리액터 SLS 파일 내에서 솔트 스테이트를 적용하거나 높은 상태를 트리거하는 데 사용할 수 있습니다. 또한 Jinja를 사용하여 값을 대체하고 테스트 및 필터링을 수행할 수 있습니다.

{% if data['id'] == 'mysql1' %}
highstate_run:
  local.state.highstate:
    - tgt: mysql1
{% endif %}

사용해 보십시오.

이제 솔트 리액터 SLS 파일을 이해했으므로 salt-vagrant-demo/saltstack/salt/reactor 디렉토리를 만든 다음 해당 디렉토리에 customevent.sls라는 파일을 만듭니다. 그런 다음 이 절에서 원자로 SLS 예 중 하나를 추가하거나 직접 만듭니다. 대상을 시스템 중 하나(예: minion1)를 대상으로 업데이트해야 합니다.

Salt Master의 명령줄에서 다음 사용자 지정 이벤트를 트리거합니다.

sudo salt-call event.send 'my/custom/event/tag' 

이 이벤트는 솔트 리액터에 의해 선택되고 사용자가 만든 customevent.sls 파일을 트리거합니다.

본 안내서에서는 소금 원자로를 사용하여 인프라를 자동화할 수 있는 여러 가지 방법을 보여 드렸습니다. 이 방법에는 한계가 있습니다!

출처 : https://docs.saltproject.io/en/getstarted/event/reactor.html
답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다

You May Also Like
Read More

SaltStack 유연성

모든 관리 툴과 Git 포크(fork)는 유연하다고 주장하지만, SaltStack에서는 유연하다고 말할 때 전체 관리 접근 방식이 유연하다는 것을 의미합니다.…