我目前正在学习如何使用Ansible。现在,我有很多新的和旧的服务器,它们有不同的登录名或密码,或者两者都有。所有人都可以通过密钥访问来运行播放。
这就是我的出发点。主机文件示例:
1 2 3 4 5 6 7 8 9 10 11 12
| # legacy and new have different logins (like root and deploy)
[legacy]
serv1
serv2
[new]
serv3
serv4
# different has a different login and password altogether
[different]
serv5 |
为了简单起见,我最初在所有的机器上运行了一个相当于sudo apt-get update && sudo apt-get upgrade的Playbook,但是由于登录/密码不同,我为每个主机创建了多个Playbook。但现在我想把它擦干,并根据他们的文档来寻找角色。
现在我有类似的东西。test/roles/common/tasks/main.yml文件:
1 2 3 4 5
| ---
- name: run apt-get update
apt: update_cache=yes
- name: run apt-get upgrade
apt: upgrade=yes |
site.yml文件:
1 2 3 4 5
| - name: apply common configuration to all nodes
hosts: all
roles:
- common |
我知道我可以使用主机文件中的ansible_ssh_user=root或...=deploy定义不同的登录。或者把它们放在组变量中。但是我该怎么处理不同的sudo密码呢?[legacy]是根目录,所以我不需要sudo,但是[new]和[different]需要它,并且密码不同。我该怎么做?VAR组?我是否创建以下文件:test/group_vars/new/some_file_a passwd.yml和test/group_vars/different/some_other_passwd.yml(忽略安全问题)?
site.yml如何识别具有不同密码的主机或某些没有密码的主机?
为了清晰起见,请编辑:我有ssh访问权,所以在播放过程中执行"预任务"步骤始终有效(我通过密钥访问进行连接,而不是通过密码进行连接)。我不担心安全,因为这是下一步。现在,我想把集团的事情弄对……这是我有问题的sudo升级。例如,serv1 sudo可以是root/password1,serv3 sudo:deploy/password2,serv5:anotherdeploy/password3
通常,当与没有无密码sudo的用户一起运行时,在使用--ask-sudo-password或其短别名-K之后,在ansible的密码提示后,您希望在命令行上传递sudo密码。这样做的好处是,在任何地方都不会被记录到可应答的代码库中,然后也不会以源代码管理结束。
但是,这只是一个提示,将应用于所有主机,因此并不真正适合您的用例。
ansibe_sudo_pass变量可用于为任何特定主机的用户提供sudo密码。这只应在需要sudo密码时使用,因此如果您将此变量提供给具有无密码sudo的主机,则应忽略它。
由于您的用户/密码组合似乎完全由组分割,而不是由每个主机分割,因此将凭证放入组变量是合乎逻辑的。
正如Nikobelia所指出的,您可能需要考虑使用Ansible的保险库、信用证或其他东西来加密这些敏感数据。
- 好吧,如果我能正确理解你(和ansible的变量),在test/group_vars/new/some_file_with_a_passwd.yml中,我会放以下内容?以东十一〔一〕就是这样吗?(再说一遍,安全问题除外。)
- 如果您使用任何类型的源代码管理,或与任何人共享代码,请使用Ansible保管库加密这些凭证。
好吧,这里有两个问题:
如何使用不同的ssh密钥连接到不同的主机?
为每一组主机创建不同的组变量文件,并在其中设置凭据。
1 2 3 4
| # group_vars/legacy
---
ansible_ssh_user: myuser
ansible_ssh_key: ~/.ssh/legacy_key.pem |
然后Ansible将根据每个主机所在的组应用不同的键,就像这样简单。
如何使用每个主机的不同凭据来提升权限?
再次,将它们粘贴到每组主机的不同组变量文件中:
1 2 3 4
| # group_vars/legacy
---
ansible_become_user: root
ansible_become_pass:"{{ vaulted_legacy_password }}" |
然后您可以使用关键字become: yes来升级权限,ansible将为每个组应用正确的凭据。如果您已经是根用户,那么become关键字就不会有任何效果。
然后。。。看到上面的{{ vaulted_legacy_password }}变量了吗?
最佳实践,也是唯一明智的做法,如果你曾经共享这段代码,是做一个易懂的保管库文件,并把你的密码保存在里面。Ansible保管库密码保护您的敏感变量,并允许您在运行时对其进行解密。
您可以将整个group_vars/legacy文件作为保险库(如果凭证是其中唯一的信息),或者创建一个组vars/legacy文件夹,其中包含一个纯文本文件和一个加密文件。组vars的子目录中的所有文件都将获得源并应用到具有文件夹名称的组。
- 好吧,不管怎样,我要用保险库。在我测试的时候,我对任何组变量都有一个.gitignore。但是,当我直接把ansible_become_user: deploy和ansible_become_pass: passw0rd1放进我的小组里,并运行我的游戏时,它不起作用。我得到的不是这个错误:msg: Failed to lock apt for exclusive operation就是这个错误:failed: [testserv1] => {"failed": true,"parsed": false} BECOME-SUCCESS-zddkeemojwrlxnblahblahhalbikigqgpwd。
- 从输出中的BECOME-SUCCESS消息来看,它看起来像是becomcommand-works(它设法将运行任务的用户从ssh所在的用户切换到deploy用户),但仍然没有执行该任务的权限。如果您以deploy的身份登录并尝试手动使用apt,它是否工作?
- 是啊。Ansible_ssh_用户和Ansible_成为_用户都是部署的。Deploy具有sudo访问权限,是的,它可以手动工作。
首先,这不是一个应负责的问题。您需要访问密钥才能连接到多个主机。
您可以在远程设备上创建ssh密钥并保存本地所有公钥。
永久添加ssh-config;
vim~/.ssh/配置
1
| IdentitiyFile ~/.ssh/pub.key |
如果您需要更多信息,可以在这里查看
现在,您可以访问所有主机无钥匙。享受!
- 确实,您不需要Ansible来解决这个问题,但是在您自己的ssh配置中解决它会使您的Ansible代码不可移植。对于一个组维护的任何代码都是有害的,如果您想从另一个服务器运行该剧本,也是有害的。
- 嗨@nikobelia我写这封信的时候你的回答是错的。?!你为什么偷了我的答案?这不是伦理。
- 顺便说一句,在你的情况下,你需要PEM密钥你所有的本地服务器没有任何变化。我认为我们可以编写一个任务来更改本地ssh配置一次。这取决于你的需要。
- 不,伙计,看看时间戳-你在我面前回答了这个问题。我确实看到了你关于ssh访问的答案,并且意识到操作系统也在请求这些信息,所以我编辑了我的文章来讨论管理ssh密钥的可靠方法。