728x90
반응형

SaltStack

  • 대규모 인프라를 관리하기 위한 자동화 관리 시스템 (Puppet & Chef와 같은 System Management Tool)

  • Server (Master) - Agent (Minion) 간 ZeroMQ를 통해 통신하며 Server → Agent의 요청은 비동기 병렬 방식으로 처리되기 때문에 Agent의 갯수와 상관없이 짧은 시간 (수 초) 안에 처리 가능

  • Server는 별도의 DB를 사용하지 않으며 만약 DB를 사용하고 싶은 경우 Plug-In 구조로 DB를 사용할 수 있음

  • Python 기반의 Module / Function으로 구현됨

  • 설정 파일은 YAML 포맷을 기본으로 하며 Template 파일의 경우 Jinja2 Template를 사용

 

 

SaltStack 특징

  • Speed

    • Server와 Agent간 ZeroMQ를 통해 통신하고 Agent 요청에 대해 비동기 병렬로 처리하기 때문에 굉장히 빠름

  • Simple

    • Server - Agent의 구조로 매우 단순

    • Server의 경우 DB를 사용하지 않으며 별도의 Plug-In을 통해 DB 사용 가능

  • Many Module (Plug-Ins)

    • 인프라 환경 구성을 지원하는 대부분의 내장 모듈이 존재

  • Python

    • Salt Stack 자체가 Python 기반으로 개발되었으며 Python 기반의 Module / Function 으로 구현됨

    • Python이 실행되는 모든 곳에서 실행 가능 (Cloud, OS, Container)

    • OS, Cloud, Container와 같은 다른 환경에서도 동일하게 실행되며 이러한 Salt 크로스 플랫폼 관리 기능의 핵심은 정규화임

  • AES 암호화 통신

    • Minion이 Master에 처음 등록될 때 Minion은 Master에게 자신의 Public Key를 전달

    • Master는 이 Public Key를 저장하고 해당 Minion의 등록을 허가하는 절차를 거침

    • Master와 Minion은 ZeroMQ를 통해 통신할 때 PublicKey와 AES Key를 이용해 암호화 되어 통신

  • No FreeLoader

    • 각 특성을 가진 Minion에게 Master에서 별도의 명령 실행 가능

    • Minion은 Master에게 전달받은 명령을 확인해 자신의 특성과 일치하는지 판별 후 일치하면 실행

    • Minion에는 로컬에 저장해야하는 모든 명령이 이미 있으므로 Master에 명령을 실행할 수 있으며 그 결과는 Master에게 Return

  • Saling & Performance

    • Salt는 고성능 및 확장성을 위해 설계됨

    • ZeroMQ 또는 Raw TCP를 사용하여 Master ↔︎ Minion간 Data Pipeline을 구축하므로 성능이 뛰어남

    • Message Pack을 사용하여 Message (Master의 명령) 을 효율적으로 직렬화

    • Salt는 비동기 네트워킹 라이브러리로 Python Tornado를 사용하며 멀티 쓰레딩 및 동시성에 대한 최신 접근 방식을 사용하여 조정됨

  • Automation

    • Event 중심 인프라를 통해 초기 시스템 구성을 자동화 할 수 있을 뿐만 아니라 진행중인 관리를 확장, 복구 및 수행할 수 있도록 자동화 할 수 있음

    • 배포 및 유지 관리의 자동화

  • Programing

    • Salt의 원격 실행 기능은 CLI 명령이며 상태 시스템은 YAML을 사용하여 원하는 시스템 구성을 할 수 있음

    • Module을 사용해 IaC로 제어 가능

 

 

