我可以为给定Ansible环境中的所有主机设置默认的host_vars文件吗?

时间:2019-02-05 19:43:53

标签: ansible

我有一个具有3个环境的项目。开发(担保),登台(云)和生产(云)。我希望我的剧本使用的所有环境变量都放在每个环境的一个文件中。如果每个环境中只有一台服务器,则如下所示:

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

通过这种方式,我的游民使用ansible_local自动应用剧本,而剧本则使用/my_proj/provisioner/host_vars/dev-vm.yml中的变量

可以使用ansible-playbook provisioner/playbook.yml -i provisioner/staging命令从Vagrant本身或任何其他使用Ansible的计算机中配置登台/生产。

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

例如,如果我的暂存清单有3台服务器[staging-webstaging-cli-01staging-cli-02],我不想有3个类似的文件,其中my_proj/provisioner/host_vars/为{ {1}},staging-web.ymlstaging-cli-01.yml。理想情况下,我只需要staging-cli-02.yml

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

1 个答案:

答案 0 :(得分:1)

这取决于。如果我正确理解了您的问题,并且您的要求与问题的编写方式相符(即,您仅需要在暂存和生产中使用组行为),则可以在group_vars和{下添加一个staging目录{1}},然后在其中放置production,将所有变量都移到该文件中。

使用all.yml指定清单文件时,将加载-i的内容,例如group_vars

您可以通过将主机放在清单中的组中并将host_vars替换为all.yml来进一步完善此方法。

但是请注意,如果您对流浪汉主机采用此技术(即,将<group_name>.yml目录放置在与剧本相同的目录中),则可能无法获得预期的结果。这是因为在剧本级别的group_vars的优先级高于在广告资源级别的group_vars。

有关更多信息,请参见Ansible Variables docs