saltstack은 무엇이며 saltstack으로 실무에서 유용하게 사요할수 있는 방안과 실제 예제를 통해 어떻게 사용되는지 설명드리도록 하겠습니다. 인프라 관리 자동화 툴을 고민중에 있다면 해결책을 찾을수 있을것입니다.
Saltstack 이란?
Saltstack는 Ansible, Puppet, Chef 등의 다른 소프트웨어와 비슷합니다. 이 솔루션은 중앙 집중식으로 통합된 운영 및 관리를 위한 확장 가능한 플랫폼으로서, 분산 시스템의 배치, 모니터링 및 유지관리 작업을 간소화해줍니다.
Puppet이나 Chef와 같이 대규모 인프라를 관리하기 위한 자동화 관리 시스템(툴)을 말합니다. 서버(Master)와 에이전트(Minion) 사이에는 ZeroMQ가 사용되며, 서버에서 에이전트로 보내는 요청은 비동기적으로 여러 개의 에이전트에게 동시에 전달되므로 에이전트 수와는 무관하게 수초 이내에 처리할 수 있습니다.
Server는 자체적으로 데이터베이스를 운영하지 않으므로, 필요한 경우 플러그인을 통해 데이터베이스를 이용할 수 있습니다. 또한, 파이썬 모듈과 함수를 사용하여 구현된 인프라 자동화 관리툴입니다. 설정 파일의 경우 YAML 형식을 기본으로 하며, 템플릿 파일의 경우에는 Jinja2 템플릿을 사용하는것이 특징입니다.
아래 내용은 실제 필자가 실무에서 유용하게 사용하는 saltstack 주요 기능과 명령어인데요. 수천~수만대의 VM을 관리하는데 아주 유용하게 주로 사용하는 명령어입니다. 만약 이와 같은 자동화 관리툴이 없었다면 예전에는 스크립트를 개발해서 관리하거나 그 마저도 힘들다면 일일이 모든 서버에 접속하여 수작업을 해야했는데요. 시스템엔지니어라면 이와 같은 saltstack 자동화 관리툴 하나쯤은 능숙하게 다룰수 있도록 스킬업을 하시는것을 권유드립니다.
Saltstack 명령어 예시
– saltstack sample 명령어 보는방법
salt ‘*’ sys.doc # output sys.doc (= all documentation) salt ‘*’ sys.doc pkg # only sys.doc for pkg module salt ‘*’ sys.doc network # only sys.doc for network module salt ‘*’ sys.doc system # only sys.doc for system module salt ‘*’ sys.doc status # only sys.doc for status module
– 현재 연결이 끊긴 Minion 찾기 및 자동 key 삭제
salt-run manage.down 2>/dev/null | tee /dev/tty | wc -l
salt-run manage.down removekeys=True * down minion 찾아서 key 삭제
– Windows OS 메모리 확인하기
Memory 500MB 이상인 process.exe 찾기
salt -G roles:tax cmd.run ‘tasklist /fi “imagename eq process.exe” /fi “memusage gt 512000″‘ –out=txt | egrep -v “Session|=” > Result.txt
– windows powershell 실행
특정 프로세스가 언제 시작했는지 확인해보는 명령어
salt -G roles:aaa cmd.run ‘Get-Process | select name, starttime | findstr python’ shell=powershell –out=txt
– 각 미니언들의 Roles check
salt -C ‘not G@roles:aaa and not G@roles:bbb and not G@roles:ddd and not G@roles:eee ‘ test.ping –out=txt
minion 이 자동으로 등록되게 할때 (acceptkey=true) role 이 추가 안된 minion 찾을때.
주기적으로 리눅스 cron에 등록하여 role이 없는것을 파악하여 파일에 결과를 저장후 grep로 특정 문자열 검색해서 -> grains.append 로 자동으로 다시 등록해주면 자동으로 Minion을 관리할수 있습니다.
– 전체 살아잇는 Minion IP 확인 하기
salt-run manage.alived show_ipv4=True –out=txt –out-file=IPADDR.txt
– 특정 Minion에 PING 이나 포트 체크
salt -G roles:sample network.ping 8.8.4.4 timeout=2
salt ‘*’ network.connect naver.com 80 timeout=2 family=ipv4
– salt-cp 파일 복사하기
salt-cp -G roles:aaa /srv/salt/file/minion ‘c:\salt\conf\’ <- salt-cp 는 file size 100KB 이하일때 권장
salt ‘*’ cp.get_dir salt://windows/consul ‘C:\’ <- 폴더 단위 배포(복사)
salt ‘*’ cp.get_file /srv/windows/consul.exe ‘C:\’ <- 파일단위 배포(복사)
– 윈도우 기반 Hyper-v host CSV mpio 검사 일괄적으로 진행하는 명령어
salt -G roles:host cmd.run ‘(gwmi -Namespace root\wmi -Class mpio_disk_info).driveinfo | % {Write-host “Name: $($_.name) Paths: $($_.numberpaths)”}’ –out=txt shell=powershell > mpio.list
– 계정 관련 명령어 원격에서 실행하기
salt -G roles:mgmt user.add user01 (계정 생성)
salt ‘*’ shadow.set_expire username 2017/12/31 (날짜 까지 계정 연장)
salt -G roles:mgmt cmd.run ‘chage -d 0 user01’ (최초로그인시 암호 변경)
salt MGT-XXX shadow.set_password user ‘위에서 만들어진 password’
python -c “import crypt; print crypt.crypt(‘password’, ‘\$6\$SALTsalt’)”
– salt list
salt -L `awk -vORS=, ‘{ print $1 }’ Agent.list | sed ‘s/,$/\n/’` test.ping
특정 minion 리스트를 Agent.list 파일에 리스트 저장후 읽어서 일괄적으로 명령 실행하기
– windows event check 10016, 6008(hyper-v cluster 에러 관련)
salt -G roles:host cmd.run ‘Get-WinEvent -FilterHashtable @{logname=”system”; id=10016} -MaxEvents 1 | format-table machinename, id, userid, timecreated, message -autosize | Out-String -Width 700’ shell=powershell –out=txt
minion restart
salt ‘*’ cmd.run_bg ‘C:\salt\salt-call.bat –local service.restart salt-minion’ (windows)
salt -C ‘not G@kernel:Windows’ cmd.run_bg ‘salt-call –local service.restart salt-minion’ (linux)
* minion config 파일 변경후 restart 할때 필요 , 백그라운드 프로세스로 실행됨
– CPU usage (CPU 사용량 체크)
salt -G roles:xxxxx status.cpuload –out=txt | awk ‘{ if ($2~/^[0-9]+$/) print $0 }’ | awk ‘$2 > 90{print $1,$2}’
* 리눅스 awk 명령어를 응용하여 2번째 필드가 숫자인 것만 추려서 필터를 적용. CPU load 가 90% 이상인것만 필터해서 결과를 보여줌. 즉 CPU사용량이 90%이상인 Minion들만 모두 출력되게 됩니다.
– file 내용 변경하기
salt hostname file.replace ‘c:\xxx\xxxx\xxx.ini’ pattern=’REMOTEIP =’ repl=’##REMOTEIP = 100.10.10.1′
REMOTEIP 문자열을 찾아 100.10.10.1로 일괄 변경해주는 예시
– salt cp.push 파일 카피
salt ‘*’ cp.push /etc/fstab
salt ‘*’ cp.push /etc/fstab upload_path=’/new/path/fstab’
salt ‘*’ cp.push /etc/system-release keep_symlinks=True
salt ‘*’ cp.push /tmp/filename remove_source=True
* minion 의 특정 파일 -> master 서버 ( /var/cache/salt/master/minions/xxx ) 복사됨
* master 환경설정 file_recv: True , file_recv_max_size: 100 활성화를 해줘야합니다.