我想充分利用ansible的变量优先级。
让我们来看看这个简化的项目:
├── group_vars
│ └── all
│ └── web
├── hosts
│ └── local
└── site.yml
广告资源文件hosts/local
:
[local_web]
192.168.1.20
[local_db]
192.168.1.20
[web:children]
local_web
[db:children]
local_db
group_vars/all
文件:
test: ALL
group_vars/web
文件:
test: WEB
site.yml
文件:
---
- name: Test
hosts: db
tasks:
- debug: var=test
好的,所以这只是为了测试变量优先级。当我在db
组中运行ansible时,test
变量应显示“ALL”,因为ansible只会查看group_vars/all
,对吧?
的错:
TASK: [debug var=test] ********************************************************
ok: [192.168.1.20] => {
"var": {
"test": "WEB"
}
}
实际上,如果local_web
和local_db
主机不同,则可行。
为什么当主机相同时,ansible仍会查看不相关的配置文件?这是一个错误还是只是我?
答案 0 :(得分:3)
您声明public class RecyclerViewItemDecoration extends RecyclerView.ItemDecoration {
private int space = 0;
private int item_count = 0;
private int ADDITIONAL_PADDING = 20;
public RecyclerViewItemDecoration(int space, int item_count) {
this.space = space;
this.item_count = item_count;
}
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
if(parent.getChildPosition(view) != item_count)
outRect.bottom = space;
// Add top margin only for the first item to avoid double space between items
if(parent.getChildPosition(view) == 0)
outRect.top = space + ADDITIONAL_PADDING;
if(parent.getChildPosition(view) == item_count)
outRect.bottom = space + ADDITIONAL_PADDING;
}
}
是所有4个已定义群组的成员,这与您在剧本中引用主机的方式无关。无论你如何在你的剧本中引用主持人,Ansible将评估主持人所在的所有群组,并根据这些群体导入变量。
这是一个方便的测试来证明这一点:
192.168.1.20
这个输出是:
- name: Test
hosts: db
tasks:
- debug: msg="{{ inventory_hostname }} is in group {{ item }}"
when: inventory_hostname in groups[item]
with_items: group_names
由于主机位于TASK: [debug msg="host is in group {{ item }}"] *******************************
ok: [192.168.1.20] => (item=db) => {
"item": "db",
"msg": "192.168.1.20 is in group db"
}
ok: [192.168.1.20] => (item=local_db) => {
"item": "local_db",
"msg": "192.168.1.20 is in group local_db"
}
ok: [192.168.1.20] => (item=local_web) => {
"item": "local_web",
"msg": "192.168.1.20 is in group local_web"
}
ok: [192.168.1.20] => (item=web) => {
"item": "web",
"msg": "192.168.1.20 is in group web"
}
组,因此包含了web
group_vars文件。
答案 1 :(得分:1)
@Bruce P回答是对的。
然而,这种安全行为对我来说并不令人满意,因为它根据主机改变了变量优先级。而不是group_vars
,我使用vars_files
字典。
我将group_vars
移到了名为vars
的目录中。
更新后的site.yml
:
---
- name: Test
hosts: db
tasks:
- debug: var=test
vars_files:
- vars/all
- vars/db
现在,test
显示“ALL”,正如我想的那样。它首先阅读vars/all
,然后是vars/db
(空的)。
(注意:变量优先级目前似乎有点buggy - v1.9.2 - 。这意味着如果你使用变量作为var文件名,ansible将不会按预期的顺序加载文件。)< / p>
答案 2 :(得分:0)
另一个可以在group_vars中保留变量的解决方案是用两个文件替换库存文件hosts / local:hosts / inv_db和hosts / inv_web,并使用-i选项指定要使用的库存文件。