Ansible - 当主机相同时,变量优先级失败

时间:2015-07-02 14:20:13

标签: ansible

我想充分利用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_weblocal_db主机不同,则可行。

为什么当主机相同时,ansible仍会查看不相关的配置文件?这是一个错误还是只是我?

3 个答案:

答案 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选项指定要使用的库存文件。