SaltStack - 이벤트 기반 자동화

16 조회 2025-11-17 오픈소스 도구
GitHub 문서

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/