我有一种情况,其中需要覆盖默认的SSH ansible连接 . 我们使用Jenkins代理作为ansible master,我们在“JenkinsUser”(Jenkins)和“TargetUser1”(目标)之间设置了SSH,并且已在库存文件中定义
[dev:vars]
ansible_ssh_user=TargetUser1
现在,在同一个目标机器中,我有另一组由“TargetUser2”拥有的任务,而“TargetUser1”无法运行那些任务 . 但是,相同的“JenkinsUser”拥有“TargetUser2”的SUDO权限 . 我的剧本看起来像,
- hosts: dev
remote_user: JenkinsUser
become_method: sudo
become_user: TargetUser2
tasks:
- command: whoami
预期结果:JenkinsUser将SSH目标主机和sudo到TargetUser2,覆盖默认的SSH设置到TargetUser1 .
运行时结果:SSH连接发生在TargetUser1而不是JenkinsUser,而remote_user:JenkinsUser应该覆盖默认的ansible_ssh_user
Ansible-playbook -vvv输出:
TASK [setup]
<xyz.somehost.com> ESTABLISH CONNECTION FOR USER: TargetUser1 on PORT
22 TO xyz.somehost.com
3 回答
有两种类型的用户:
remote user - Ansible与此帐户 Build SSH连接
become user - Ansible 'becomes'此用户 after 已 Build SSH连接 .
在您的设置中,Ansible始终与
TargetUser1
连接,并且对于给定的播放尝试在使用TargetUser1
进行连接后变为TargetUser2
.从你的描述我明白你可以用
TargetUser1
连接到远程盒子,并可以与JenkinsUser
连接成为TargetUser2
.在这种情况下,您可以执行以下操作:
您可以为播放或特定任务设置
remote_user
和become_user
.你观察到的行为听起来很合乎逻
ansible_ssh_user
是连接的用户名,而became
方法仅在登录主机后使用 .您可以尝试一些想法:
为
TargetUser1
添加sudo
权利dev
成为TargetUser2
或在比赛期间
改变
ansible_ssh_user
(例如使用set_fact
)或为
TargetUser1@dev
和TargetUser2@dev
或创建单独的主机别名将
ansible_ssh_user
设为JenkinsUser
并使用become_user
TargetUser1
/TargetUser2
执行每项任务库存:
剧本:
命令:
Ansible只处理3个用户,本地,远程和成为 . become_user必须来自remote_user . 我的需要是
local_user
成为become_user
这是不可能的,因此我在额外的变量库中覆盖了库存中的默认ansible_ssh_user
. 现在,become_user
将被覆盖local_user