SaltStack Architecture

  • Salt Master

    • Server의 역할을 담당하며 등록된 Minion에게 명령을 Publishing하고 그 결과를 보여주는 역할을 수행

    • 구성 데이터 저장소, 원격 명령 실행, 다른 시스템의 상태를 확인하는 제어 센터로 작동

    • 1대의 Single Master가 수천 대의 Minion까지 관리 가능

    • Master가 없는 구성을 사용하여 인프라를 제어하는 것도 가능하지만 Master에서 제공하는 기능들을 사용할 수 없으므로 권장하지 않음

  • Salt Minion

    • Agent 역할을 담당하며 구성 자동화를 하기 위한 대상 서버에 설치

    • Master의 명령을 기다리고 있다가 명령이 오면 그에 맞춰 작업을 수행

    • 서버에 Agent를 설치하기 어렵다면 Ansible처럼 SSH로 명령 Push가 가능함 (AgentLess 형태)

    • Agent Less URL : https://docs.saltstack.com/en/getstarted/ssh/index.html

  • ZeroMQ

    • Slat Master ↔︎ Salt Minion 간 통신에 사용되는 비동기 메시징 라이브러리

    • 별도 설치 방식은 아니며 Slat Master를 설치하면 자동으로 함께 설치

    • Publish Port : 4505 / Return Port : 4506 (Port 수정 가능)

      • Publish Port 4505

        • Publisher로서 모든 Salt Minion들이 명령을 받기 위해 해당 포트를 Listening

        • Master는 Minion의 4505 Port로 명령을 전달하며 모든 Minion은 비동기로 동시에 명령을 받아 수행

      • Return Port 4506

        • Minion들이 수행한 작업 결과를 받게되는 역할로 사용

        • 결과 리턴뿐만 아니라 Minion이 Master에게 파일을 요청하거나 Minion의 특정 데이터 값 (Salt Pillar) 을 요청하는 Port로도 사용

        • 4506 Port에 대한 연결은 Master ↔︎ Minion 간의 1:1 관계 (비동기 아님)

 

Salt SubSystem

  • Salt SubSystem이란 어떠한 역할을 하는 System으로 예를 들어 Command Interface라는 역할을 하는 SubSystem을 구축할 때 일반적으로 포함되는 Plug-Ins는 Python API, REST API, Command Line으로 이렇게 모인 Plug-In들이 하나의 SubSystem을 구성

  • 아래는 기본 SubSystem

  •  

    • Authentication

      • 작업을 실행하기 전에 사용자에게 권한을 부여

    • File Server

      • 파일을 배포

    • Secure Data Store

      • 사용자 정의 변수 및 기타 데이터를 안전하게 사용할 수 있음

    • State Representation

      • 인프라 및 시스템 구성을 설명

    • Return Formatter

      • 작업 결과를 표준화 된 데이터 구조로 형식화

    • Result Cache

      • 작업 결과를 장기 저장소로 보냄

    • Remote Execution

      • 소프트웨어 설치, 파일 및 시스템 관리에 필요한 기타 작업을 수행하는 다양한 작업을 실행

    • Configuration

      • 원하는 상태와 일치하도록 대상 시스템을 구성

 

 

Salt SubSystem 구동 순서

  1. 명령 전달 (Master)

  2. 사용자 인증 (Master)

  3. 작업을 이벤트 버스에 배치하고 연결된 Minion에 전달 (Master)

  4. 작업 관리 구성 & 원격 작업 실행 (Master & Minion)

    1. State 파일 다운로드 (Master) & 명령 실행 (Minion)

    2. 보안 데이터를 검색하여 상태 파일에 삽입 (Master)

    3. 상태 파일이 파싱되고 컴파일됨 (Minion)

    4. 상태가 적용되고 상태 모듈이 실행 (Minion)

  5. 결과는 형식화되어 이벤트 버스에 배치됨 (Master)

  6. 결과는 Long-Term 저장소로 전송됨

  7. Reactors는 이벤트에 따라 트리거됨

  • 각 단계에서 SubSystem은 작업을 구성된 Plug-In으로 위임함

  • 각 단계에는 구성된 Plug-In에 따라 WorkFlow가 달라질 수 있음

  • Returner

    • Salt Returner는 Minion의 대한 Remote Execution 결과가 전송되는 위치를 지정하는데 사용

    • 기본적으로 Minion → Master로 데이터를 반환하는데 Retuner는 Master가 아닌 다른 목적지로 전송하도록 Routing 할 수 있음

    • 일반적으로 결과는 Returner와 Minion 명령을 시작한 프로세스에 지정된 대상으로 반환됨을 의미함

    • 대부분의 Returner는 Database System이나 Metric 또는 Logging 서비스에 전달함

    • Returner는 작업 캐시, 이벤트 데이터와 같은 Salt의 특정 데이터를 수집하는데 사용될 수 있음

  • Reactors

    • Salt Reactors System은 생성된 이벤트에 반응하여 동작을 트리거하는 매커니즘을 제공

    • Salt에서는 인프라 전체에서 발생하는 변경 (Remote Execution & Runner) 으로 인해 Minion 또는 Master Daemon이 ZeroMQ Message Bus에 Event를 생성하는데 Reactors System은 이 Message Bus를 감시하고 적절한 대응을 하기위해 구성된 Reactor와 Event를 비교함

    • Reactors System의 주요 목표는 변경이 발생한 상항을 자동으로 생성하기위한 시스템을 제공하는 것 (Event기반 Trigger 실행)

 

 

