Category: DevOps

DevOps

SaltStack 에서 Jinja 사용시 유용한 팁

Salt 는 Jinja Template 을 지원해 Salt 파일 작성시에 프로그래밍이 가능하도록 되어 있습니다.  예를들어 배포판별로 아파치 웹 서버의 패키지 이름이 다른데, Jinja Template 를 이용하면 프로그래밍을 할 수 있습니다.

Salt 의 grains 을 이용해서 배포판을 가지고 오고 조건식(if statement)를 이용해서 패키지명을 명시해주고 있습니다.

하지만 이렇게하면 Salt 자체의 YAML 문법과 섞여서 읽기가 힘든 부분이 있습니다. 그래서 이를 다음과 같이 개선할 수 있습니다.

조건식을 앞으로 빼고 변수를 이용해서 패키지명을 저장해주고 이 변수를 Salt YAML 문법에 사용하는 것입니다. 앞에 버전보다는 Jinja 문법과 YAML 이 분리가 되어서 읽기가 매우 편해졌습니다.

또 다른 좀 더 나은 버전으로는 앞의 Jinja 문법을 다음과 같이 간소화할 수 있습니다.

출처: Salt Formulas

salt-ssh, 에이전트 없이 SaltStack 사용하기

SaltStack 은 기본적으로 서버/클라이언트 구조를 가집니다. 서버는 중앙집중식으로 Salt-master 라 불리우고 각각의 관리대상이 되는 서버들에는 클라이언트로 Agent 가 설치되는데 이것을 Salt-minion 이라고 부릅니다. 이 둘이 통신을 주고받으면서 작동하게 되는 방식입니다.

하지만, 새로운 서버를 설치했을때에는 Agent 가 없기 때문에 SSH 로 원격 접속이 가능하다고 하더라도 Salt-minion 을 설치하기 전까지 수동으로 사람이 서버를 다루어야 하는 불편함이 존재합니다.

그래서 Saltstack 은 Salt-minion이 없이 SSH를 통해서 Salt 를 실행시킬 수 있도록 모듈을 제작했는데, 그것이 바로 Salt-ssh 입니다.

Environment

이 글을 예제는 전부 다음의 환경에서 작성되었습니다.

  • CentOS 7
  • 64bit
  • epel YUM repository installation

Salt-SSH 를 설치하기 위해서 epel YUM Repository 를 설치했습니다.

Install Salt-SSH

epel YUM repository 를 설치했다면 간단하게 Yum 명령어로 최신의 패키지를 설치할 수 있습니다.

의존성 패키지도 함께 설치가 됩니다.

또다른 설치 방법이 있는데, SaltSack 자체가 Python 으로 제작되었고 라이브러리(Library)이기 때문에 Python 의 패키지 설치 프로그램인 pip 를 이용해서 다음과 같이 설치가 가능합니다.

위와같이 설치했을 경우에 실행은 항상 python의 가상환경에서 실행을 해줘야 합니다.

Saltfile 작성

salt-ssh 는 master, minion 도 아닌 독자적인 패키지 이기 때문에 자체적인 글로벌한 환경세팅 파일을 가지는데 이것이 바로 Saltfile 입니다. Saltfile 는 salt-ssh 의 전체적인 동작방법과 설정디렉토리등을 정의하며, 이 파일이 존재하는 위치를 기준으로 상대적인 루트(Root)로 인식합니다.

한가지 말씀드리면, 이 파일은 절대적으로 필요하지는 않습니다. salt-ssh 를 실행할때마다 옵션으로 지정해줘도 됩니다.

roster 작성

이 파일은 접속하고자하는 서버의 정보를 기술한 파일입니다. minion_id, 호스트명(혹은 ip), 로그인을 위한 계정정보 등을 담고 있습니다. 대략 다음과 같습니다.

이 파일은 Saltfile 에서 정의한 config_dir 디렉토리에 있어야 합니다.

salt-ssh 는 어떤 시스템 계정에서든 가능합니다. 보통은 Salt 라는 일반 계정을 만들어서 하는 경우가 많은데, salt-ssh 역시 일반 계정으로 가능합니다. 이번 예제도 salt 라는 시스템계정을 만들어서 진행했고 지금까지 파일시스템 레이아웃은 다음과 같습니다.

master 파일 작성

salt-ssh 도 salt-master 와 같이 master 설정파일을 필요로 합니다. 이는 Saltfile 에서 정의해준 디렉토리인 etc/salt 디렉토리에 다음과 같이 만들어 줍니다.

salt-ssh 실행

다음과 같이 실행해 봅니다.

로깅을 위한 디렉토리를 만들어 줍니다. 주의할점은 salt 시스템 계정을 루트(root) 디렉토리로해서 만들어 줍니다.

