我是一个开发人员,想要使用ansible在VM中为各种项目创建开发设置(每个项目一个VM)。VM管理器命令用于从模板创建VM,该模板包含一个股票操作系统安装(通常是Linux),并添加了一个附加项:专门用于ansible的一个公共ssh密钥已经放置在VM根用户的.ssh/authorized_keys
文件中。然后使用全局vars来设置ssh配置:
ansible_user: root
ansible_private_key_file: keys/id_rsa_ansible
然后,我的ansible.cfg
包含一些ssh代理设置的条目:
[ssh_connection]
ssh_args = -o ForwardAgent=yes -o ControlMaster=auto -o ControlPersist=60s
通过这种设置,我可以启动ansible脚本来执行许多根任务,比如安装包&为一组devs创建用户帐户。
在VM主机上,我使用我的开发用户帐户登录,比如mike
。ssh代理设置还确保为用户mike
加载的所有ssh键也可以通过ssh连接在VM中使用。
现在,我想作为VM上的用户mike
(其帐户现在存在)执行更多特定于开发的任务。主要任务是检查项目代码,它需要mike
的ssh键。
使用become
使用sudo,它不转发ssh-键,因此这不是一个选项。我不想推私钥,因为它们需要在主机上。不再是私人的了。
下面是主机上的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会话?一种方法可能是为dev用户运行一个与ssh会话完全独立的剧本,但这似乎不符合ansible的精神。我希望以不同的ssh用户的身份运行整个块、任务或角色。
如果become
模块支持在代理中保留ssh-键的become_method
ssh
,就可以实现这一点。
发布于 2019-08-07 03:18:41
汤姆·š是完全正确的。设置ansible_user
似乎以某种方式切换了连接的ssh用户。这可能是通过一个ssh mike@localhost
完成的,而不需要重新建立剧本连接,但这是推测。
但是,必须以某些方式这样做:
- 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 }}"
common
角色也是以用户mike
的身份运行的)。- hosts: test-hosts
roles:
- common
- { role: user_test, vars: { ansible_user: mike }}
总之,前两个选项似乎是有效的!
如果ansible文档能够更清楚地说明更改ansible_user
在引擎盖下所做的事情,那就太好了,希望这对搜索人员有帮助。
https://stackoverflow.com/questions/57358878
复制相似问题