Salt 주의점

  • Salt Module 사용시 RedHat 계열 OS에 aptpkg Module을 사용하는 것처럼 맞지 않은 Module을 사용하면 Error Code 발생하니 환경에 맞는 Module을 사용해야함

 

 

Salt Security

Salt Minion Auth

  1. Minion은 처음 시작할 때 Network에서 이름이 Salt로 지정된 시스템을 검색함 (IP 또는 Hostname으로 변경 가능) → Vagarnt를 통해 구성을 쉽게 할 수 있음

  2. 시스템이 검색되면 Minion은 Network Handshake 과정 후 Public Key를 Master에게 전달

  3. 연결 후 Minion의 Public Key는 Master에 저장되며 salt-key 명령을 사용하여 Master에서 승인해야함 (해당 부분은 자동화된 매커니즘을 사용 가능 → Vagarnt 등)

  4. Master에서 Minion의 Public Key가 승인되지 않는다면 Salt가 ZeroMQ를 통한 Message를 보내도 Minion에서는 Public Key가 승인될때까지 명령을 실행하지 않음

  5. Minion의 Public Key가 승인되면 Master는 Public Master Key와 전달하는 Message의 암호화 및 해독을 하는데 사용되는 AES Key를 반환하여 Minion에게 전달하며 반환되어 전달받은 Key는 해당 Minion만 해독 가능

Salt ACL

  • 명령이 Minion에게 전달되기전 Salt는 ACL을 통해 명령 실행자의 권한이 있는지 확인

Salt Encryption

  • Master ↔︎ Minion 간의 통신은 AES Key를 사용하여 암호화 & 복호화 방식으로 전달되며 각 Minion 및 Session 마다 고유한 AES Key로 암호화됨 (Minion이 100개면 100개의 AES Key가 생성)

 

Salt Remote Execution

Salt 문법

  • Salt 기본 문법

    •  

    • Target

      • Taget이 '*'이면 모든 Minion에 전달

      • 각 Minion은 명령을 검사하고 대상과 비교하여 평가하며 명령을 실행할지 여부를 결정

      • 대상 시스템은 명령을 실행한 후 결과를 요청 서버로 리턴

    • Module.Function

      • 위의 예제에서는 Module은 test이고 Function은 rand_sleep

      • test Module의 rand_sleep이라는 Function을 실행

    • Arguments

      • 실행되는 Module.Function에 인자값을 부여

  • 각 명령은 별도의 Worker 스레드로 분리되어 Minion은 여러 작업을 한번에 처리할 수 있음

Salt Module & Function

  • Salt는 원격 실행과 구성 관리 기능을 구분해서 제공하는데 원격 실행 기능은 실행 모듈을 통해 제공됨

  • 이 Module은 Minion에 대한 작업을 수행하는 관련 Function들의 집합

  • Module

    • Module을 사용하면 시스템 (OS, Cloud, Container 등) 간의 차이점을 추상화할 수 있음

    • 실제로 데이터를 수집하는 매커니즘이 서로 다른 Linux나 BSD를 사용하는 Minion에게서도 비슷한 정보를 얻을 수 있음

    • Salt는 즉시 사용가능한 기능을 제공하기 위해서 적절한 Module을 선택하여 제공함

  • Function

    • Module내에 포함되어 있는 Function으로 정의된 기능을 수행하는 역할

    • 예를 들어 Command라는 Module내에는 ssh, pip 등과 같은 명령실행 Function이 포함되어 있음

