1. 에러상황
앤서블에서 다중플레이로 playbook 실행시 위와 같은 에러 상황 발생. error 문구의 Permission denied(publickey..)를 보니 key 관련 문제인 것 같습니다. 현재 상태를 점검해봅니다.
˚ 앤서블 구성파일(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
# playbook 실행
ansible-playbook multi_playbook.yml
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에 설정할 경우에 알아둬야할 부분이 있습니다. ***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 권한 설정을 위해 사용
3. 해결 완료
이 모든 과정을 끝내니 드디어 정상적으로 진행되었습니다. 문제가 잘 해결되어서 다행입니다.
오늘 배운 것이 꽤 많습니다. 자기 자신(localhost)일 때도 key를 넘겨줘야한다는 사실과 become 권한문제를 꼭 설정해줘야한다는 사실입니다. 이번 에러를 통해 저는 오늘도 한 발자국 성장했습니다. 🐾