如何相对于主机设置 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/
目录。在那里,您可以包含您的角色稍后可以使用的特定于主机的变量。
Ansible 允许您将数据与代码分开。现在这个数据就是你以变量的形式定义的。
当涉及到变量时,当您在多个地方定义了相同的变量时,就会出现优先规则。建议是
在 roles -> defaults/ 目录中提供默认变量。这就是它的用途。理智的默认值。
覆盖其他地方的默认值,例如 host_vars。那就是你放置主机特定变量的地方。这就是你问题的答案。
但是,如果您在 roles -> vars 目录中指定相同的 var,那将具有更高的优先级。所以要小心这个。
除此之外,还有一些优先规则。但是,ansible 的创建者建议只在一个地方定义变量。我个人不会遵循该规则,并且会使用合理的默认值和 hosts/group 特定的变量。
马洛,
你应该使用 "host_vars" 而不是 hosts_vars
/host_vars/play1/mongodb.yml
此外,play1
应与您在主机清单中配置的主机名称相匹配。
这是我的剧本的详细信息:
剧本树
├─ 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/
目录。在那里,您可以包含您的角色稍后可以使用的特定于主机的变量。
Ansible 允许您将数据与代码分开。现在这个数据就是你以变量的形式定义的。
当涉及到变量时,当您在多个地方定义了相同的变量时,就会出现优先规则。建议是
在 roles -> defaults/ 目录中提供默认变量。这就是它的用途。理智的默认值。
覆盖其他地方的默认值,例如 host_vars。那就是你放置主机特定变量的地方。这就是你问题的答案。
但是,如果您在 roles -> vars 目录中指定相同的 var,那将具有更高的优先级。所以要小心这个。
除此之外,还有一些优先规则。但是,ansible 的创建者建议只在一个地方定义变量。我个人不会遵循该规则,并且会使用合理的默认值和 hosts/group 特定的变量。
马洛,
你应该使用 "host_vars" 而不是 hosts_vars
/host_vars/play1/mongodb.yml
此外,play1
应与您在主机清单中配置的主机名称相匹配。