我和我的同事使用 Ansible 来管理一组服务器。
我们使用本地主目录中的 .ansible.cfg 文件来设置本地环境并将我们的剧本保存在 git repo 中。
在对服务器进行身份验证时,我使用user1,他使用user2。我们95%的服务器都有这些帐户,但是由于历史原因,少数服务器只有一个“用户”帐户。
我们正在使用 host_vars 为所讨论的少数服务器设置 remote_user 变量。
但是,在我们的剧本中,我们通常使用“全部”来规定我们想要访问的服务器,并在命令行上使用 --limit 参数来精确指定哪些服务器应该获得更新。我们的服务器场遗留了一堆混搭、设计不良的服务器,这些服务器必须保持在线状态,直到几年后退役,我们发现这种方法最适合我们的需求。
我们的问题是我们的 remote_user 参数在我们的 .ansible.cfg 文件中设置,它作为环境变量而不是脚本变量公开。
这意味着如果我们的任务包含:
remote_user: "{{ remote_user }}"
它只对定义了该变量的主机有效
对于我们没有定义此变量的 95% 的主机,任务将失败。
有没有办法只使用已定义的变量?
例如
如果定义了 remote_user,则使用它,如果没有,则使用 .ansible.cfg 中设置的环境变量
注意:我知道我可以使用:
- name: Do something
remote_user: "{{ remote_user }}"
when: remote_user is defined
在任务定义中,但这仅适用于该任务,并且我不想更新所有任务
我真正需要的是让该条件在主机定义中可用,即:
---
- hosts: all
remote_user: "{{ remote_user }}"
when: remote_user is defined
但这在 Ansible 中是不合法的
答案1
像往常一样,我花了 2 个小时才在这里提出问题,最后在发布问题 5 分钟后就找到了答案!
这真的很简单。要为各个系统设置不同的 remote_user,而不必对现有剧本进行大量修改,只需将 var 添加到清单中的主机即可:
[web_servers]
server1 ansible_ssh_user=user
server2
在此实例中,任何时候播放包含 server1,都将使用“user”作为 ssh 用户。对于 server2,将使用 ansible.cfg 文件中 remote_user 的值(例如 user1、user2 等,具体取决于本地环境)。