본문 바로가기

*Troubleshooting Report*

[앤서블 에러] Permission denied(publickey..) - public key 복사, 권한 설정하기

반응형

 

1. 에러상황

playbook 실행시 에러

 

앤서블에서 다중플레이로 playbook 실행시 위와 같은 에러 상황 발생. error 문구의 Permission denied(publickey..)를 보니 key 관련 문제인 것 같습니다. 현재 상태를 점검해봅니다. 

ansible.cfg / inventory
multi_playbook.yml

 

˚ 앤서블 구성파일(ansible.cfg) : 현재 defaults 중에 가장 중요한 부분만 심플하게 작성해놓은 상황
˚  inventory : localhost, 192.168.56.11 모두 설정해놓은 상황

˚  key설정 : 192.168.56.11만 해놓은 상황

 

혹시 자기 자신(localhost)일 때도 key를 넘겨줘야 하는 것인가, 하는 의문에 아래와 같은 조치를 취해보았습니다. 

 

 

2. 문제 탐색 및 해결방안

A. key 설정하기 ( localhost )

 

# public key 넘기기

ssh-copy-id vagrant@localhost    # vagrant 부분에 사용자이름을 써주면 된다.
# ssh-copy-id user@localhost

public key 복사

 

# playbook 실행

ansible-playbook multi_playbook.yml

playbook 실행

 

key 설정 후 playbook을 실행했는데, 시스템을 읽어오는 fact까지는 ok 되었으나 여전히 error가 발생하여 실패했습니다. 대체 왜 일까요? 앗 혹시 권한 문제인 것일까요?

 

 

 

B. 권한문제 해결하기

 

B-1. become 설정( become_ask_pass 부분은 B-2에서 설정 예정)

문제를 해결하는 데는 우선 두가지 방법이 있습니다. 권한 문제 관련이면 become을 추가해줘야하는데, 아래처럼 playbook에 설정할 수도, inventory에 설정할 수도 있습니다.

정석은 inventory에 추가하는 것이 좋습니다. inventory에는 한 번만 설정해두면, play마다 become 을 설정할 필요가 없기 때문입니다. 하지만 playbook 에 설정할 것이라면, play 마다 become 항목을 추가해줘야 합니다. 둘 중 원하는 걸로 골라서 설정하시면 됩니다. 저는 case1인 playbook 에 설정해보았습니다.

 

 

case 1) playbook.yml 안에서 become 추가

vi multi_playbook.yml

playbook.yml 안에서 become 추가

 

playbook에 설정할 경우에 알아둬야할 부분이 있습니다. ***become, become_method, become_user 이렇게 세개 항목은 playbook에서도 추가 가능합니다. 그러나  become_ask_pass 는 playbook.yml 안에 기입 불가합니다! inventory에만 기입할 수 있습니다.

 

하지만 오늘 같은 경우에는 become_method, become_user 는 굳이 설정해주지 않아도 되니, 저는 become만 추가해서 true로 설정해주었습니다. 참고로 true 대신 yes라고 써도 문법은 동일합니다. (become: true = become: yes)

 

 

case 2) inventory에 become 항목 추가

# ansible.cfg

[defaults]
inventory=inventory
remote_user=vagrant
ask_pass=false

[privilege_escalation]
become=true
become_method=sudo
become_user=root
become_ask_pass=false

 

 

B-2. become_ask_pass 부분 설정

마지막으로 설정하지 않은 항목인 become_ask_pass 부분을 설정해줄 차례입니다. etc/sudoers에 가서 sudo 권한 사용시 비번을 묻지 않는 설정입니다.

inventory로 진행했어도 become_ask_pass 부분이 false로 되어있기 때문에, 위에서 어떤 case를 선택했는지랑 관계없이 모두 실행해줘야하는 부분입니다.  

 

# sudo 권한 사용시 비밀번호 묻지 않도록 세팅

sudo vi /etc/sudoers.d/vagrant    # vagrant 부분에 사용자이름을 써주면 된다.
# sudo vim /etc/sudoers.d/user
####################################
vagrant ALL=(ALL) NOPASSWD:ALL
#user ALL=(ALL) NOPASSWD:ALL
####################################

# sudoers.d : sudo 권한 설정을 위해 사용

 

sudo vi /etc/sudoers.d/ vagrant

 

 

3. 해결 완료

결과

 

이 모든 과정을 끝내니 드디어 정상적으로 진행되었습니다. 문제가 잘 해결되어서 다행입니다.


 

오늘 배운 것이 꽤 많습니다. 자기 자신(localhost)일 때도 key를 넘겨줘야한다는 사실과 become 권한문제를 꼭 설정해줘야한다는 사실입니다. 이번 에러를 통해 저는 오늘도 한 발자국 성장했습니다. 🐾

반응형