더북(TheBook)

-h 옵션으로 대상 호스트를 적어둔 파일 nodes를 지정해서 명령을 실행할 수 있다.

shinjaehun@losttemple:~$ parallel-ssh -h nodes -l administrator -i uptime

출력량이 한 화면을 넘어서 보기 어려운 명령이라면 결과를 파일로 저장하자. -o 옵션 뒤에 결과를 저장할 디렉터리를 입력한다.

shinjaehun@losttemple:~$ parallel-ssh -h nodes -l administrator -o result 'tail /var/log/syslog'

하위 디렉터리 result에 각 호스트를 대상으로 한 명령 결과가 파일로 저장되어 있다.

shinjaehun@losttemple:~$ cat result/192.168.122.201
Oct 28 15:49:53 server01 acpid: 1 rule loaded
Oct 28 15:49:53 server01 acpid: waiting for events: event logging is off
Oct 28 15:49:53 server01 cron[819]: (CRON) INFO (pidfile fd = 3)
Oct 28 15:49:53 server01 cron[882]: (CRON) STARTUP (fork ok)
Oct 28 15:49:53 server01 cron[882]: (CRON) INFO (Running @reboot jobs)
Oct 28 15:49:54 server01 /usr/sbin/irqbalance: Balancing is ineffective on systems with 
a single cache domain. Shutting down
Oct 28 15:50:01 server01 ntpdate[684]: step time server 91.189.94.4 offset 1.142743 sec
Oct 28 15:50:16 server01 ntpdate[1007]: adjust time server 91.189.94.4 offset -0.000136 
sec
Oct 28 15:51:26 server01 kernel: [ 100.800246] random: nonblocking pool is initialized
Oct 28 16:17:01 server01 CRON[1507]: (root) CMD ( cd / && run-parts --report /etc/
cron.hourly)

여러 SSH 서버를 대상으로 파일을 배포하는 도구는 parallel-scp이다. parallel-scp [옵션] -h [호스트] [전송할 파일] [저장할 위치] 형식으로 입력한다. 다음 명령은 test_parallel 파일을 nodes에 정의된 대상 호스트의 /tmp 디렉터리에 전송할 것이다.

shinjaehun@losttemple:~$ touch test_parallel
shinjaehun@losttemple:~$ parallel-scp -h nodes -l administrator test_parallel /tmp/
[1] 17:33:50 [SUCCESS] 192.168.122.202
[2] 17:33:50 [SUCCESS] 192.168.122.201

SSH 서버에 접속해서 /tmp 디렉터리를 확인해보자. 파일이 성공적으로 전송되었다.

administrator@server01:~$ ls -l /tmp/test_parallel
-rw-rw-r-- 1 administrator administrator 0 Oct 28 17:33 /tmp/test_parallel

반대로 여러 SSH 서버에 존재하는 파일을 한 번에 받아오는 것도 가능하다. parallel-slurp를 사용하는데 parallel-slurp [옵션] -h [호스트] -L [받아올 파일] [저장할 위치] 형식으로 입력한다. 다음 명령은 nodes에 정의된 대상 호스트의 hostname 파일들을 받아와서 local_dir이라는 디렉터리에 저장할 것이다.

shinjaehun@losttemple:~$ parallel-slurp -h nodes -l administrator -L local_dir /etc/hostname .

local_dir에 각 호스트에 해당하는 하위 디렉터리가 자동으로 생성되고 hostname 파일이 저장되었다.

shinjaehun@losttemple:~$ cat local_dir/192.168.122.201/hostname
server01

병렬 ssh가 여러모로 편리하지만, 한편으로 잘못 사용하면 전체 시스템을 망가뜨릴 수도 있으니 조심해야 한다. 아닌 게 아니라 선배도 루트 권한과 관련해서 조언을 해줬다.

병렬 ssh와 -A 옵션으로 루트 사용자의 패스워드를 입력하면 루트 권한을 사용할 수는 있다. 하지만, 보안을 위협하는 여러 문제가 존재하는데, 첫째 패스워드가 전송된다는 점, 둘째 SSH 서버에서 루트 로그인을 허용해야 한다는 점, 셋째 서버마다 루트 계정을 생성해서 로그인을 허용해야 한다는 점이 그러하다. 따라서 시스템의 상태를 확인하고 파일을 배포하는 용도로 병렬 ssh를 사용해야 하며, 시스템을 직접 제어하기에는 적합하지 않다.

병렬 ssh 대신 시스템 자동 설정 도구 퍼펫puppet을 사용해서 전체 시스템을 제어하는 편이 안전하고 효율적이다. 오늘은 여기까지!

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.