Salt State System

  • Salt State System은 Remote Execution을 실행한 후 정상 수행되었는지 확인

  • State System에서 정상 수행 여부를 확인 후 실행이 되지 않았다면 Remote Execution을 호출하여 실행

  • Minion의 /src/salt/states 경로를 Salt State Tree의 Root로 사용

  • 단일 파일 형태 (/src/salt/states/mystate.sls) & 폴더 구성 (/srv/salt/states/mystate/init.sls) 로 구성 및 저장

  • salt:// 포맷은 State Tress의 파일을 제공하는 Salt File Server를 가리킴

  • /salt/states/users/init.sls | /salt/states/nginx/init.sls | /salt/state/php-fpm/init.sls | /salt/states/phptest/init.sls 형태로 작성

 

 

Salt Runners

Salt Runner

  • Runner SubSystem은 Salt Master에서 실행되는 Salt Module을 제공함

  • Runner는 salt-run 명령행 인터페이스를 사용하여 호출됨 (호출은 Master에서 실행하므로 대상에 포함되지 않음)

  • Runner는 작업 상태 표시, 실시간 이벤트 확인, Salt의 파일 서버 관리, Mine 데이터 확인, Minion에게 Wake-On을 보냄, Web Hook를 호출, 다른 HTTP 요청을 하는 등 다양한 수행을 할 수 있음

  • salt-run 명령에 인수를 전달하는 문법은 Salt Remote Execution에서 사용하는 문법과 동일

  • 단일성 명령 실행할 때 사용

 

Salt Orchestrate Runner

  • Orchestrate Runner는 Salt의 핵심 기능 중 하나인 명령을 실행하고 정의된 순서로 여러 Minion에 구성을 적용하는 기능을 제공하므로 자체 섹션을 가짐

  • 예를 들어 Orchestrate Runner를 사용하면 State System의 모든 기능을 사용하여 여러 시스템을 구성할 수 있음

  • salt-run은 단일성 명령이지만 여러 Minion에 명령 실행 가능

 

 

Salt Data

  • Master ↔︎ Minion & Minion ↔︎ Minion 간의 데이터 이동 관련된 내용

 

 

Salt Grains

  • 주요 Host System과 관련하여 Minion이 수집하고 유지하는 정보의 조각 (OS, Memory, Disk, Network Interface등과 같은 시스템 속성을 수집)

  • 일반적으로 Minion의 Agent Daemon에 의해 수집되고 요청시 Master에게 전달됨

  • Grains는 구성 변경 또는 명령에 대한 인수로 사용될 수 있음 (예를 들어 Grains를 사용하여 구성 파일 변경 또는 명령 인수로 특정 IP 주소를 가져올 수 있음)

  • Master는 Grains를 Minion에게 할당할 수 있는데 역할을 할당받은 Minion은 Grains를 사용하여 Master의 역할을 할 수 있음

 

Salt Pillar

  • Grains를 Master → Minion에 할당하는 것이 가능하지만 대부분의 구성 변수는 Pillar System을 통해 할당됨

  • Salt에서 Pillar는 Minion이 임의로 할당된 데이터를 검색하는데 사용할 수 있는 Key-Value 저장소를 나타냄

  • 이는 조직적 목적으로 중첩되거나 계층화 될 수 있는 사전 데이터 구조로서 기능을 함

  • Pillar는 값을 할당하기 위해 Grains보다 몇가지 중요한 이점을 제공하는데 가장 중요한 점은 Pillar Data는 할당된 Minion에서만 사용할 수 있다는 것임 (다른 Minion들은 내부에 저장된 값에 접근할 수 없음)

  • 따라서 노드 또는 노드의 하위집합에 대한 중요한 데이터를 저장하는데 이상적임 (비밀번호 또는 데이터베이스 연결 문자열은 대부분 Pillar 구성으로 제공됨)

  • Pillar Data는 종종 구성 데이터를 구성 템플릿에 주입하는 방법으로 구성관리 컨텍스트에서 활동됨

  • Salt는 구성 파일의 변수 부분을 적용할 노드에 특정한 항목으로 대체하기 위한 템플릿 형식을 제공함 (Grains가 Host Data를 참조할 때 종종 이 방법이 사용)

 

 

