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

时间:2015-02-25 10:05:45

标签: variables ansible roles ansible-playbook

以下是我的剧本的详细信息:

Playbook树

├─ 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使用不同的变量文件。我怎么能做到这一点?

非常感谢

3 个答案:

答案 0 :(得分:3)

根据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/目录。在那里,您可以包含您的角色稍后可以使用的特定于主机的变量。

答案 1 :(得分:2)

Malo,

你应该使用&#34; host_vars&#34;而不是hosts_vars

 /host_vars/play1/mongodb.yml

此外,play1应与您在主机广告资源中配置的主机名称相匹配。

答案 2 :(得分:0)

Ansible允许您将数据与代码分开。现在,这些数据是您以变量形式定义的。

当涉及到变量时,如果在多个位置定义了相同的变量,则会有优先规则可供使用。建议是

  • 在角色中提供默认变量 - &gt;默认值/目录。这就是它的用途。 Sane默认。

  • 从其他位置覆盖这些默认值,例如host_vars。多数民众赞成你将主机特定的变量。这就是你问题的答案。

  • 但是,如果您在角色中指定相同的var - &gt; vars目录,优先级更高。所以要小心这个。

除此之外,还有更多的优先规则。但是,ansible的创建者建议仅在一个地方定义变量。我个人不会遵循该规则,并将使用理智的默认值和主机/组特定的变量。