仅当在 Ansible 中定义时才使用变量

仅当在 Ansible 中定义时才使用变量

我和我的同事使用 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 等,具体取决于本地环境)。

相关内容