saltstack(2)
12 Jan 2017Saltstack 활용방법(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가 있는 건 아니며 양도 적은 편. 작성시 좋은 레퍼런스가 된다.