首页 文章

使用SUDO用户覆盖Ansible SSH登录用户

提问于
浏览
0

我有一种情况,其中需要覆盖默认的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 回答

  • 4

    有两种类型的用户:

    • remote user - Ansible与此帐户 Build SSH连接

    • become user - Ansible 'becomes'此用户 after 已 Build SSH连接 .

    在您的设置中,Ansible始终与 TargetUser1 连接,并且对于给定的播放尝试在使用 TargetUser1 进行连接后变为 TargetUser2 .

    从你的描述我明白你可以用 TargetUser1 连接到远程盒子,并可以与 JenkinsUser 连接成为 TargetUser2 .
    在这种情况下,您可以执行以下操作:

    - hosts: dev
      remote_user: JenkinsUser
      become: true
      become_method: sudo
      become_user: TargetUser2
    

    您可以为播放或特定任务设置 remote_userbecome_user .

  • 0

    你观察到的行为听起来很合乎逻 ansible_ssh_user 是连接的用户名,而 became 方法仅在登录主机后使用 .

    您可以尝试一些想法:

    • TargetUser1 添加 sudo 权利 dev 成为 TargetUser2
      在比赛期间

    • 改变 ansible_ssh_user (例如使用 set_fact )或

    • TargetUser1@devTargetUser2@dev 或创建单独的主机别名

    • ansible_ssh_user 设为 JenkinsUser 并使用 become_user TargetUser1 / TargetUser2 执行每项任务

  • 0

    库存:

    [dev:vars]
    ansible_ssh_user=TargetUser1
    

    剧本:

    - hosts: dev
      tasks:
        - command: whoami
    

    命令:

    ansible-playbook -i inventory playbook.yml -e "ansible_ssh_user=JenkinsUser   ansible_ssh_pass={{JenkinsUserPassword}}
    

    Ansible只处理3个用户,本地,远程和成为 . become_user必须来自remote_user . 我的需要是 local_user 成为 become_user 这是不可能的,因此我在额外的变量库中覆盖了库存中的默认 ansible_ssh_user . 现在, become_user 将被覆盖 local_user

相关问题