首页 > 解决方案 > 我可以为给定 Ansible 环境中的所有主机设置默认的 host_vars 文件吗?

问题描述

我有一个有 3 个环境的项目。开发(Vangrant)、登台(云)和生产(云)。我希望我的剧本使用的所有环境变量都在每个环境的一个文件中。如果我每个环境有一台服务器,它工作正常,如下所示:

my_proj/
  src/
  provisioner/
    host_vars/
      dev-vm.yml
    staging/
      host_vars/
        staging-web.yml
      inventory
    prod/
      host_vars/
        prod-web.yml
      inventory
    playbook.yml
  Vagrantfile

这样我的 Vagrantansible_local用来自动应用剧本,剧本使用来自的变量/my_proj/provisioner/host_vars/dev-vm.yml

暂存/生产可以从 Vagrant 本身或任何其他具有 Ansible 的计算机使用命令进行配置ansible-playbook provisioner/playbook.yml -i provisioner/staging

我的问题是当我在暂存/生产库存文件中添加多个服务器时。我必须my_proj/provisioner/staging/host_vars/web-staging.yml为每个新服务器复制。有没有办法让每个环境都有一个“默认” env_vars 文件?

例如,如果我的暂存清单有 3 个服务器 [ staging-web, staging-cli-01, staging-cli-02],我不希望有 3 个类似的文件my_proj/provisioner/host_vars/staging-web.yml, staging-cli-01.yml, staging-cli-02.yml. 理想情况下我会my_proj/provisioner/host_vars/all.yml

关于如何完成它的任何想法或组织项目的更好方法的建议?

标签: ansible

解决方案


这取决于。如果我正确理解了您的问题,并且您的要求与您的问题的编写方式相匹配(即您只需要在登台和生产中的组行为),那么您可以在下面和里面添加一个group_vars目录,放置一个,移动所有变量到这个文件中。stagingproductionall.yml

当您使用-i指定您的库存文件时,将加载group_vars, like的内容。host_vars

您可以通过将主机放入清单中的组并替换all.yml<group_name>.yml.

但是请注意,如果您将这种技术用于您的 vagrant 主机(group_vars即将一个目录与您的 playbook 放在同一目录中),您可能不会得到您期望的结果。这是因为 playbook 级别的 group_vars 具有比库存级别更高的优先级。

有关更多信息,请参阅Ansible 变量文档


推荐阅读