如何更改userid并获取该用户的主目录?

时间:2017-07-02 01:18:10

标签: ansible

我希望能够更改剧本中的用户ID,然后在该用户ID的主机上获取主目录。我该怎么做?

我知道我可以使用'become:'和'become_user:'来更改用户ID,但这可以在任务级别工作。我可以使用'{{lookup('env','HOME)}}'变量获取主目录,但这似乎适用于playbook级别。这是我最近的尝试:

---
- hosts: all
  vars:
       user_id: "{{ userid }}"
  tasks:
  - set_fact:
        home_dir: "{{ lookup('env', 'HOME') }}"
    become: yes
    become_user: "{{ user_id }}"
  - debug:
        msg: "Variable values: user_id: {{ user_id }}  home_dir: {{ home_dir }}"

我的命令看起来像这样:

$ ansible-playbook myplaybook.yaml --limit MYHOSTS --extra-vars "userid=myid"

这是回复:

ok: [host-01] => {
    "msg": "Variable values: user_id: myid  home_dir: /root"
 }
ok: [host-02] => {
    "msg": "Variable values: user_id: myid  home_dir: /root"
}
ok: [host-03] => {
    "msg": "Variable values: user_id: myid home_dir: /root"
}

有没有办法可以将userid更改为“myid”并让playbook知道主目录是“/ home / myid”?

谢谢!

1 个答案:

答案 0 :(得分:0)

当您使用becomebecome_user时,您实际上是在告诉Ansible更改当前用户,而不是最初登录的用户。
根据{{​​3}}:

  

这些指令 (成为,成为_用户等)可以在播放到任务级别设置,但由连接变量覆盖,因为它们可以是特定于主机的。

您还必须注意,通过使用上述语法,您实际上是在激活权限提升方法,以成为非特权用户。这是相当危险的,有很多限制。请在此处阅读:Ansible Docs

我希望以下播放,会给你更清晰的画面:

---
- hosts: all
  gather_facts: no
  remote_user: "{{ userid }}"  

  tasks:
    - name: first_task
      register: first_task
      shell: "whoami"

    - name: become-root
      register: become-root
      shell: "whoami"
      become: yes
      become_user: root

    - name: final_task
      register: final_task
      shell: "whoami"

您应该通过执行以下命令来运行上述命令:

# ansible-playbook playbook.yaml -i /path/to/inventory/hosts -e "userid=myid"

它将返回:
first_task --> myid
become-root --> root
final_task --> myid
注意:您还可以 覆盖 remote_user,分别执行每项任务。

但是如果你仍然需要按照自己的方式去做,你可以尝试这个:

---
- hosts: all
  vars:
    user_id: "{{ userid }}"

  tasks:
    - set_fact:
         home_dir: "{{ lookup('env', 'HOME') }}"
      become: true

    - debug:
         msg: "Variable values: user_id: {{ userid }}  home_dir: {{ home_dir }}"
         when: userid is defined

使用此命令运行:

# ansible-playbook myplaybook.yaml -i path/to/inventory/hosts --limit MYHOSTS --become-user=myid --extra-vars "userid=myid"

最后,如果这些都不是你所追求的,请尝试使用command模块获取主目录,然后首先注册它,然后使用{{ registered_name.stdout_lines }}检索其输出:

- name: user_home
  register: user_home
  action: command eval echo "~{{ userid }}"

- debug:
     msg: "Home path is {{ user_home.stdout_lines }}

使用最后一种解决方法,您甚至不需要更改用户,因为它打印出用户userid的主目录。

# ansible-playbook myplaybook.yaml -i path/to/inventory/hosts --limit MYHOSTS -e "userid=myid"

希望它有所帮助;但之前曾问过这个问题。您可以在此处找到更多详细信息:Becoming an Unprivileged User