2018년 2월 19일 월요일

솔트 스택 개념 및 사용

1. 솔트 스택이란?
  - 대규모 인프라를 관리하기 위한 자동화 관리 시스템
  - 서버와 에이전트간 zeromq를 통해 동신함, 에이전트 요청에 대해 비도기 병렬로 처리하기 때문에 에이전트 많아도 수 초안에 처리 가능
  - 별도의 DB를 사용하지 않고 서버-에이전트 기반의 매우 단순한 구조
  - 파이썬 기반의 Module / Function 으로 구현됨
  - 설정 파일은 YAML 포맷을 기본으로 하며 template 파일의 경우 Jinja2 template를 사용

2. 솔트 스택 구성
  - 솔트 마스터 : 솔트에서 서버 역할을 함. 마스터는 등록된 미니언에게 명령을 퍼블리싱하고, 그 결과를 취합하여 보여주는 역할을 함
  - 솔트 미니언 : 에이전트 역할, 구성 자동화를 하기 위한 대상 서버에 설치, 마스터 명령을 대기하고 있다가 명령이 오면 해당 작업을 수행함
  - ZeroMQ : 솔트 마스터와 솔트 미니언 간 통신에 사용되는 비동기 메시징 라이브러리 / 퍼블리싱 포트로 4505, 리턴 포트로 4506을 사용 / 모든 솔트 미니언이 솔트 마스터의 4505 포트를 작업에 대한 리스닝을 한 후 작업 결과를 4506 포트로 리턴 또는 특정 파일, 데이터를 요청함 (ZeroMQ 링크 : http://kr.zeromq.org/)

3. 솔트 스택 세부 개념
  - State : 원하는 머신 사태를 기술하는 파일(패키지 설치, 파일 수정, 퍼미션 업데이트 등의 작업 명령을 작성)
  - Grains : 미니언 호스트 자체에서 수집되는 정보(솔트 미니언 데몬에 의해 자동 또는 마스터의 명령에 의해 OS, 환경, 하드웨어 플랫폼 등 세부 정보를 수집함) / YAML 포맷 / 작업 대상을 시스템 정보를 기준으로 구분지을 경우 사용됨 / 미니언 -> 마스터
  - Pillars : 솔트 마스터에서 글로벌하게 정의하는 변수이며 Key & Value 형태로 Master에서 작성함 / 마스터 -> 미니언
  - Salt File Server : State에서 참조하는 파일과 스크립트, 기타 아티팩트가 저장
  - Salt Top Files : State / Pillars를 미니언에 매핑하는데 사용

4. 솔트 스택 사용 예제
  * 리눅스 사용자 계정 생성 / NGINX & PHP-FPM 서비스 설치 / 설치된 서비스의 구성 및 실행

  - 스테이트
    ~ 미니언의 /src/salt/states를 솔트 스테이트 트리의 루트로 사용
    ~ 단일 파일 형태(/src/salt/states/mystate.sls) or 폴더 구성(/srv/salt/states/mystate/init.sls)로 구성 및 저장
    ~ salt:// 포맷은 스테이트 트리의 파일을 제공하는 솔트 파일 서버를 가리킴
    => /salt/states/users/init.sls | /salt/states/nginx/init.sls | /salt/states/php-fpm/init.sls | /salt/states/phptest/init.sls 작성
 
  - 필러
    ~ 솔트 마스터에서 정의되고, 렌더링되며 변수는 중앙 저장소에서 저장됨
    ~ 미니언에서 /srv/salt/pillars를 필러 트리의 루트로 사용
    => /salt/pillars/users.sls 작성
 
  - 그레인
    ~ 미니언 호스트의 실제 정보를 포함하는 정적인 데이터
    => /salt/states/phptest/init.sls 에서 그레인 사용

  - 톱파일
    ~ 스테이트/필러와 미니언 사이의 매핑을 제공함
    ~ 개발환경 / QA 환경 / 운영 환경을 쉽게 구분지을 수 있음
    => /salt/states/top.sls | /salt/pillars/top.sls 연결

5. 솔트콜 주요 명령어
  - 필러의 아이템 확인 : # salt-call pillar.items
  - 그레인의 아이템 확인 : # salt-call grains.items
  - 개별 스테이트 실행 : # salt-call grains state.apply nginx
  - 스테이트 전체를 실행 : # salt-call state.apply

6. 솔트 마스터와 마스터리스
  - 솔트 마스터 : 수많은 미니언 노드에 병렬로 빠르게 접근할 수 있는 중앙 집중형 제어 플랫폼
  - 마스터리스 : 유지 및 관리할 마스터 노드 없음 / 보안상 솔트 마스터보다 더 안전 / 초기 솔트 실행 후 설정된 미니언은 불변

7. 솔트 사용 예제 (우분투 기준)
  1) 설정
    # vi /etc/salt/master
    file_roots:
      base:
        - srv/salt
  2) 파일 복사
    # cp -ar <대상 파일> /srv/salt
  3) 그레인 추가
    # salt '*' grains.append roles <규칙 이름>
  4) 적용
    salt '*' state.apply pillar='{"":""}'