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 명령어로 최신의 패키지를 설치할 수 있습니다.
1 |
yum install salt-ssh |
의존성 패키지도 함께 설치가 됩니다.
또다른 설치 방법이 있는데, SaltSack 자체가 Python 으로 제작되었고 라이브러리(Library)이기 때문에 Python 의 패키지 설치 프로그램인 pip 를 이용해서 다음과 같이 설치가 가능합니다.
1 2 3 |
virtualenv saltenv source saltenv/bin/activate (env)$ pip install salt-ssh |
위와같이 설치했을 경우에 실행은 항상 python의 가상환경에서 실행을 해줘야 합니다.
Saltfile 작성
salt-ssh 는 master, minion 도 아닌 독자적인 패키지 이기 때문에 자체적인 글로벌한 환경세팅 파일을 가지는데 이것이 바로 Saltfile 입니다. Saltfile 는 salt-ssh 의 전체적인 동작방법과 설정디렉토리등을 정의하며, 이 파일이 존재하는 위치를 기준으로 상대적인 루트(Root)로 인식합니다.
한가지 말씀드리면, 이 파일은 절대적으로 필요하지는 않습니다. salt-ssh 를 실행할때마다 옵션으로 지정해줘도 됩니다.
1 2 3 4 |
salt-ssh: config_dir: etc/salt max_procs: 30 wipe_ssh: True |
roster 작성
이 파일은 접속하고자하는 서버의 정보를 기술한 파일입니다. minion_id, 호스트명(혹은 ip), 로그인을 위한 계정정보 등을 담고 있습니다. 대략 다음과 같습니다.
1 2 3 4 |
node0: host: 192.168.96.20 user: root passwd: password |
이 파일은 Saltfile 에서 정의한 config_dir 디렉토리에 있어야 합니다.
salt-ssh 는 어떤 시스템 계정에서든 가능합니다. 보통은 Salt 라는 일반 계정을 만들어서 하는 경우가 많은데, salt-ssh 역시 일반 계정으로 가능합니다. 이번 예제도 salt 라는 시스템계정을 만들어서 진행했고 지금까지 파일시스템 레이아웃은 다음과 같습니다.
1 2 3 4 5 6 |
]$ tree -p . |-- [-rw-rw-r--] Saltfile `-- [drwxrwxr-x] etc `-- [drwxrwxr-x] salt `-- [-rw-rw-r--] roster |
master 파일 작성
salt-ssh 도 salt-master 와 같이 master 설정파일을 필요로 합니다. 이는 Saltfile 에서 정의해준 디렉토리인 etc/salt 디렉토리에 다음과 같이 만들어 줍니다.
1 2 3 4 5 6 7 8 9 10 |
log_file: var/log/salt/master log_level_logfile: debug root_dir: . file_roots: base: - srv/salt pillar_roots: base: - srv/pillar |
salt-ssh 실행
다음과 같이 실행해 봅니다.
1 2 3 4 5 6 |
[salt@localhost ~]$ salt-ssh node0 test.ping [WARNING ] Failed to open log file, do you have permission to write to /var/log/salt/master? salt-ssh could not be run because it could not generate keys. You can probably resolve this by executing this script with increased permissions via sudo or by running as root. You could also use the '-c' option to supply a configuration directory that you have permissions to read and write to. |
로깅을 위한 디렉토리를 만들어 줍니다. 주의할점은 salt 시스템 계정을 루트(root) 디렉토리로해서 만들어 줍니다.
1 2 3 4 5 6 7 8 9 10 11 12 |
[salt@localhost ~]$ mkdir -p var/log/salt [salt@localhost ~]$ salt-ssh node0 test.ping node0: ---------- retcode: 254 stderr: stdout: The host key needs to be accepted, to auto accept run salt-ssh with the -i flag: The authenticity of host '192.168.96.20 (192.168.96.20)' can't be established. ECDSA key fingerprint is eb:a1:bb:7a:15:7c:69:3f:63:ec:e5:67:b1:35:1a:02. Are you sure you want to continue connecting (yes/no)? |
디렉토리를 만들고 다시 실행을 하면, 뭔가 진행이 됩니다. 메시지를 자세히보면 ‘-i’ 옵션을 사용하라고 나옵니다. ‘-i’ 옵션을 이용해 다시 실행하면 다음과 같은 결과를 보여줍니다.
1 2 3 |
salt@localhost ~]$ salt-ssh node0 test.ping -i node0: True |
매우 잘 동작합니다.
salt-ssh 를 위한 SSH Key 배포
salt-ssh 는 기본적으로 ssh 의 rsa 비대칭키를 기반으로 인증을 합니다. 이는 config_dir 디렉토리 안에 pki 디렉토리에 들어 있습니다.
1 2 |
[salt@localhost ~]$ ls etc/salt/pki/master/ssh/salt-ssh.* etc/salt/pki/master/ssh/salt-ssh.rsa etc/salt/pki/master/ssh/salt-ssh.rsa.pub |
SSH 의 비대칭키를 이용하면 아이디/패스워드가 필요가 없습니다. salt-ssh 를 통해서 명령어를 실행시킬 권한을 가진 사용자, 대부분 root 나 sudo 권한을 가진 사용자 시스템 계정에 이키를 복사해두면 roster 에 아이디/패스워드를 적어둘 필요가 없습니다. 공개키만 배포하면되는데, 다음과 같이 합니다.
1 2 3 4 5 6 7 8 9 |
[salt@localhost ~]$ ssh-copy-id -i etc/salt/pki/master/ssh/salt-ssh.rsa.pub root@192.168.96.20 /bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed /bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys root@192.168.96.20's password: Number of key(s) added: 1 Now try logging into the machine, with: "ssh 'root@192.168.96.20'" and check to make sure that only the key(s) you wanted were added. |
실제로 ‘192.168.96.20’ 서버에 root 계정에 .ssh 디렉토리를 살펴보면 ‘authorized_keys’ 파일이 생성된걸 볼수 있습니다.
이제 roster 에서 계정정보를 삭제하더라도 salt-ssh 는 잘 동작합니다.