Viya 3.5 의 CAS 를 MPP 로 구성하면 controller 한 대와 worker 여러 대가 한 세션을 나눠 처리한다. controller 는 worker 프로세스를 SSH 로 띄우고 관리한다. 배포·패치에 쓰는 Ansible 플레이북도 같은 경로를 쓴다.
따라서 노드 사이의 무비밀번호 SSH 가 끊기면 CAS 자체가 뜨지 않는다. 서버 점검이나 보안 조치를 한 다음 날 갑자기 Viya 가 안 뜬다면 여기부터 본다.
Ansible 을 돌리면 모든 노드가 한꺼번에 접속 실패한다.
fatal: [cas-worker1]: UNREACHABLE! => {"changed": false,
"msg": "Failed to connect to the host via ssh:
Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true}
CAS 로그에는 worker 기동 실패가 남는다.
tail -n 200 /opt/sas/viya/config/var/log/cas/default/*.log
가장 흔한 헛수고가 계정을 잘못 짚는 것이다. 수동 접속은 되는데 Ansible 만 안 된다면 대개 계정이 다르다.
cas 또는 sas 인 경우가 많다.ansible_user 값이다.ps -o user= -C cas | sort -u
grep -n 'ansible_user\|ansible_ssh_private_key_file' <인벤토리 파일>
먼저 네트워크와 sshd 가 살아 있는지 본다.
nc -zv cas-worker1 22
다음으로 해당 계정으로 키 인증이 되는지 본다. GSSAPI 가 끼어들어 실패를 가리는 일이 있으므로 꺼 두고 시험한다.
ssh -o GSSAPIAuthentication=no -vvv cas@cas-worker1 'hostname'
-vvv 출력에서 어떤 키를 제시했고 서버가 무엇으로 거절했는지 확인한다. 서버 쪽 근거는 다음에 남는다.
sudo tail -n 100 /var/log/secure
sshd 설정이 바뀐 경우. 보안 점검 뒤 공개키 인증이 꺼지거나 Match 블록으로 특정 계정이 막히는 일이 있다.
sudo sshd -T | grep -E 'pubkeyauthentication|passwordauthentication|authorizedkeysfile|permitrootlogin'
sudo grep -n '^Match' /etc/ssh/sshd_config
고친 뒤에는 문법을 검사하고 reload 한다. 검사 없이 restart 하면 설정이 틀렸을 때 접속 경로가 통째로 막힌다.
sudo sshd -t && sudo systemctl reload sshd
홈 디렉터리와 키 파일 권한이 바뀐 경우. 권한이 느슨하면 sshd 가 키를 무시한다. 일괄 chmod 스크립트를 돌린 뒤 자주 생긴다.
HOME_DIR=$(getent passwd cas | cut -d: -f6)
sudo chown -R cas:cas "$HOME_DIR/.ssh"
sudo chmod 700 "$HOME_DIR/.ssh"
sudo chmod 600 "$HOME_DIR/.ssh/authorized_keys"
sudo restorecon -Rv "$HOME_DIR/.ssh"
SELinux 가 켜져 있는데 authorized_keys 를 다른 곳에서 복사해 왔다면 컨텍스트가 어긋나 있다. restorecon 이 그 경우를 고친다.
계정이 잠기거나 만료된 경우. 패스워드 정책을 새로 적용하면 서비스 계정까지 함께 걸린다.
sudo chage -l cas
sudo faillock --user cas
sudo faillock --user cas --reset
만료를 없앤다.
sudo chage -I -1 -m 0 -M 99999 -E -1 cas
홈 디렉터리가 공유 스토리지인 경우. NFS 홈을 쓰면 마운트가 빠졌을 때 authorized_keys 를 읽지 못해 전 노드가 동시에 실패한다. 전 노드가 한꺼번에 막혔다면 이쪽을 먼저 의심한다.
mount | grep -i home
controller 에서 모든 worker 로 한 번에 확인한다.
for h in cas-worker1 cas-worker2 cas-worker3; do
printf '%s: ' "$h"
ssh -o BatchMode=yes -o ConnectTimeout=5 -o GSSAPIAuthentication=no "cas@$h" hostname 2>&1
done
BatchMode=yes 를 주면 비밀번호를 물어보지 않고 즉시 실패하므로 스크립트가 멈추지 않는다.
CAS 를 올린다.
sudo systemctl restart sas-viya-cascontroller-default
sudo systemctl status sas-viya-cascontroller-default