【问题标题】:Ansible - switch ssh user (retaining keys in agent)Ansible - 切换 ssh 用户(在代理中保留密钥)
【发布时间】:2019-08-05 12:45:01
【问题描述】:

我是一名开发人员,想使用 ansible 在 VM 中为各种项目创建开发设置(每个项目一个 VM)。虚拟机管理器命令用于从模板创建虚拟机,该模板包含一个股票操作系统安装(通常是 Linux),并添加一个:专门用于 ansible 的公共 ssh 密钥已放置在虚拟机根用户的 .ssh/authorized_keys 文件中.然后使用全局变量来设置 ssh 配置:

ansible_user: root 
ansible_private_key_file: keys/id_rsa_ansible

然后我的ansible.cfg 包含一些用于 ssh-agent 设置的条目:

[ssh_connection]
ssh_args = -o ForwardAgent=yes -o ControlMaster=auto -o ControlPersist=60s

通过此设置,我可以启动 ansible 脚本来执行一些根任务,例如安装包和为一组开发人员创建用户帐户。

在 VM 主机上,我使用我的开发用户帐户登录,例如 mike。 ssh-agent 设置还确保为用户 mike 加载的所有 ssh-keys 也可通过 ssh 连接在 VM 中使用。

我现在想在 VM 上以用户 mike 的身份执行更多特定于开发的任务(其帐户现已存在)。主要任务是检查需要mikes ssh-key 的项目代码。

使用become 使用sudo,它不会转发ssh-keys,所以这不是一个选项。我不想到处推送私钥,因为它们需要在主机上......并且不再是私有的。

以下现在确定主机上的 devs 用户名并在 ssh 命令中使用它来实现结帐。这很好地限制了对 dev 用户密钥工作的项目的访问,而无需进一步配置。

- name: get the devs username running the deploy
  become: false
  local_action: command whoami
  register: username_on_the_host

- name: Test checkout
  command: ssh -o StrictHostKeyChecking=no -o ForwardAgent=yes {{ username_on_the_host.stdout }}@localhost "mkdir hg && cd hg && hg clone ssh://hg//hg/my_project"

它有效,但它不是一个特别干净的解决方案。

那么,最后来个问题:有没有更简洁的方式来切换 ssh-session?一种方法可能是为开发用户运行带有 ssh 会话的完全独立的剧本——但这似乎不符合 ansible 的精神。我想以不同的 ssh 用户身份运行整个块、任务或角色。

如果become 模块支持become_method ssh 这将在代理中保留ssh 密钥,则可以实现这一点。

【问题讨论】:

  • 认为你应该可以在剧本中设置ansible_user。因此,您将拥有一个文件,其中包含两个剧本,每个剧本定义一个不同的 ansible_user

标签: ssh ansible


【解决方案1】:

Tomáš 完全正确。似乎设置 ansible_user 以某种方式切换 ssh 用户进行连接。可能是通过ssh mike@localhost 完成的,无需重新建立 playbook 连接,但这是推测。

但是必须以某些方式完成:

  • 在剧本中,我们可以按照建议重复主机部分:
- hosts: test-hosts
  roles:
     - common

- hosts: test-hosts
  vars:
    ansible_user: mike
  roles:
     - user_test
  • 在角色任务中,我们可以使用set_fact(示例显示首先获取部署用户):
- name: get user running the deploy
  local_action: command whoami
  register: deploy_user

- name: switch to deploy user
  set_fact:
    ansible_user: "{{ deploy_user.stdout }}"
  • 但是在剧本中这样做是行不通的 - 不幸的是,它似乎在第一个角色执行之前将 var 设置为全局覆盖默认设置,即这里 common 角色也以用户 mike 运行
- hosts: test-hosts
  roles:
     - common
     - { role: user_test, vars: { ansible_user: mike }}

总之,前两个选项似乎有效!

如果 ansible 文档能更清楚地说明更改 ansible_user 到底做了什么,那就太好了,希望这对那些搜索的人有用...

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 1970-01-01
    • 1970-01-01
    • 2013-06-08
    • 2021-10-20
    • 1970-01-01
    • 2017-03-21
    相关资源
    最近更新 更多