ansible을 실행하는 사용자의 이름으로 변수를 얻으려면 어떻게해야합니까?


80

ansible 스크립트 (예 : tlau)를 실행하는 사용자의 이름을 사용하고 해당 사용자 이름과 현재 날짜 / 시간을 기반으로 원격 시스템에 배포 디렉터리를 만드는 배포 프로세스를 스크립팅하고 있습니다 (예 : tlau-deploy-2014-10 -15-16 : 52).

이것이 가능한 사실 (예 : LOGNAME 또는 SUDO_USER)에서 사용할 수 있다고 생각할 수 있지만 모두 "root"또는 원격 시스템에 ssh하는 데 사용되는 배포 ID로 설정됩니다. 여기에는 현재 ansible 프로세스를 실행중인 로컬 사용자가 포함되어 있지 않습니다.

ansible 프로세스를 실행하는 사용자의 이름을 가져 와서 내 플레이 북에서 사용하려면 어떻게 스크립트를 작성합니까?

답변:


71

호스트 시스템의 사용자 이름을 의미하는 경우 두 가지 옵션이 있습니다.

로컬 작업 (대상 시스템이 아닌 호스트 시스템에서 실행)을 실행할 수 있습니다.

- name: get the username running the deploy
  become: false
  local_action: command whoami
  register: username_on_the_host

- debug: var=username_on_the_host

이 예에서 whoami명령 의 출력은 "username_on_the_host"라는 변수에 등록되고 사용자 이름은에 포함됩니다 username_on_the_host.stdout.

(디버그 작업은 여기서 필요하지 않으며 변수의 내용 만 보여줍니다.)


두 번째 옵션은 "검색 플러그인"을 사용하는 것입니다.

{{ lookup('env', 'USER') }}

docs.ansible.com/ansible/playbooks_lookups.html에서 조회 플러그인에 대해 읽어보십시오.


1
sudo: no실행하기 전에 sudo를 시도하지 않도록 설정local_action
drs

1
ansible 2.0에서는 become: no또는 become: false. 그러나 그렇지 않으면 좋은 팁, 감사합니다!
Ramon de la Fuente

피할 방법이 changed=1있습니까? 또한 사실 위임을 사용할 수 있습니까?
nponeccop

물론 사용이 change_when: False ( docs.ansible.com/ansible/... )
라몬 데 라 푸 엔테

3
특히, 변화 변수는 changed_when하지 change_when. 이것에 의해 물었습니다.
abegosum 2017 년

116

당신이 경우 gather_facts, 플레이 북에 대해 기본적으로 활성화되어있는이 내장라고 세트되는 변수 ansible_user_id작업이로 실행되고 있음을 사용자 이름을 제공한다. 그런 다음 다른 작업 또는 템플릿에서이 변수를 사용할 수 있습니다.{{ ansible_user_id }} . 이렇게하면 해당 변수를 등록하기 위해 작업을 실행하는 단계를 절약 할 수 있습니다.

참조 : https://docs.ansible.com/ansible/latest/user_guide/playbooks_variables.html#variables-discovered-from-systems-facts


21
나중에 참조 할 수 remote_user있도록 호스트 시스템의 사용자가 아니라과 (와) 같은 관리 대상 시스템의 사용자 이름을 반환합니다 . 호스트 컴퓨터에서 사용자 이름을 얻으려면 local_action@Ramon이 설명한대로 a에 대한 대안이 없습니다 .
astorije

41
ansible을 실행하는 localhost에서 사용자를 조회하는 대안은 조회를 사용하는 것입니다. {{lookup ( 'env', 'USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric

10
@Budric 제 생각에 이것은 답변으로 게시되어야합니다
030

14
그러나 {{ansible_user_id}}당신이 경우 "루트"있는 끝become:yes
스티븐 Ostermiller

5
Ansible 2.8.3에서 ansible_user_id않습니다 하지 심지어와 루트 끝나게 것으로 보인다 become: yes.
David Oliver

51

모든 템플릿에 다음과 같은 내용을 넣었습니다.

# Placed here by {{ lookup('env','USER') }} using Ansible, {{ ansible_date_time.date }}.

템플릿을 사용하면 다음과 같이 표시됩니다.

# Placed here by staylorx using Ansible, 2017-01-11.

내가 사용 {{ ansible_user_id }}하고 내가 루트가 되었다면 그 변수는 내가 대부분의 시간을 원하는 것이 아니라 "루트"를 나타낸다.


vars섹션 의 플레이 북 시작 부분에있는 var에이 조회를 추가 할 수도 있습니다 . 다음과 같이 :```-hosts : xxx gather_facts : no vars : user : "{{lookup ( 'env', 'USER')}}"```
Bludwarf

docs.ansible.com/ansible/latest/… 문서에 설명 된 jinja2 주석 필터 및 ansible_managed 변수를 사용할 수 있습니다 ( ansible_managed 검색)
dtrv

3

로컬 및 원격 시스템의 사용자 이름이 동일하다는 보장이 없기 때문에 원격 시스템에서 사용자 이름을 읽습니다. SSH 구성에서 이름을 변경할 수 있습니다.

- name: Run whoami without become.
  command: whoami
  changed_when: false
  become: false
  register: whoami

- name: Set a fact with the user name.
  set_fact:
    login_user: "{{ whoami.stdout }}"

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.