상황
ansible adhoc 명령어를 이용해 전체 그룹에 ping 작업을 수행했지만 실패와 함께 아래와 같은 에러 메세지를 출력
# ansible all -m ping webserver1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true } dbserver1 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true } webserver2 | UNREACHABLE! => { "changed": false, "msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).", "unreachable": true } |
원인
제어 호스트의 public key(공개 키)가 관리 호스트에 없기 때문
해결방법 (두 가지)
ssh-copy-id 명령어를 이용해 public key(공개 키) 교환하기
또는
ad-hoc(애드혹) 명령어에 --ask-pass 옵션을 넣어 암호를 물어보게 설정하기
첫 번째
우선은 이해를 돕기 위해 public key(공개 키)를 교환하지 않고, --ask-pass 옵션으로 테스트 해보자
# ansible all -m ping --ask-pass SSH password: webserver2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } webserver1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } dbserver1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |
두 번째
위 테스트 결과처럼 --ask-pass 옵션으로 작업을 수행해도 문제는 없지만, ansible은 기본적으로 ssh public key(공개 키) 교환을 통해 ssh password 입력 없이 작업이 수행되는 것이 일반적이다.
따라서 이번에는 public key(공개 키) 교환을 통해 진행되는 과정을 살펴보자
제어 호스트에서 public key(공개 키)와 private key(비밀키)를 생성한다.
# ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/root/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /root/.ssh/id_rsa. Your public key has been saved in /root/.ssh/id_rsa.pub. The key fingerprint is: SHA256:3ejXwfgUXnEybjxbshKsHc8PIU+QDymcvTxAiEnTess root@ansible The key's randomart image is: +---[RSA 2048]----+ | .o+ +.o.oo..| | o.o =.=+ oo| | . +=+X o| | . .. =+&.X | | oS.+ =.% | | E. = + | | . . o .| | . | | | +----[SHA256]-----+ |
관리 호스트에 public key(공개 키)를 전송한다.
# ssh-copy-id webserver1 # ssh-copy-id webserver2 # ssh-copy-id dbserver1 |
관리 호스트에 키가 잘 전송되었는지 확인한다.
여기서 확인하는 방법으로 두 가지가 있다.
첫 번째는 각 관리 호스트의 root 계정으로 접속 후 authorized_keys 파일 내용 중 끝 부분에 제어 호스트의 호스트네임이 적혀있는지 확인하는 방법 (테스트에서 제어 호스트의 호스트네임은 ansible이다.)
[webserver1] # cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8jYJ2HoeQPS6CchLLnsMOWQ/sPtFkg8wuALY6WmXPXBF+8lpE/1H7vTZ02Di5MMZkDT1+R+ThkS7hjJkTHkc9gaLBAouVmcyDAGkyp8BdSoAY6umS2YbNmH8fxeQ8+Fa2M8EgjOp1AjZJI1n42afNxWwo4V/DbnQe7B8b+YguURgFtSiE71J9hdy/VqmvKPg64xigjqkVHnWv1Ckyau0O/DjyWg5ryDm5irDKWMpd9s40mmcVJCEKE8mVFuaW3knwQptBVpg1mwHQ95YihCGDPVFC6XkJYDI1q+EPAMKFpsUoUHP0QzXRE8YCxantsOpHV73NwTB7vTc7CWN66w7r root@ansible [webserver2] # cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8jYJ2HoeQPS6CchLLnsMOWQ/sPtFkg8wuALY6WmXPXBF+8lpE/1H7vTZ02Di5MMZkDT1+R+ThkS7hjJkTHkc9gaLBAouVmcyDAGkyp8BdSoAY6umS2YbNmH8fxeQ8+Fa2M8EgjOp1AjZJI1n42afNxWwo4V/DbnQe7B8b+YguURgFtSiE71J9hdy/VqmvKPg64xigjqkVHnWv1Ckyau0O/DjyWg5ryDm5irDKWMpd9s40mmcVJCEKE8mVFuaW3knwQptBVpg1mwHQ95YihCGDPVFC6XkJYDI1q+EPAMKFpsUoUHP0QzXRE8YCxantsOpHV73NwTB7vTc7CWN66w7r root@ansible [dbserver1] # cat ~/.ssh/authorized_keys ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC8jYJ2HoeQPS6CchLLnsMOWQ/sPtFkg8wuALY6WmXPXBF+8lpE/1H7vTZ02Di5MMZkDT1+R+ThkS7hjJkTHkc9gaLBAouVmcyDAGkyp8BdSoAY6umS2YbNmH8fxeQ8+Fa2M8EgjOp1AjZJI1n42afNxWwo4V/DbnQe7B8b+YguURgFtSiE71J9hdy/VqmvKPg64xigjqkVHnWv1Ckyau0O/DjyWg5ryDm5irDKWMpd9s40mmcVJCEKE8mVFuaW3knwQptBVpg1mwHQ95YihCGDPVFC6XkJYDI1q+EPAMKFpsUoUHP0QzXRE8YCxantsOpHV73NwTB7vTc7CWN66w7r root@ansible |
두 번째는 제어 호스트 → 관리 호스트로 ssh 접속 시 자동 로그인이 되는지 확인하는 방법
[ansible] [root@ansible ~] # ssh webserver1 ... 생략 ... [root@webserver1 ~] # |
이제 본문 맨 처음에 시도했었던 ping 테스트를 다시 수행해보자
# ansible all -m ping webserver1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } dbserver1 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } webserver2 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } |
다음 포스팅 때부터는 일반 계정으로 사용할 예정이다. (원래 root 계정으로 사용하는 게 보안상 좋지 않기 때문)
'IT2 > ansible' 카테고리의 다른 글
[ansible] playbook 개념/작성/예시 (0) | 2023.02.12 |
---|---|
[ansible] yaml(yml)을 위한 vi(vim) 꿀팁 설정 (0) | 2023.02.11 |
[ansible] inventory(인벤토리) 작성법-① (0) | 2023.01.29 |
[ansible] playbook 작성/실행 - SSH Public key 배포 (ssh-key 교환 방법) (0) | 2023.01.29 |
[ansible] 설치 및 기본 사용법 (ssh-key 교환 포함) (0) | 2023.01.27 |