Ansible:如何 运行 玩不同密码的主机?

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

我目前正在学习如何使用 Ansible。现在,我有一堆服务器,包括新的和旧的,它们具有不同的登录名或密码或两者。所有人都可以访问 运行 剧本。

这是我的开头。示例 hosts 文件:

# 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

所以为了简单起见,我最初有一个 playbook 运行 相当于所有机器上的 sudo apt-get update && sudo apt-get upgrade,但由于 login/passwd 不同,我创建了多个 playbook对于每个主机。但现在我想把它擦干,并根据他们的文档查看角色。

现在我有这样的东西。 test/roles/common/tasks/main.yml 文件:

---
- name: run apt-get update
  apt: update_cache=yes
- name: run apt-get upgrade
  apt: upgrade=yes

site.yml 文件:

- name: apply common configuration to all nodes
  hosts: all

  roles:
  - common

我知道我实际上可以在我的主机文件中使用 ansible_ssh_user=root...=deploy 定义不同的登录名。或者将它们放在组变量中。但是我该如何处理不同的 sudo 密码呢? [legacy] 是 root,所以我不需要 sudo,但是 [new][different] 需要它,并且有不同的密码。我该怎么做呢?组变量?我是否创建这些:test/group_vars/new/some_file_with_a_passwd.yml 和 test/group_vars/different/some_other_passwd.yml(忽略安全问题)?

site.yml如何识别有不同密码的主机或没有密码的主机?

为清楚起见进行编辑:我有 SSH 访问权限,所以在播放过程中执行 'pre-tasks' 步骤总是有效(我通过密钥访问连接,从不通过密码连接)。我不担心安全问题,因为这是下一步。现在,我想把 group_vars 事情做好....这是我遇到的问题 sudo 升级。例如。 serv1 sudo 可能是 root/password1,serv3 sudo:deploy/password2,serv5:anotherdeploy/password3

通常情况下,当 运行 用户不使用 --ask-sudo-password 或其短别名 -K 后,您会希望在 Ansible 的密码提示后在命令行上传递 sudo 密码'有无密码的 sudo。这样做的好处是不会在任何地方记录在您的 Ansible 代码库中,也不会在源代码管理中结束。

但是,这是一个单一的提示,将应用于所有主机,因此并不真正适合您的用例。

ansibe_sudo_pass 变量可用于为任何特定主机的用户提供 sudo 密码。 应该 仅在需要 sudo 密码时使用,因此如果您将此变量提供给具有无密码 sudo 的主机,则应忽略它。

由于您的 user/password 组合似乎完全按组而不是每个主机拆分,因此将凭据放入 group vars.

合乎逻辑

作为 by nikobelia you may want to consider encrypting this sensitive data using something like Ansible's Vault, credstash 或其他。

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

您可以在遥控器上创建 ssh 密钥并保存本地所有 public 密钥。

永久添加它们的 ssh 配置;

vim~/.ssh/config

IdentitiyFile ~/.ssh/pub.key

如果您需要更多相关信息you can check here

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

好的,你有两个问题:

如何使用不同的SSH密钥连接到不同的主机?

为每组主机创建一个不同的 group_vars 文件,并在其中设置凭据。

# group_vars/legacy
---
ansible_ssh_user: myuser
ansible_ssh_key: ~/.ssh/legacy_key.pem

然后 Ansible 将根据每个主机所在的组应用不同的密钥,就这么简单。

如何为每个主机使用不同的凭证来提升权限?

再一次,将它们粘贴到每组主机的不同 group_vars 文件中:

# group_vars/legacy
---
ansible_become_user: root
ansible_become_pass: "{{ vaulted_legacy_password }}"

然后您可以使用关键字 become: yes 来提升权限,Ansible 将为每个组应用正确的凭据。如果您已经是 root,become 关键字将不会有任何效果。

然后...看到上面的 {{ vaulted_legacy_password }} 变量了吗?

最佳做法,也是唯一明智的做法,如果您曾经共享过此代码,那就是创建一个Ansible Vault 文件并在其中保存您的密码。 Ansible Vault 密码保护您的敏感变量并让您在 运行.

时解密它们

您可以将整个 group_vars/legacy 文件保存在保险库中(如果凭据是其中唯一的信息),或者创建一个 group_vars/legacy 文件夹,其中包含一个纯文本文件和一个加密文件. group_vars 的子目录中的所有文件都将被获取并应用于具有文件夹名称的组。