如何在每个主机上合并多个vars文件?

时间:2019-03-19 08:50:05

标签: ansible

我有一本针对多台服务器运行的剧本。所有服务器都需要指定sudo密码,该密码特定于运行该剧本的每个用户。运行剧本时,我不能使用--ask-become-pass,因为服务器上的sudo密码不同。这与another question about multiple sudo passwords中的情况相同。

一种可行的解决方案是在ansible_become_pass中指定host_vars

# host_vars/prod01.yml
ansible_become_pass: secret_prod01_password
domain: prod01.example.com
# host_vars/prod02.yml
ansible_become_pass: secret_prod02_password
domain: prod02.example.com

除了ansible_become_pass之外,每个主机还定义了其他变量。这些变量应提交给git仓库。但是,由于ansible_become_pass特定于运行该剧本的每个用户,因此我希望有一个单独的文件(最好是保险库文件),该文件指定每个主机的密码。

我想象以下情况:

# host_vars/prod01.yml: shared in git
domain: prod01.example.com
# host_vars/prod01_secret.yml: in .gitignore
ansible_become_pass: secret_prod01_password

我想象运行剧本时Ansible将两个文件合并。这在Ansible中可能吗?如果可以,怎么办?

2 个答案:

答案 0 :(得分:0)

您应该能够将 include_vars 任务与 inventory_hostname ansible_hostname 变量一起使用。例如:

\actuator\refresh

一个更好的解决方案是解决用户在不同主机上具有唯一密码的问题。

答案 1 :(得分:0)

您可以在清单文件中创建一个新组,也许是sudo-hosts。将所有sudo主机放入该组。然后在目录group_vars下创建一个具有该组名称的文件。在该文件中放入秘密的Yaml结构文本。

sudo_hosts:
  host1:
    password: xyz
    othersecret_stuff: abc
  host2:
    ...

然后使用ansbile-vault用一个密码对该文件加密。使用选项--ask-vault-pass调用该剧本 您可以通过

使用您的秘密

"{{ sudo_host['ansible_host'].password }}"