Saltstack
문서소개
SaltStack 의 기능 확인 및 테스팅 문서 입니다.
SaltStack은 무엇인가?
https://docs.saltstack.com/en/latest/topics/index.html 참고.
Salt is:
- a configuration management system, capable of maintaining remote nodes in defined states (for example, ensuring that specific packages are installed and specific services are running)
- a distributed remote execution system used to execute commands and query data on remote nodes, either individually or by arbitrary selection criteria
saltstack 주요문서 : https://docs.saltstack.com/en/latest/
saltstack 전체 문서 : 전체 문서 목차는 html 또는 pdf로 볼 수가 있음. https://docs.saltstack.com/en/latest/contents.html 또는 https://docs.saltstack.com/en/pdf/Salt-2015.8.3.pdf
Get Started Guide
https://docs.saltstack.com/en/getstarted/
saltstack 전반적인 설명과 따라할 수 있는 가이드가 있음.
SaltStack Component : https://docs.saltstack.com/en/getstarted/overview.html saltstack 을 구성하고 있는 컴포넌트에 대한 설명
SaltStack Flexibility : https://docs.saltstack.com/en/getstarted/flexibility.html : 서버 구성에 대한 설명을 담고 있음.
아래 구성으로 saltstack을 구성할 수 있음.
- Agent and Server
- Agent-only
- Server-only
- Any or all of the above in the same environment
SaltStack Speed : https://docs.saltstack.com/en/getstarted/speed.html 속도에 대한 이야기인데 자세한 설명은 없고 Salt Transport 문서나 zeromq 부분을 참고해야 함.
SaltStack Fundamentals Get Started Guide
https://docs.saltstack.com/en/getstarted/fundamentals/index.html
saltstack 설치, 명령어 실행(Execute module), 대삿 서버 설정하기(target), 설정 재사용하기, 특정 시스템에 명령과 설정 적용하기(States)를 실습하기 형태로 할 수 있습니다.
https://github.com/UtahDave/salt-vagrant-demo vagrant demo 환경을 이용하여 실습을 쉽게 할 수 있습니다.
차례차례대로 따라하면 됩니다. 특정 설정을 하는 Top 파일을 만들어 실행하는 것까지 테스팅을 할 수 있습니다.
SaltStack Configuration Management
https://docs.saltstack.com/en/getstarted/config/index.html
SaltStack Configuration Management 에 대한 내용임.
state 작성, Pillars , Includes, Ordering & Requisites, Jinja, Manged Files 소개
Tutorials
Get Started Guide 는 SaltStack 의 기본적인 사용법을 담고 있고 All Salt tutorials 은 더 상세한 내용을 담고 있음.
SaltStack 문서 메인 페이지에서는 이중 중요하게 볼 Tutorials 를 소개하고 있으며 초기에는 주로 아래 Tutorials 를 중심으로 보는 것이 좋음.
https://docs.saltstack.com/en/latest/topics/tutorials/index.html
Official Salt Walkthrough : Get Started Guide 와 거의 비슷함. 기초적인 사용방법을 담고 있음.
The following getting started tutorials are also available:
- Getting Started with States (How Do I Use Salt States?) state 에 대한 기본 소개
- Basic config management (States tutorial, part 1 - Basic Usage): salt state tree 구성. top file 준비
- Less basic config management (States tutorial, part 2 - More Complex States, Requisites) : require, watch 등 설명
- Advanced techniques (States tutorial, part 3 - Templating, Includes, Extends) : template, grains, environment, include, extends 등 설명
- Salt Fileserver Path Inheritance (States tutorial, part 4) : salt fileserver, environment (dev - qa -prod) 설명
SaltStack 문서 메인 페이지에서는 아래 문서는 링크가 없지만 함께 보는 것이 도움이 됨.
States Tutorial, Part 5 - Orchestration with Salt : 하나의 minion이나 병렬작업이 아닌 여러 minion에 걸쳐서 순서대로 작업을 할 경우에 도움이 될 수 있는 내용임. workflow 구현.
Pillar Walkthrough : pillar 구성하기
formulas 예제
A Github repo that contains a number of community-maintained formulas is available at https://github.com/saltstack-formulas
apache, mysql 소스를 살펴 보았음.
https://github.com/saltstack-formulas/apache-formula : CentOS6에서는httpd.conf 에 버그가 있어서 작동하지 않음.
https://github.com/saltstack-formulas/mysql-formula
saltstack state tree 파일 예제 : https://github.com/SS-archive/salt-states (http://saltstarters.org/ 에서 검색을 하였음. 도움이 되는지는 파악을 해야 함. salt tree 구조를 만들때는 참고가 될 수 있을 듯함.
saltstack formulas 만드는 것은 Salt Formulas 를 참고하면 됨. Salt Formulas 가 상세한 설명임.
새로 만들 때는 https://github.com/saltstack-formulas/template-formula 템플릿을 이용하면 됨.
REMOTE EXECUTION
사전에 정의한 명령을 실행함.
modules
전체 모듈 목록 : https://docs.saltstack.com/en/latest/ref/modules/all/index.html
모듈 개발하기 : https://docs.saltstack.com/en/latest/ref/modules/index.html 문서 참고.
모듈 디렉토리는 file_roots 의 modules 디렉토리에 위치하며 리눅스 시스템에서는 /srv/salt/modules 임.
_modules/
디렉토리는 다음의 salt functions 를 호출할 때마다 minion으로 동기화가 된다. 새로운 모듈을 설치하고 테스팅을
하려면 아래 명령을 이용하여 먼저 minion 에 모듈을 동기화하고 테스팅을 해야 한다. 파일이름이 foo.py 이면 모듈은
foo가 된다. 모듈 이름은 __virtual__ function 을 이용하여 바꿀 수 있다.
# pwd # /srv/salt/_modules # vim mytest.py # salt minion3 saltutil.sync_modules minion3: - modules.mytest # salt 'minion3' mytest.sleep
모듈을 만들 때 https://github.com/saltstack/salt/tree/develop/salt/modules 소스를 참고하여 만들면 된다. 프로그램을 만들 때 python docstring 을 이용하여 문서를 잘 만들어야 두어야 사용을 할 때 편리하다.
간단한 테스팅을 위하여 https://github.com/saltstack/salt/blob/develop/salt/modules/system.py 소스를 약간 고쳐서 작업을 해 보았다. system.py 는 salt에서 제공하는 cmd.run 을 이용하여 명령어를 실행하는 방식이다. 좀 더 프로그래밍을 하려면 python 을 좀 더 배워야 한다.
Returners
실행한 결과를 다른 곳으로 보냄. DBMS 등. 어떤 용도로 활용 가능한지는 예제를 찾아보아야 함.
Targeting
Globbing and regex, Grains, Pillar, Subnet/IP Address, Compound matching, Node groups 등을 이용하여 적용할 서버를 선택할 수 있음.
-b 옵션 또는 --batch-size 옵션을 통하여 실행할 서버 댓수나 %를 지정할 수 있음.
Configuration Management
States
Full list of states : Contains: list of install packages, create users, transfer files, start services, and so on.
States Overview : Contains: an overview of states and some of the core components. States에 대한 상세 설명 페이지임.
Renderers
기본은 YAML
salt manual 에서 참고자료
Salt Best Practices
Salt Best Practices : 설정파일의 구조를 어떻게 할 것인지에 대한 설명과 코드가 있음. https://github.com/saltstack-formulas 의 예제코드와 함께 익혀두는 것이 좋음. 초기에 설계를 잘해야 나중에 고생을 하지 않음.
- Modularity and clarity should be emphasized whenever possible.
- Create clear relations between pillars and states.
- Use variables when it makes sense but don't overuse them.
- Store sensitive data in pillar.
- Don't use grains for matching in your pillar top file for any sensitive pillars.
SALT CONVENTIONS - Salt Formulas
Salt Formulas (https://docs.saltstack.com/en/latest/topics/development/conventions/formulas.html) : formulas 구성에 대한 자세한 가이드임. Salt Best Practices 보다 상세한 내용이 있으며 이해 안되는 내용이 있음.
기타 자료
SaltStack 의 확장성, ZeroMQ 및 성능 관련
https://docs.saltstack.com/en/latest/topics/index.html
Salt takes advantage of a number of technologies and techniques. The networking layer is built with the excellentZeroMQ networking library, so the Salt daemon includes a viable and transparent AMQ broker. Salt uses public keys for authentication with the master daemon, then uses faster AES encryption for payload communication; authentication and encryption are integral to Salt. Salt takes advantage of communication via msgpack, enabling fast and light network traffic.
https://docs.saltstack.com/en/latest/
Building on proven technology 항목에서 ZeroMQ 네트워크 라이브러리를 사용하고 있다고 설명을 하고 있습니다.
http://zeromq.org/ ZeroMQ는 분산메시징 라이브러리로 RabbitMQ, ActiveMQ와 같이 설치하여 사용을 하는 것이라 라이브러리를 가져와서 필요한 프로그램을 개발해서 사용하는 방식입니다.
Salt Transport 에서 보시면 Publish-Subscribe 방 식을 사용합니다. Zeromq 의 동작방식을 제가 정확하게 이해하고 있는 것은 아닌데 Master에서 특정한 정보를 publish 하면 여기에 subscribe 하고 있는 전체 Minion(agent로 보시면 됩니다)이 자신에게 해당하는 내용이 있으면 응답을 하고 있는 구조입니다. msgpack 부분은 제가 잘 모르겠네요.
Salt Transport :
https://docs.saltstack.com/en/latest/topics/transports/index.html
One of fundamental features of Salt is remote execution. Salt has two basic "channels" for communicating with minions. Each channel requires a client (minion) and a server (master) implementation to work within Salt. These pairs of channels will work together to implement the specific message passing required by the channel interface.
https://docs.saltstack.com/en/latest/topics/topology/syndic.html
Salt Syndic : The most basic or typical Salt topology consists of a single Master node controlling a group of Minion nodes. An intermediate node type, called Syndic, when used offers greater structural flexibility and scalability in the construction of Salt topologies than topologies constructed only out of Master and Minion node types.
A Syndic node can be thought of as a special passthrough Minion node. A Syndic node consists of a salt-syndic
daemon and a salt-master
daemon running on the same system. The salt-master
daemon running on the Syndic node controls a group of lower level Minion nodes and the salt-syndic
daemon connects higher level Master node, sometimes called a Master of Masters.
The salt-syndic
daemon relays publications and events between the Master node and the local salt-master
daemon. This gives the Master node control over the Minion nodes attached to the salt-master
daemon running on the Syndic node.
관리하는 시스템 규모가 커지는 경우 syndic 을 이용하여 확장하는 형태로 되어 있네요. 이것을 이용하여 여러 대의 마스터에서 나누어서 처리를 하고 Master of Masters 와 통신을 하네요.
ActiveMQ 에서는 Network of brokers configuratoin 이라고 하여 여러 대의 브로커를 구성하고 브로커끼리 통신을 하여 외부에서 볼때는 하나로 보이게 할 수 있는데 ZeroMQ 에서 제공하는 기능을 이용하여 비슷하게 구현을 하는 것이 아닐까 생각이 됩니다. 여러 개의 브로커가 있으면 그 브로커들끼리 정보를 전달하여 최종적으로 다시 합치는 역할을 하는데 이 부분을 activemq 같은 미들웨어가 처리를 해주기 때문에 확장하기가 유리하지요. 일단 위의 자료만 가지고는 이 부분은 정확하게 파악이 안됩니다만 확인이 필요한 부분이네요.
파일 전송을 하는 부분은 multimaster를 이용하여 처리할 수 있지만 명령을 내리고 그 결과를 리턴 받는 것은 최종적으로 하나로 모아야 하는데요. 이 부분이 궁금합니다.
https://docs.saltstack.com/en/latest/topics/highavailability/index.html
고가용성과 관련해서는 multimaster 로 구성을 할 수도 있고 syndic는 HA구성은 아니지만 비슷한 효과를 볼 수도 있습니다.
다른 프로그램과의 비교 및 간단한 개인 의견
- pssh, dist(naver 에서 개발해서 공개) 는 멀티스레드를 이용하여 병렬로 ssh 를 통해서 명령을 내릴 수 있는 프로그램입니다. clusterssh는 x-windows 프로그램이며 터미널로 여러 대에 접속하여 동시에 명령을 내리는 방식입니다.
- capistrano(ruby), fabric(python), func(python), rex(perl. 설정관리 기능도 있음) 등은 원격 명령어 실행 역할(orchestration) 을 하는 프로그램이고 puppet, chef는 설정 관리 프로그램입니다. ansible/SaltStack은 설정관리 + 원격 명령 실행을 함께 할 수 있는 프로그램입니다.
- mcollective는
agent 방식이며원격 명령어 실행 역할을 하는 프로그램입니다. 확장성을 위해서 Redis, RabbitMQ, ActiveMQ 등의 MQ기술(pub/sub 방식)을 사용합니다.- mcollective는 마스터가 없는 환경입니다. 대신에 publish/subscribe middleware를 이용합니다.
- Ansible 은 ssh 통신만 하는데 SaltStack은 ssh 를 이용할 수도 있고 agent 를 이용할 수 있습니다. 관리할 시스템의 규모가 커지면 ssh 통신으로 처리하는 것은 한계가 있기에 zeromq의 분산메시징 기술을 이용하여 성능 및 확장성을 높이고 있습니다. ssh 와 agent 방식을 함께 사용할 수 있는지는 확인하지 않았습니다.
- mcollective 에서는 따로 MQ를 올려야 하는데 SaltStack 에서 성능이 일정 정도 나온다면 MQ서버를 별도로 관리하는 부담을 줄일 수 있습니다.
참고자료
Rundeck and Salt Integration at Salesforce (Video) : rundeck 과 saltstack 을 결합한 것으로 참고가 될 듯 함. http://rundeck.org/news/2014/03/20/Rundeck-and-Salt-at-Salesforce.html
puppet 에서 saltstack, ansible 를 비교하여 saltstack 선택한 내용 http://ryandlane.com/blog/2014/08/04/moving-away-from-puppet-saltstack-or-ansible/
aws : aws 에서 구성관리도구로 Ansbile, Chef, Puppet, SALTSTACK 모두 지원을 함.
http://www.aws-partner-directory.com/PartnerDirectory/PartnerDetail?Name=SaltStack
http://aws.amazon.com/ko/codedeploy/product-integrations/
AWS 에서 AWS CodeDeploy 예제 중 설정관리도구와 함께 사용을 하는 예제 : https://github.com/awslabs/aws-codedeploy-samples/tree/master/conf-mgmt saltstack 은 아주 간단한 예제만 있으며 설명이 자세하지는 않음.
확인해야 할 부분
- remote execution 에서 유용한 항목 뽑기
- states 에서 유용한 항목 뽑기
- salt 에서 output 조정하는 부분. pprint, json, txt, yaml 등을 지원함. 대규모 서버에서 정보를 가져와서 사용을 할 경우에는 출력을 바꾸어서 python 스크립트 등을 이용하여 처리하는 것이 좋을 듯함. 아니면 salt api를 이용하여 프로그램을 작성하는 방법도 있음.
- state 를 직접 확장해서 새로 만들 필요는 적겠지만 remote execution 모듈은 개발을 해야 할 필요성이 있을 것임.
- returners 를 이용하여 실행결과를 다른 곳에서 보내는 것이 필요할지. 주기적으로 salt 를 이용하여 정보를 수집하고 다른 db를 업데이트 할 수가 있음.
- renderers 이해하기. sls 파일, 템플릿 등에서 python 문법을 알아야 할 필요성도 있음.
- Reactor system : 특정 이벤트 발생시 작업을 할 수 있음. 이 부분이 유용한지 검토가 필요. 예를 들어 특정 자원을 모니터링하고 문제가 있는 경우 알람 서비스와 연동을 하는 등.
- 외부 프로그램(DB)연동
- 향후 웹UI를 통하여 salt 설정을 변경하기 위해 필요함.
- top.sls 를 외부에서 관리?
- pillars 를 외부에서 관리?
- CMDB에서 pillars 정보 가져와 통합하기
- fileserver backend
- git 과 로컬에 함께 구성?
- git fileserver 구성 필요성
- salt tree 디자인
- environment 를 이용할 것인가? 아니면 base 에서 dev, prod 형태로 해서 구분을 할 것인가? dev-qa-prod 로 구성을 할 때 연관이 됨.
- salt API 확인
- master
- minion
- 보안 및 접근관리
- saltmaster 에 접근하여 작업을 하면 모든 minion에 명령을 내릴 수 없음. 어떻게 하면 필요한 서버와 필요할 명령어 등을 조합하여 접근제한을 할 수 있는가?
- Salt Cloud 를 이용하여 Xen server 와 연동 가능한지 확인
- Vagrant 에서 saltstack provision 기능 확인
- 개발팀 또는 개발, 운영조직에서 풀어야 할 부분
- GIT 사용 및 관리. CI 절차. dev-qa-prod 절차.
- salt tree 배포하는 방법
- OS레벨까지 설정관리를 확대할 경우 어떻게 관리를 할 것인지 방안이 필요.
memo
state.apply : 특정 sls 파일을 지정할 수도 있으며 지정하지 않으면 state.
highstate 기능을 수행.
state.sls : Execute the states in one or more SLS files. 특정 sls 파일만 실행을 할 경우 사용. state.apply 에서도 특정 sls 만 실행할 수도 있지만 state.apply 에 아무 인수도 주지 않고 실행을 하면 관련한 sls가 모두 실행이 되므로 state.sls 가 안전할 듯 함.
http://ryandlane.com/blog/2014/08/04/moving-away-from-puppet-saltstack-or-ansible/
https://github.com/UtahDave/salt-vagrant-demo 를 fork 하여 테스팅을 한 것 https://github.com/taejoonmoon/salt-vagrant-demo