Ansible에서 권한 상승 기능 사용하기

시나리오

마이크로서비스의 Ansible 배포 스크립트를 작성하면서 일부 작업은 루트 권한이 필요하여 Ansible의 권한 상승 기능을 활용하게 되었습니다.

환경 구성

소프트웨어버전
Ansible2.9.4
Python2.7.5
CentOS7

개요

Ansible은 시스템에 내장된 루트 또는 다른 사용자 권한으로 작업을 수행하는 권한 상승 시스템을 이용합니다. 로그인한 원격 사용자와 다른 사용자가 되기를 원할 때 사용하는 기능으로 become이라고 부릅니다. 이 기능은 sudo, su, pfexec, doas, pbrun, dzdo, ksu, runas, machinectl 등 다양한 권한 상승 도구를 지원합니다.

파라미터 설명

become 설정은 플레이 또는 태스크 수준에서 제어할 수 있으며, 호스트별로 다를 수 있는 연결 변수로도 오버라이드가 가능합니다. 각 파라미터는 독립적으로 설정할 수 있습니다.

파라미터기본값설명필수 여부
become권한 상승 여부. 필요시 yes로 설정
become_userroot권한 상승 대상 사용자 지정아니오
become_methodsudo사용할 권한 상승 도구 선택아니오
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'

태그: Ansible privilege-escalation sudo DevOps automation

6월 11일 18:34에 게시됨