关于ubuntu:Ansible:如何使用不同密码的主机运行游戏?

Ansible: how to run a play with hosts with different passwords?

我目前正在学习如何使用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的保险库、信用证或其他东西来加密这些敏感数据。


好吧,这里有两个问题:

如何使用不同的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的子目录中的所有文件都将获得源并应用到具有文件夹名称的组。


首先,这不是一个应负责的问题。您需要访问密钥才能连接到多个主机。

您可以在远程设备上创建ssh密钥并保存本地所有公钥。

永久添加ssh-config;

vim~/.ssh/配置

1
IdentitiyFile ~/.ssh/pub.key

如果您需要更多信息,可以在这里查看

现在,您可以访问所有主机无钥匙。享受!