-
인프라의 규모가 커질 수록 서버 설치와 설정에 대한 부담이 늘어납니다. 특히 트래픽이 급격히 늘어나는 경우, 이에 빠르게 대처하여 서버를 구축하기 위해서는 자동화가 필수입니다. Saltstack은 이런 대규모 인프라를 관리하기 위한 자동화 관리 시스템입니다.
장점
빠릅니다. server 와 agent 간 zeromq 를 통해 통신하는데, agent 요청에 대해 비동기 병렬로 처리 하기 때문에 agent가 많아져도 수 초안에 처리가 가능합니다. 1만대 이상 agent 에 명령을 보내고 응답 받는데 2초가 걸리지 않습니다.
구조가 심플합니다. Server-agent 기반의 매우 단순한 구조입니다. 서버의 경우 DB조차 사용하지 않습니다. (DB를 사용하고 싶은 경우 plug-in 구조로 DB를 사용할 수 있게 지원) 보통 이런 시스템을 도입하게 되면 시스템 자체의 운영에 대해 부담감이 있지만 구조가 단순하다면 이런 부담감도 크지 않아 도입하는데 무리가 없습니다.
많은 모듈 지원합니다. 인프라 환경 구성을 위한 거의 대부분의 작업을 지원하는 내장 모듈이 존재합니다. 그리고 이를 이용해 다수의 서버를 프로그래머블하게 제어하는게 가능합니다. (= Infrastructure as a Code )
구조
Salt-Master
Saltstack에서 Server 역할을 담당합니다. Master는 등록된 Minion 에게 명령을 publishing하고 그 결과를 취합하여 보여주는 역할을 합니다. 1대의 single master가 minion 수천대까지 관리가 가능합니다.
Salt-Minion
Agent의 역할이며, 구성 자동화를 하기 위한 대상 서버에 설치하면 됩니다. Master의 명령을 기다리고 있다가 명령이 오면 그에 맞춰 작업을 수행하게 됩니다. 만약, 서버에 minion을 설치하기 어려운 상황이라면 Ansible처럼 SSH로 명령 push가 가능하도록 지원합니다.
ZeroMQ
Salt-master와 Salt-minion 간 통신에 ZeroMQ라는 비동기 메시징 라이브러리를 사용합니다. 따로 설치해야 하는 것은 아니며 Salt-master를 설치하면 zeroMQ도 함께 설치됩니다. publish Port로 4505, Return Port 로 4506을 사용합니다. (포트 수정 가능)
Port 4505는 Publisher로서, 모든 salt-minion 들이 명령을 받기 위해 해당 포트를 listening합니다. salt-master는 이 포트를 통해 명령을 전달하며, 모든 minion은 비동기 형태(asynchronous) 로 동시에 명령을 받아 수행하게 됩니다.
Port 4506은 minion 들이 수행한 작업 결과를 받게 되는 역할로 사용됩니다. 그리고 결과 리턴 뿐만 아니라 minion이 master에게 파일을 요청하거나 minion의 특정 데이터 값(Salt pillar)을 요청하는 포트로도 사용됩니다.
특징
Python 기반
- Saltstack 자체가 Python 으로 개발되었으며, Saltstack에서 실행되는 모든 명령 실행 코드는 Python 기반의 Module / Function 으로 구현되어 있습니다. 만약 사용자가 원하는 custom module을 구현하고 싶다면 Python 으로 개발하면 됩니다. 근데 custom module 개발할 필요가 없을 정도로 내장 모듈이 많으며 강력합니다.
YAML / Jinja2 포맷의 설정 파일
- 자동화할 작업들을 명세하는 sls 파일들은 YAML 포맷을 기본으로 합니다. 또한 template 파일의 경우, 로직에 대한 처리는 Jinja2 template을 사용합니다. Jinja의 경우 기존에 Django나 Flask 같은 프레임워크에서도 많이 사용된 기술이기 때문에 어렵지 않게 사용이 가능합니다.
ZeroMQ 기반의 메시징 처리
AES 암호화 통신
- salt-minion이 master에 처음 등록될 때 minion은 master에게 자신의 public key를 전달하게 됩니다. 그리고 master는 이 public key를 저장하고 해당 minion의 등록을 허락하는 절차를 거치게 됩니다. 이후 master와 minion은 ZeroMQ를 통해 통신할 때 public key와 AES key를 이용해 암호화 되어 통신하게 됩니다.