在Ansible中,如何获取运行Ansible用户名称的变量?


80

我正在编写一个部署过程的脚本,该过程采用运行ansible脚本的用户的名称(例如tlau),并基于该用户名和当前日期/时间在远程系统上创建一个部署目录(例如tlau-deploy-2014-10) -15-16:52)。

您会认为这在很多事实中都是可用的(例如LOGNAME或SUDO_USER),但是这些都被设置为“ root”或用于ssh进入远程系统的部署ID。这些都不包含本地用户,即当前正在运行ansible进程的用户。

如何编写脚本以获取运行ansible进程的用户的名称并在我的剧本中使用它?

Answers:


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为确保在运行local_action
drs

1
在ansible 2.0中,该值为become: nobecome: false。但是,否则,一个很好的提示,谢谢!
拉蒙·德拉·丰特

有办法避免changed=1吗?另外,可以使用事实委托吗?
nponeccop

当然有,使用change_when: False docs.ansible.com/ansible/...
拉蒙·德拉富恩特

3
值得注意的是,change变量changed_when不是change_when。刚被这个咬住了。
abegosum

115

如果您gather_facts默认为Playbook启用了,则将设置一个内置变量,名为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解释的替代名称。
astorije 2015年

41
在运行ansible的localhost上查找用户的另一种方法是使用查找:{{lookup('env','USER')}} docs.ansible.com/ansible/playbooks_lookups.html
Budric

10
@Budric在我看来,这应该作为答案发布
030

14
但是{{ansible_user_id}},如果您become:yes
Stephen Ostermiller

5
在Ansible 2.8.3中,即使使用,ansible_user_id也似乎并没有成为root become: yes
大卫·奥利弗

50

我在所有模板中都添加了以下内容:

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

当模板化时,它显示为:

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

如果我使用{{ ansible_user_id }}并且已经成为root用户,则该变量表示“ root”,而不是我大多数时候想要的。


您还可以在剧本开始部分的var中添加此查找vars。像这样:```-主机:xxx collect_facts:no vars:用户:“ {{lookup('env','USER')}}”“`”
Bludwarf

您可以使用jinja2注释过滤器和文档docs.ansible.com/ansible/latest/…(搜索ansible_managed)中描述的ansible_managed变量
dtrv

2

这从远程系统读取用户名,因为不能保证本地和远程系统上的用户名相同。可以在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 }}"
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.