我尝试以与运行剧本的用户不同的用户身份运行特定的 Ansible 任务。我的.yml
文件如下所示:
---
- hosts: staging_servers
tasks:
- name: check user
remote_user: someusername
shell: whoami
运行此任务向我显示该命令返回与我在任务中定义不同的用户(准确地说,返回在名为的文件whoami
中定义的用户)。hosts
ubuntu
我也尝试过定义这样的任务:
---
- hosts: staging_servers
tasks:
- name: check user
sudo: yes
sudo_user: someusername
shell: whoami
但是然后我收到“ ”错误,尽管文件Missing sudo password
中有一行写着在远程机器上发出命令不会要求我输入密码。sudoers
someusername ALL=(ALL) NOPASSWD:ALL
sudo
someusername
hosts
那么,我如何才能以文件中定义的用户或他自己以外的其他用户身份运行特定任务root
?
答案1
您误解了这两个设置:
远程用户是一个 Ansible 设置,用于控制 Ansible 用于连接的 SSH 用户:
ssh ${REMOTE_USER}@remotehost
某些用户名 ALL=(全部) NOPASSWD:ALL是一个 sudo 配置,允许用户
someusername
无需密码即可在任何主机上执行所有命令。它不允许任何人发出命令someusername
。
理想情况下,你会以正确用户身份直接登录这就是remote_user
全部内容。但通常您只能以管理员用户身份登录(例如ubuntu
),并且必须以其他用户身份(例如scrapy
)执行 sudo 命令。然后您应该留给remote_user
登录的用户,并将以下 ansible 属性添加到作业中:
- name: log in as ubuntu and do something as scrapy
remote_user: ubuntu
sudo: true
sudo_user: scrapy
shell: do-something.sh
答案2
请注意,在 Ansible 1.9 之后,该sudo
措辞被替换为become
,因此
sudo: yes
sudo_user: some_user
变成(双关语):
become: yes
become_user: some_user
更多具体信息请见此处:https://stackoverflow.com/a/22749788/402727
也写这个前您想要执行的实际模块(例如command
或shell
)才能使其生效。至少根据我的经验,如果我在模块后面写入become
和 ,它就无法正常工作。become_user
shell
- name: Example user change
become: true
become_user: '{{ user }}'
shell: |
...
答案3
作为前书呆子指出你已经使用become
模块。此外,为了准确获得 OP 想要的内容,请使用su
作为 become 方法:
- name: check user
become: yes
become_user: someusername
become_method: su
become_flags: '--login'
shell: whoami
become_flags: '--login'
确保您像手动登录一样登录,例如加载.profile
等。
如果你还没有定义成为密码对于登录主机的用户,您可以通过以下方式在任务级别执行此操作vars
:
- name: check user
become: yes
become_user: someusername
become_method: su
become_flags: '--login'
vars:
ansible_become_pass: <Password of 'ubuntu' in OP's case>
shell: whoami
如果您使用一个用户(具有权限)登录到主机sudo
并想要以另一个用户(可能没有密码)的身份执行某些操作,请在上面添加以下行:
become_exe: 'sudo -p "Password: " su -'