작업 또는 작업 세트별로 사용자를 전환하는 방법은 무엇입니까?


160

내 플레이 가능한 플레이 북에 반복되는 테마 sudo: yes는 특정 사용자를 위해 sudo 권한 ( ) 으로 명령을 실행해야한다는 것입니다. 이상적으로는 sudo를 사용하여 해당 사용자로 전환하고 명령을 정상적으로 실행하는 것이 좋습니다. 그런 다음 chowning 디렉토리와 같은 일반적인 사후 명령 정리를 수행하지 않아도됩니다. 다음은 내 플레이 북 중 하나의 스 니펫입니다.

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
- name: change perms
  file: dest={{ dst }} state=directory mode=0755 owner=some_user
  sudo: yes

이상적으로는 해당 사용자에게 sudo가 필요하더라도 명령 또는 명령 세트를 다른 사용자로 실행할 수 있습니다.

답변:


241

Ansible 1.9 이상

Ansible 사용 become, become_userbecome_method지침은 권한 상승을 달성했다. 전체 플레이 또는 플레이 북에 적용하거나 포함 된 플레이 북에서 설정하거나 특정 작업에 대해 설정할 수 있습니다.

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  become: yes
  become_user: some_user

become_with권한 에스컬레이션 수행 방법을 지정하는 데 사용할 수 있습니다 ( 기본값은) sudo.

지시문은 명령이 사용되는 블록의 범위에 적용됩니다 ( 예제 ).

몇 가지 추가 예는 호스트 및 사용자 를 참조 하고 자세한 문서는 (권한 에스컬레이션)이 됩니다.

작업 범위 becomebecome_user지시문 외에도 Ansible 1.9는 명시 적 지시문이없는 경우 재생 기간 동안 이러한 값을 설정하는 몇 가지 새로운 변수 및 명령 행 옵션을 추가했습니다.

Ansible 2.0.2.0부터는 아래에 설명 된 이전 sudo/ sudo_user구문이 여전히 작동하지만 사용 중단 알림에 "이 기능은 향후 릴리스에서 제거 될 것입니다."


이전 구문은 Ansible 1.9에서 더 이상 사용되지 않으며 제거 예정입니다.

- name: checkout repo
  git: repo=https://github.com/some/repo.git version=master dest={{ dst }}
  sudo: yes
  sudo_user: some_user

4
변수에서 sudo_user를 지정하려면 다음과 같이 변수 템플리트 주위에 따옴표를 사용하십시오. sudo_user: "{{ ansible_ssh_user }}"그렇지 않으면 yaml 구문 오류가 발생합니다.
Sumeet Pareek

잘 잡았습니다. OP의 문제 공식을 최대한 가깝게 맞추려고했지만 가변 보간을 사용하는 것이 가장 일반적인 선택이라는 데 동의합니다.
Brett

5
Ansible 1.9부터는 "sudo *"대신 become시스템 입니다.
AndiDog

2
"Bome"에 대한 1.9+ 구문이 맞습니다. 시스템 설정에 따라 "su"가 기본 "sudo"보다 나은 경우가 있기 때문에 "become_method"를 확인할 수도 있습니다.
ElementalStorm

New Ansible variables and command line options are added to set these values for the duration of a play. @Brett는 이것이 호스트에 연결하는 데 사용 된 some_user원래 사용자 remote_user가 아닌 이후의 후속 작업이 실행된다는 것을 의미 합니까?
JohnnyQ

43

Ansible 2.x에서는 다음 block작업 그룹에 사용할 수 있습니다 .

- block:
    - name: checkout repo
      git:
        repo: https://github.com/some/repo.git
        version: master
        dest: "{{ dst }}"
    - name: change perms
      file:
      dest: "{{ dst }}"
      state: directory
      mode: 0755
      owner: some_user
  become: yes
  become_user: some user

26

Ansible> 1.4에서는 실제로 작업 레벨에서 원격 사용자를 지정하여 해당 사용자로 로그인하고 sudo에 의존하지 않고 해당 명령을 실행할 수 있어야합니다. 해당 사용자로 로그인 할 수 없으면 sudo_user 솔루션도 작동합니다.

---
- hosts: webservers
  remote_user: root
  tasks:
    - name: test connection
      ping:
      remote_user: yourname

http://docs.ansible.com/playbooks_intro.html#hosts-and-users를 참조 하십시오.


이것은 sudo 권한이없는 상황에 가장 적합한 솔루션입니다
Darrel Holt


1

(있는 경우)에 become_method설정된 기본 방법을 재정의하도록 지정할 수 있으며이 ansible.cfg중 하나를 설정할 수 있습니다 sudo, su, pbrun, pfexec, doas, dzdo, ksu.

- name: I am confused
  command: 'whoami'
  become: true
  become_method: su
  become_user: some_user
  register: myidentity

- name: my secret identity
  debug:
    msg: '{{ myidentity.stdout }}'

표시해야합니다

TASK [my-task : my secret identity] ************************************************************
ok: [my_ansible_server] => {
    "msg": "some_user"
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.