디렉토리를 만들고 다시 실행을 하면, 뭔가 진행이 됩니다. 메시지를 자세히보면 ‘-i’ 옵션을 사용하라고 나옵니다. ‘-i’ 옵션을 이용해 다시 실행하면 다음과 같은 결과를 보여줍니다.

매우 잘 동작합니다.

salt-ssh 를 위한 SSH Key 배포

salt-ssh 는 기본적으로 ssh 의 rsa 비대칭키를 기반으로 인증을 합니다. 이는 config_dir 디렉토리 안에 pki 디렉토리에 들어 있습니다.

SSH 의 비대칭키를 이용하면 아이디/패스워드가 필요가 없습니다. salt-ssh 를 통해서 명령어를 실행시킬 권한을 가진 사용자, 대부분 root 나 sudo 권한을 가진 사용자 시스템 계정에 이키를 복사해두면 roster 에 아이디/패스워드를 적어둘 필요가 없습니다. 공개키만 배포하면되는데, 다음과 같이 합니다.

실제로 ‘192.168.96.20’ 서버에 root 계정에 .ssh 디렉토리를 살펴보면 ‘authorized_keys’ 파일이 생성된걸 볼수 있습니다.

이제 roster 에서 계정정보를 삭제하더라도 salt-ssh 는 잘 동작합니다.

SaltStack 시작하기.

이 글은 SaltStack 시작하기 에 관한 글입니다.

SaltStack 은 자동화 시스템 관리 프로그램입니다. 서버의 설정파일, 패키지 관리, 시스템 명령어등을 한번에 많은 서버에 할 수 있습니다. Chef, Puppet 등과 동일합니다. 단지 이 녀석은 Python 으로 개발이 되었고 역활을 지시하는 sls 파일 문법이 YAML 이며 Jina Template 을 이용해서 sls 에 프로그래밍을 할 수 있습니다.

SaltStack 은 서버와 클라이언트로 모델입니다. 서버역활을 담당하는 SaltStack 을 마스터(Master)라고 하고 클라이언트 역활을 담당하는 SaltStack 을 하녀(Minion)이라고 부릅니다. 마스터의 경우 파일 전송을 할 수 있게 파일서버역활도 같이 합니다.

마스터, 하녀 역활로 나뉘어 있기 때문에 당연히 하녀가 어느 SaltStack 마스터에 지시를 받을것이지 하는 등록절차가 필요합니다.

Master 설치

설치 환경은 CentOS 를 기준으로 합니다. CentOS 의 경우에 Base Repository 에 SaltStack 패키지가 없습니다. 하지만 Epel Repository 를 설치하면 간편하게 Yum 명령어로 설치할 수 있습니다.

대략 20여개의 의존성 패키지들과 함께 설치됩니다. 앞에서 말했듯이 Salt 는 Python 으로 제작되었기 때문에 Python 관련 패키지가 많이 필요합니다.

Salt 마스터 설정.

설정파일은 /etc/salt/master 입니다. 아주 많은 옵션들이 존재하고 각 옵션마다 자세한 코멘트가 있어 어렵지 않게 필요한 것들을 설정할 수 있습니다.

기본적인 설정은 대략 다음과 같습니다.

위 설정만으로도 Salt 마스터는 잘 동작합니다.

Salt minion 설치하기

역시 CentOS 환경이고 Epel Repository 를 추가해서 Yum 을 이용해서 설치하면 됩니다.

설치가 완료되면 /etc/salt/minion 파일에 설정을 하면 됩니다.

Salt minion 설정.

설정파일 /etc/salt/minion 을 열어서 다음과 같이 기본적인 설정을 해줍니다.

id 설정이 중요합니다.

/etc/hosts 파일 설정.

리눅스의 hosts 파일을 마스터와 Minion 양쪽 모두에 설정해 줍니다.

Salt Minion 을 마스터에 등록하기

Salt 마스터는 Minion 을 등록해서 그 리스트를 유지하고 있습니다. Minion 이 마스터에 등록되어 있지 않다면 마스터로부터 그 어떠한 작업 지시를 받을 수 없겠죠. 그래서 새로운 Minion 이 생긴다면 먼저 마스터에 등록을 해줘야 합니다.

등록은 마스터에서 다음과 같이 합니다.

마스터와 minion 간에 통신이 된다면 위와같이 “Unaccepted Keys” 에  아직 등록하지 않은 minion 이 나옵니다.

등록은 다음과 같이 합니다.

등록이 되었다면 minion 과 통신이 잘되는지 다음과 같이 확인해 봅니다.

위와같이 나오면 정상입니다.