我希望能够更改剧本中的用户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”?
谢谢!
答案 0 :(得分:0)
当您使用become
和become_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。