【问题标题】:Ansible: how to run a play with hosts with different passwords?Ansible:如何使用不同密码的主机运行游戏?
【发布时间】:2016-01-14 07:40:49
【问题描述】:

我目前正在学习如何使用 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

所以为了简单起见,我最初在所有机器上都有一个相当于sudo apt-get update && sudo apt-get upgrade 的剧本,但由于登录名/密码不同,我为每个主机创建了多个剧本。但现在我想把它弄干,并根据他们的文档查看角色。

现在我有这样的东西。 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

我知道我实际上可以在我的 hosts 文件中使用 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 访问权限,因此在播放过程中执行“预任务”步骤始终有效(我通过密钥访问连接,而不是通过密码连接)。我不担心安全,因为这是下一步。现在,我想把 group_vars 弄好……这是我遇到问题的sudo 升级。例如。 serv1 sudo 可能是 root/password1, serv3 sudo: deploy/password2, serv5: anotherdeploy/password3

【问题讨论】:

    标签: ubuntu ansible roles ansible-playbook


    【解决方案1】:

    好的,你有两个问题:

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

    【讨论】:

    • 好吧,无论如何我都会使用 Vault。目前,我在任何 group_vars 上都有一个 .gitignore,而我正在测试。但是,当我直接将ansible_become_user: deployansible_become_pass: passw0rd1 放入我的group_vars 并运行我的游戏时,它不起作用。相反,我收到此错误:msg: Failed to lock apt for exclusive operation 或此:failed: [testserv1] => {"failed": true, "parsed": false} BECOME-SUCCESS-zddkeemojwrlxnblahblahhalbikigqgpwd
    • 从您的输出中的BECOME-SUCCESS 消息看来,成为命令有效(它设法将运行任务的用户从您通过ssh 进入的用户切换到deploy 用户) ,但仍无权执行该任务。如果您以deploy 登录并尝试手动使用apt,是否有效?
    • 是的。 ansible_ssh_user 和 ansible_become_user 都已部署。 Deploy 具有 sudo 访问权限,是的,它确实可以手动工作。
    【解决方案2】:

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

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

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

    由于您的用户/密码组合似乎完全按组而不是按每个主机进行拆分,因此将凭据放入 group vars 是合乎逻辑的。

    作为nikobeliapointed out,您可能需要考虑使用Ansible's Vaultcredstash 或其他方式加密这些敏感数据。

    【讨论】:

    • 好的,如果我正确理解你(以及 ansible 的变量),在test/group_vars/new/some_file_with_a_passwd.yml 中,我会输入以下内容? ansible_sudo_pass=whateverThePasswordis 就这样? (再次,安全性除外。)
    • 如果您使用任何类型的源代码控制,或与任何人共享代码,请使用 Ansible Vault 加密这些凭据。
    【解决方案3】:

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

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

    永久添加 ssh 配置;

    vim ~/.ssh/config

    IdentitiyFile ~/.ssh/pub.key
    

    如果你需要更多关于 you can check here

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

    【讨论】:

    • 确实你不需要 Ansible 来解决这个问题,但是在你自己的 SSH 配置中解决它会使你的 Ansible 代码不可移植。对由一个组维护的任何代码都不利,如果您想从另一台服务器运行该剧本,则不利。
    • 嗨@nikobelia,当我写这篇文章时,你的答案是错误的。 ?!你为什么偷我的答案?这不道德。
    • 顺便说一句,在您的情况下,您需要所有本地服务器的 pem 密钥,没有任何变化。我认为我们可以编写一个任务来更改本地 ssh 配置一次。这取决于您的需求。
    • 不,伙计,看看时间戳 - 你在我之前回答了这个问题。我确实看到了您关于 SSH 访问的回答,并意识到 OP 也在询问该信息,因此我编辑了我的帖子以讨论管理 SSH 密钥的 Ansible 方式。
    猜你喜欢
    • 1970-01-01
    • 2021-12-01
    • 1970-01-01
    • 2022-01-25
    • 2014-01-06
    • 2016-10-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多