시나리오
마이크로서비스의 Ansible 배포 스크립트를 작성하면서 일부 작업은 루트 권한이 필요하여 Ansible의 권한 상승 기능을 활용하게 되었습니다.
환경 구성
| 소프트웨어 | 버전 |
|---|---|
| Ansible | 2.9.4 |
| Python | 2.7.5 |
| CentOS | 7 |
개요
Ansible은 시스템에 내장된 루트 또는 다른 사용자 권한으로 작업을 수행하는 권한 상승 시스템을 이용합니다. 로그인한 원격 사용자와 다른 사용자가 되기를 원할 때 사용하는 기능으로 become이라고 부릅니다. 이 기능은 sudo, su, pfexec, doas, pbrun, dzdo, ksu, runas, machinectl 등 다양한 권한 상승 도구를 지원합니다.
파라미터 설명
become 설정은 플레이 또는 태스크 수준에서 제어할 수 있으며, 호스트별로 다를 수 있는 연결 변수로도 오버라이드가 가능합니다. 각 파라미터는 독립적으로 설정할 수 있습니다.
| 파라미터 | 기본값 | 설명 | 필수 여부 |
|---|---|---|---|
| become | 권한 상승 여부. 필요시 yes로 설정 | 예 | |
| become_user | root | 권한 상승 대상 사용자 지정 | 아니오 |
| become_method | sudo | 사용할 권한 상승 도구 선택 | 아니오 |
| become_flags | 특정 플래그 추가 (Ansible 2.2 이상) | 아니오 |
사용 예제
공식 예제
# 관리 서비스 실행 (루트 권한 필요)
- name: HTTPD 서비스 시작 확인
service:
name: httpd
state: started
become: yes
# apache 사용자로 명령 실행
- name: apache 사용자로 명령 실행
command: somecommand
become: yes
become_user: apache
# nobody 사용자로 쉘 로그인 없이 실행
- name: nobody 사용자로 명령 실행
command: somecommand
become: yes
become_method: su
become_user: nobody
become_flags: '-s /bin/sh'
실제 적용 예제
- name: /etc/ld.so.conf 파일 수정
shell: sh -c 'echo -e "\n{{lboso_install_path}}" >> /etc/ld.so.conf'
become: yes
tags:
- micro_install_clean
문제 해결
1. become이 동작하지 않고 권한 오류 발생
비밀번호 설정이 누락되어 발생하는 문제로 다음 두 가지 방법으로 해결할 수 있습니다:
실행 스크립트에서 비밀번호 입력 설정
스크립트 실행 시 -K 옵션을 추가하여 비밀번호 입력을 강제합니다.
hosts 파일에서 호스트 정보 설정
[test_server]
10.13.4.[48:51] ansible_ssh_user="test" ansible_ssh_pass='111111' ansible_sudo_pass='111111' ansible_become_password='111111'
2. sudo echo 명령으로 파일 쓰기 실패
권한 문제로 인해 발생하며 다음 방법으로 해결:
방법 1: root 사용자 전환
방법 2: sh -c 명령 사용
sudo sh -c 'echo a >> permission_file'