Salt Mine

  • Minion에게 정기적으로 실행되는 명령의 결과가 저장될 수 있는 마스터 서버의 영역 (Cron 작업의 결과 저장)

  • Mine의 목적은 Minion 머신에서 실행되는 임의 명령의 결과를 수집하는 것과 Grains 데이터에 대한 보완재로서 머신의 최신 정보를 제공하는 것

  • Mine은 가장 최근 결과만 저장함, 즉 기록 데이터에 Access 해야하는 경우 도움이 되지 않음

  • Minion은 Mine System을 통하여 상대방에 대한 데이터 쿼리를 할 수 있음

 

 

Salt Pyton

Salt Module

  • Salt의 각 SubSystem은 Python의 Module로 구성

  • Module은 Application (Mysql, Docker), 시스템 구성요소 (디스크, 파일) 를 관리하거나 외부 시스템 (gitfs) 과 상호작용하는 기능 그룹으로 생각할 수 있음

  • 모든 모듈은 Salt Source의 폴더에 있으며 모듈의 확장자는 .py 로 끝남

  • Module은 Salt Namespace 형식으로 SubSystem.Module로 표기되며 이 Namespace로 SubSystem Module의 유형을 쉽게 알 수 있음

  • Module에는 필요한 기능이 포함되는데 예를 들어 파일 실행 모듈 (salt.modules.file) 은 파일 관리가 중요하기 때문에 관련된 기능을 많이 가지고 있음, 또한 uwsgi 통계 서버 모듈 (salt.modules.uwsgi) 에는 하나만 있음

 

Salt Function

  • Function은 System 내에서 관리 및 구성을 하기 위해 호출할 수 있는 Module내의 특정 명령으로 생각할 수 있음

  • 예를 들어 salt.modules.pkg.install / salt.modules.network.interfaces / salt.modules.user.add 같음

 

Salt Argument

  • 명령행에서 Salt를 호출할 때 실행 인수는 추가 값으로 전달됨 (argument=value 형식)

  • 기본 값이 있는 인수는 선택적으로 전달할 수 있으며 필수 값은 공백으로 구분된 값으로 특정 순서로 전달됨

  • 예를 들어 user.add 함수의 경우 아래와 같음

    •  

  • 예제로 Fred라는 유저를 생성하고 기본 쉘을 지정할 경우

 

Salt Example

  • 여러 인수를 사용하여 전달하는 예 (인수는 arg 및 kwargs로 단축되며 아래는 1개의 arg와 3개의 kwargs를 전달)

    •  

  • 두 개의 Args와 Kwarg 전달

  • 몇몇 실행 모듈은 다음과 같은 리스트 전달을 허용함

  • 일부는 정의된 목록을 가져옴

 

Salt State Function Argument

  • State Function은 YAML 구문을 사용하여 상태 파일에서 호출됨

  • 아래는 Fred라는 사용자를 생성하고 기본 쉘을 변경하는 YAML 파일

    •  

  • 아래는 리스트로 패키지 설치

  • 정의된 목록 실행

 

Salt Syntax

 

Salt Configure Management

Salt Formulas

  • 특정 결과를 산출하기 위해 정렬된 상태 모듈 호출 집합

  • 구성관리 파일은 수식이 적용된 후 시스템이 어떻게 보이는지 나타내는 파일

  • 기본적으로 YAML 데이터 직렬화 형식으로 작성

 

Salt Template

  • Salt Formulas와 다른 파일들이 좀 더 유연한 상태로 쓰여지는 것을 허용

  • Template는 Formulas의 사용자 정의된 버전 또는 설정 파일을 구성하기 위해서 Minion에 대한 가능한 정보를 사용할 수 있음

 

 

반응형

'SaltStack' 카테고리의 다른 글

SaltStack Demo Configuration  (2) 2020.01.12
SaltStack Jinja File  (0) 2020.01.12
SaltStack Example  (2) 2020.01.12
SaltStack Best Practices  (2) 2020.01.12
SaltStack Command Option  (0) 2020.01.12

+ Recent posts