SaltStack - 이벤트 기반 인프라 자동화
개요
SaltStack(Salt)은 VMware가 인수한 오픈소스 설정 관리 및 원격 실행 도구로, ZeroMQ 기반의 빠른 통신과 이벤트 기반 아키텍처가 특징입니다.
주요 특징
1. 빠른 속도
- ZeroMQ 메시징 라이브러리 사용
- 병렬 실행으로 수천 대 동시 관리
- Ansible보다 10배 이상 빠른 실행
2. 아키텍처
Master (중앙 관리 서버)
├── Minion (관리 대상)
├── Minion
└── Minion
3. Salt Proxy Minion (네트워크 장비)
# /etc/salt/proxy 설정
proxy:
proxytype: napalm
driver: ios
host: 192.168.1.1
username: admin
password: password
설치
Master
# Ubuntu/Debian
curl -L https://bootstrap.saltproject.io -o install_salt.sh
sudo sh install_salt.sh -M
# CentOS/RHEL
yum install salt-master
Proxy Minion (네트워크 장비용)
pip install salt-proxy
apt-get install salt-minion
네트워크 자동화
State 파일 (SLS)
# /srv/salt/network/ntp.sls
configure_ntp:
netconfig.managed:
- template_name: salt://templates/ntp.jinja
- context:
ntp_servers:
- 10.1.1.1
- 10.1.1.2
Jinja2 템플릿
# /srv/salt/templates/ntp.jinja
{% for server in ntp_servers %}
ntp server {{ server }}
{% endfor %}
실행
# 단일 장비
salt 'router1' state.apply network.ntp
# 모든 라우터
salt -G 'role:router' state.apply network.ntp
# 특정 OS
salt -G 'os:ios' state.apply network.ntp
원격 명령 실행
net.cli 모듈
# show 명령 실행
salt 'router*' net.cli "show version"
# 설정 변경
salt 'router*' net.cli "
interface GigabitEthernet0/1
description Managed by Salt
no shutdown
"
Python 코드로 실행
import salt.client
client = salt.client.LocalClient()
# 명령 실행
result = client.cmd(
'router*',
'net.cli',
['show ip interface brief']
)
for minion, output in result.items():
print(f"
{minion}:")
print(output)
이벤트 기반 자동화
Reactor (이벤트 응답)
# /etc/salt/master.d/reactor.conf
reactor:
- 'salt/minion/*/start':
- /srv/reactor/new_minion.sls
- 'salt/netapi/hook/alarm':
- /srv/reactor/network_alarm.sls
Reactor State
# /srv/reactor/network_alarm.sls
send_alert:
local.cmd.run:
- tgt: monitoring-server
- arg:
- '/usr/local/bin/send_alert.sh'
Beacons (모니터링)
# /etc/salt/minion.d/beacons.conf
beacons:
service:
- services:
sshd:
onchangeonly: True
network_settings:
- interfaces:
eth0:
type: up
NAPALM 통합
# 설정 배포
salt 'router*' net.load_config filename=/srv/salt/configs/router.conf
# 설정 비교
salt 'router*' net.load_config filename=/srv/salt/configs/router.conf test=True
# 커밋
salt 'router*' net.load_config filename=/srv/salt/configs/router.conf commit=True
실전 예제
1. 대량 설정 백업
# /srv/salt/network/backup.sls
backup_config:
module.run:
- name: net.config
- source: running
save_backup:
file.managed:
- name: /backup/{{ grains['id'] }}_{{ now }}.cfg
- source: salt://{{ slspath }}/files/config
- makedirs: True
2. 컴플라이언스 체크
# /srv/salt/_modules/compliance.py
def check_ssh_version():
"""SSH 버전 체크"""
output = __salt__['net.cli']('show ip ssh')
if 'version 2.0' in output:
return {'compliant': True}
return {'compliant': False, 'issue': 'SSH v1 detected'}
# 실행
salt 'router*' compliance.check_ssh_version
3. 네트워크 변경 자동화
# Orchestration (/srv/salt/orch/upgrade.sls)
backup_configs:
salt.state:
- tgt: 'router*'
- sls: network.backup
upgrade_firmware:
salt.state:
- tgt: 'router*'
- sls: network.upgrade
- require:
- salt: backup_configs
verify_upgrade:
salt.function:
- name: net.cli
- tgt: 'router*'
- arg:
- show version
- require:
- salt: upgrade_firmware
Salt API (REST)
# API 활성화
salt-api -d
# curl 사용
curl -sSk https://localhost:8000/login -H 'Accept: application/json' -d username=admin -d password=password -d eauth=pam
# 명령 실행
curl -sSk https://localhost:8000 -H 'Accept: application/json' -H 'X-Auth-Token: abc123...' -d client=local -d tgt='router*' -d fun=net.cli -d arg='show version'
장점
✓ 매우 빠른 실행 속도 ✓ 이벤트 기반 자동화 ✓ 대규모 환경 관리 (10,000+ 노드) ✓ 강력한 원격 실행 기능 ✓ NAPALM 통합
단점
✗ 복잡한 아키텍처 ✗ Master-Minion 구조 필요 ✗ Ansible보다 가파른 학습 곡선 ✗ 네트워크 장비는 Proxy Minion 필요
링크
- 공식 사이트: https://saltproject.io
- GitHub: https://github.com/saltstack/salt
- 문서: https://docs.saltproject.io/