IT/LINUX

[ansible] become 에 대하여

송시 2020. 12. 22. 11:05
728x90

회사에서 자동화를 하고 싶었던게 있어서 expect 와 ssh key 를 통한 without password 로 자동화 스크립트를 작성했었다.

윈도우 서버도 있고 뭐 해서 완전 자동화라고 하기도 뭐하고, 스크립트를 깔끔하게 짠것도 아니고해서 유지보수 하기 쉽지 않겠네 생각하던차에

ansible 로 어떻게 한번 해볼라꼬했는데

자꾸 에러가 나더라.

 

ansible ssh: Shared connection to  closed

 

stderr 에서는 위의 shared 메시지가 나오고

stdout 에서는 "" 아무것도 안나오는 것이였다. 그래서 더욱 답답하고 장애처리를 하는데 도움을 얻을 수 없었다.

구글에서는 python 경로 문제일 것이라는 내용이 대부분이여서 삽질도 좀 해봤는데,

 

새벽까지 했던 내 노력의 결과로 승리했다.

ansible.cfg 에 있는 become = True 의 문제였던 것

become = True 는 무적권 remote_user 에서 더 높은 권한으로 실행되도록 설정하는 것이다.

특별한 일이 없다면 root 에 준하는 권한으로 실행되는데, 최근 리눅스의 권한 상승 추세는 su 가 아닌

sudo 를 사용한다.

sudo 는 /etc/sudoers 와 /etc/sudoers.d/ 의 하위 파일들을 통해서 설정을 하는데

회사에서는 여러 보안정책중 sudoers 를 템플릿으로 관리하는 방법을 취하고 있다.

각 템플릿은 특징에 따라 파일이름이 분류되어 있었는데,

ansible 에서는 become_method = sudo 로 사용하게 되면 /etc/sudoers.d/filename 아래에

해당 사용자에 대한 sudo 권한이 NOPASSWD 설정으로 되어 있어야 한다.

관리호스트에 sandy 라는 계정이 /etc/sudoers.d/sandy(보통 계정명과 동일하게 하지만, 반드시 동일해야하지는 않다) 의 파일 형태로 sudo 설정이 되어 있어야지만 

become 설정이 정상적으로 적용된 다는 것이다.

become = False 의 상태라면 아마 일부 권한 없어도 되는 모듈들은 성공했을 것이다.

그런데 나는 처음부터 become = True 의 상태에서 모든 모듈이 실패하는 것을 봤어야 했다.

그리고 원인을 알게된 후에 /var/log/sudo.log 를 확인해보니 /etc/sudoers.d 에 계정이름으로 설정이 되어 있지 않았을때 

 

22 01:57:01 : sandy : command not allowed ; TTY=pts/9 ; PWD=/home/sandy
    ; USER=root ; COMMAND=/bin/sh -c echo
    BECOME-SUCCESS-qnoyjkokqzqoneqdjxgxwhrflzvohfqu ; /usr/bin/python2
    /home/sandy/.ansible/tmp/ansible-tmp-1608569266.34-4026-10238043981701/

가 발생한 다는 것을 뒤늦게 알았다. 처음부터 봤더라면 sudo 를 의심했을 텐데, 

stdout 에 어떠한 에러도 없어서 확인하는데 시간이 걸렸다.

 

애시당초 remote_user 의 sudo 가 안되었더라면 더 빨리 알았을테지만 

 

user_alias 로 remote_user 의 group 으로 sudo 가 설정되어 있었는데, sudo 자체에는 아무런 문제가 없었다.

 

ansible을 통해서 하면 모든 모듈이 실행이 안되었다.(raw 도 안됨)

현재로서는 template 을 꼭 remote_user 이름으로 해야하는지 아니면 group 이 아닌 계정명으로 /etc/sudoers에 포함 되어야 하는지 여부는 테스트를 하지 못하였지만 

 

확실한 건 become = True 상태 또는 become 을 사용하고자 한다면 /etc/sudoers.d/ 에 remote_user 의 내용이 있는 파일이 있어야함.

 

# cat /etc/sudoers.d/sandy

sandy ALL=(ALL) NOPASSWD: ALL

 

728x90

'IT > LINUX' 카테고리의 다른 글

[EX342] trouble shooting [selinux]  (0) 2020.12.24
[RHCA] 그냥 따고 싶어졌어.  (4) 2020.12.23
RHCE (ex294) ansible  (0) 2020.12.21
[Ansible] module user 의 password  (0) 2020.11.25
[Ansible] Inventory - host pattern  (0) 2020.06.12