如何相对于主机设置 Ansible 角色的变量文件?

How to set an Ansible role's variables file relative to the host?

这是我的剧本的详细信息:

剧本树

├─ devops
|  ├─ roles
|  |  ├─ mongodb
|  |  ├─ haproxy
|  |  ├─ monit
|  |  |  ├─ vars
|  |  |  |  └─ main.yml
|  |  |  └─ ...
|  |  └─ ...
|  ├─ hosts
|  ├─ play1.yml
|  └─ play2.yml

主机

[play1]
...instructions...

[play2]
...instructions...

play1.yml

---
- hosts: play1
  user: root
  roles:
    - haproxy
    - monit

play2.yml

---
- hosts: play2
  user: root
  roles:
    - mongodb
    - monit

问题

我想根据主机(play1.yml 或 play2.yml)为 monit 使用不同的变量文件。我该怎么做?

非常感谢

根据http://docs.ansible.com/playbooks_best_practices.html#directory-layout推荐布局如下:

production                # inventory file for production servers
stage                     # inventory file for stage environment

group_vars/
   group1                 # here we assign variables to particular groups
   group2                 # ""
host_vars/
   hostname1              # if systems need specific variables, put them here
   hostname2              # ""

library/                  # if any custom modules, put them here (optional)
filter_plugins/           # if any custom filter plugins, put them here (optional)

site.yml                  # master playbook
webservers.yml            # playbook for webserver tier
dbservers.yml             # playbook for dbserver tier

roles/
    common/               # this hierarchy represents a "role"
        tasks/            #
            main.yml      #  <-- tasks file can include smaller files if warranted
        handlers/         #
            main.yml      #  <-- handlers file
        templates/        #  <-- files for use with the template resource
            ntp.conf.j2   #  <------- templates end in .j2
        files/            #
            bar.txt       #  <-- files for use with the copy resource
            foo.sh        #  <-- script files for use with the script resource
        vars/             #
            main.yml      #  <-- variables associated with this role
        defaults/         #
            main.yml      #  <-- default lower priority variables for this role
        meta/             #
            main.yml      #  <-- role dependencies

    webtier/              # same kind of structure as "common" was above, done for the webtier role
    monitoring/           # ""
    fooapp/               # ""

注意 host_vars/ 目录。在那里,您可以包含您的角色稍后可以使用的特定于主机的变量。

A​​nsible 允许您将数据与代码分开。现在这个数据就是你以变量的形式定义的。

当涉及到变量时,当您在多个地方定义了相同的变量时,就会出现优先规则。建议是

  • 在 roles -> defaults/ 目录中提供默认变量。这就是它的用途。理智的默认值。

  • 覆盖其他地方的默认值,例如 host_vars。那就是你放置主机特定变量的地方。这就是你问题的答案。

  • 但是,如果您在 roles -> vars 目录中指定相同的 var,那将具有更高的优先级。所以要小心这个。

除此之外,还有一些优先规则。但是,ansible 的创建者建议只在一个地方定义变量。我个人不会遵循该规则,并且会使用合理的默认值和 hosts/group 特定的变量。

马洛,

你应该使用 "host_vars" 而不是 hosts_vars

 /host_vars/play1/mongodb.yml

此外,play1 应与您在主机清单中配置的主机名称相匹配。