雜夫's Blog development architecture integration operation

saltstack(2)

Saltstack 활용방법(2)

Saltstack 스크립트 작성하기

기본 Salt설정 및 사용관련

간단한 state 실행 테스트를 위해 다음과 같이 수행. 설치하고 삭제 하는 등의 행위를 state로 정의하며, state를 apply한다. pkg.installed에서 보듯이 “이미 설치된 상태 자체”를 전달한다.

/etc/salt/master 설정의 경우 수정 후 salt-master 데몬을 한 번 재시작해 주어야 함

minion도 마찬가지로 서비스 모드로 실행하며, 재시작 가능

service salt-minion restart

pillar는 설정 후나 변경 후에 한 번씩 refresh가 필요함.

salt '* ' saltutil.refresh_pillar

salt의 base가 되는 디렉토리를 지정해야 함. 마찬가지로 pillar도 base가 있는듯

Salt 디렉토리 구성

기본적인 Saltstack 프로젝트는 아래와 같이 구성된다.

$ tree
.
├── pillar                -- TBD, 전역변수 역할
│   └── _ blank            
└── salt  
    ├── common.sls        -- 일반용도sls, salt '* ' state.apply common처럼 별도설치 가능, 사용자가 정의
    ├── nettools          -- 네트웍관련 sls, 별도 디렉토리를 만들 경우 init.sls 를 바로 찾음
    │   ├── config        -- 관련 설정을 위한 디렉토리
    │   └── init.sls      -- salt '* ' state.apply nettools 시 이 sls를 보게 됨
    ├── tomcat
    │   ├── init.sls
    │   └── settings.sls  -- 공용 변수(map)을 위한 공간을 가진 sls
    └── top.sls           -- 기본적으로 state를 주지 않을 경우 top.sls가 설치된다.

nettools 안에 init.sls, env.sls 와 같이 있을 경우 아래와 같이 바로 실행접근 됨
nettools - init.sls
nettools.env - env.sls

state 작성방법

다양한 명령들이 있으나, 실제로 다음정도의 명령들만 알아도, 일반적으로 사용하는 데에는 별 문제가 없을 듯 하다. 실제 코드는 여기를 참고

커맨드 실행 : 사전 조건을 걸어 명령을 수행

download-tomcat-tar:
  cmd.run:
    - name: curl -s -L -o / 
    - unless: test -f /

path, classpath등 미리 환경을 설정 후 실행해야 할 때

startup-tomcat:
  cmd.run:
    - env:
      - JAVA_HOME: ""
    - name: /bin/startup.sh
    - unless: test -n `ps -ef | grep java | awk '{print $2}'`

tar 압축풀기 : 다운로드 파일을 hash검사도 가능

unpack-tomcat-tar:
  archive.extracted:
    - name: 
    - source:  salt://tomcat/files/
    - source_hash: sha1=
    - archive_format: tar
    - tar_option: zxvf

파일 관리 : temp 파일 안의 변수를 동적으로 입력하며 템플릿을 복사

/conf/server.xml:
    file.managed:
        - source: salt://tomcat/conf/temp_server.xml
        - user: root
        - group: root
        - mode: '640'
        - template: jinja
        - defaults:
            server_port: "18080"
        - context:
            max_threads: 100

지역 변수를 다음과 같이 파일 안에서 설정 가능, jinja에서 쓰는 map도 가능한 듯 하며, 전역변수로 pillar라는 형태로 사용할 수도 있다.

set tomcat_home = '/app/tomcat'
set tomcat_version = 'apache-tomcat-8.5.9'
set tomcat_tar = tomcat_version + '.tar.gz'

일반적으로 많이 사용되는 web, was, db(apache, mysql, postgres, rabbitmq…등등)의 경우 기본적인 행위에 대한 state들이 존재함(매뉴얼참고)

MySQL의 경우 DB생성, User생성, 권한 부여를 아래와 같이 처리할 수 있다. 만약 아래와 같은데도 접속에 문제가 있다면 my.cnf의 listen설정을 보면 된다.

petclinic:
  mysql_database.present:
    - name: petclinic
  mysql_user.present:
    - name: petclinic
    - host: localhost
    - password: "petclinic"
  mysql_grants.present:
    - database: petclinic.*
    - grant: ALL PRIVILEGES
    - host: localhost
    - user: petclinic

petclinic_remoteuser:
  mysql_user.present:
    - name: petclinic
    - host: '%'
    - password: "petclinic"
  mysql_grants.present:
    - database: petclinic.*
    - grant: ALL PRIVILEGES
    - host: '%'
    - user: petclinic

state 작성시 주의사항

  • sls파일 하나 단위로는 state라고 하는듯 하며, state파일들이 모여서 formula가 됨

  • template을 위한 언어는 jinja, 신사 라고 하며, 일본 신사에서 따왔다고 함(template과 연결??), 이거 이외에도 다양한 템플릿 엔진이 있다. java의 velocity처럼 약간 별도의 문법을 가진 addon라이브러리라고 봐야 할 듯 싶다.

  • 작업 대상이 되는 파일은 salt 영역 안에 있어야 함(salt://) - 이건 확실하지 않음, 밖에 있는 파일을 참고하려고 할 경우 계속 에러가 발생함.

  • 디버깅이 힘들다. 찍어 볼 수는 있으나, coredump가 떨어지기도 함. 코드가 복잡해질 경우 원인을 찾기 매우 힘들다.(어디가 문제인지 파악하기 힘듬.)

  • 간혹 수정 후 재실행시 Memory Error가 발생함. 조금 기다렸다 다시 실행하거나, 서비스를 재시작 후 다시 실행하면 잘 실행된다.

  • /etc/salt/master 파일 안의 file_roots를 지정한다. 여러 라인으로 지정할 수 있으나, 동일한 이름의 state가 있으면 위에 입력된 것을 먼저 보는 것 같다.

Fomular

Chef의 recipe와 같이 formula라는 이름으로 오픈소스 패키지들을 설치할 수 있는 자동 script들을 제공. Chef의 supermarket이나, Ansible의 Galaxy처럼 아직 별도의 site가 있는 건 아니며 양도 적은 편. 작성시 좋은 레퍼런스가 된다.

공식 Home:Salt Fomular

공식 Guide:Salt Fomular