2016-11-15 94 views
1

的Ansible最佳实践文档recommends分离库存:如何在Ansible中的不同库存之间共享group_vars?

 
inventories/ 
    production/ 
     hosts.ini   # inventory file for production servers 
     group_vars/ 
     group1   # here we assign variables to particular groups 
     group2   # "" 
     host_vars/ 
     hostname1  # if systems need specific variables, put them here 
     hostname2  # "" 

    staging/ 
     hosts.ini   # inventory file for staging environment 
     group_vars/ 
     group1   # here we assign variables to particular groups 
     group2   # "" 
     host_vars/ 
     stagehost1  # if systems need specific variables, put them here 
     stagehost2  # "" 

我的分期和生产环境都以同样的方式构成。我在两种环境中都有相同的组。事实证明,我也有相同的group_vars相同的组。这意味着我想消除冗余。

有没有办法在不同库存之间共享一些group_vars?

作为一种变通我开始把共享group_vars进入角色。

my_var: 
    my_group: 
    - { var1: 1, var2: 2 } 

这使得有可能通过交叉主机的组与定义的VAR遍历一些增值经销商:

with_items: "{{group_names | intersect(my_var.keys())}}" 

但是,这是一个有点复杂理解,我觉得角色不应该知道任何关于团体的事

我想单独大部分库存,但分享一些group_vars在一个易于理解的方式。是否有可能将全局group_vars与库存特定的group_vars合并?

回答

0

我抓住了这个想法,按照Ansible的建议。现在一年后,我确信Ansible的建议对我的要求没有用处。相反,我认为尽可能在不同阶段分享是很重要的。

现在我把所有库存在同一目录:

production.ini 
reference.ini 

我照顾每个库存定义了一组包括与舞台的名称的所有主机。

文件production.ini有组production

[production:children] 
all_production_hosts 

和文件reference.ini有组reference

[reference:children] 
all_reference_hosts 

我只有一个group_vars目录中,我定义了一个文件,每分期组:

group_vars/production.yml 
group_vars/reference.yml 

并且每个文件定义一个stage变量。该文件production.yml定义是:

--- 
stage: production 

和文件reference.yml定义:

--- 
stage: reference 

这使得可以分享一切生产和基准之间别人。但主持人完全不同。通过使用正确的库存在PlayBook上运行无论是在生产或引用主机:

ansible-playbook -i production.ini site.yml 
ansible-playbook -i reference.ini site.yml 

如果有必要的site.yml或角色,表现在生产和参考环境略有不同,他们可以通过使用条件stage变量。但我尽量避免这种情况。因为最好将所有差异移入分段文件production.ymlreference.yml中的等效定义。

例如,如果group_vars/all.yml定义了一些用户:

users: 
    - alice 
    - bob 
    - mallory 

我想创建这两个环境中的用户,但我想从生产环境中排除mallory,我可以定义一个名为新组effective_users。在reference.yml它等同于users列表:

effective_users: >- 
    {{ users }} 

但在production.yml我可以排除mallory

effective_users: >- 
    {{ users | difference(['mallory']) }} 

的剧本或角色,也不需要在两个阶段之间的区别,他们可以简单地使用组effective_users。该组仅通过选择清单自动包含用户的正确清单。

2

您可以将group_vars在剧本目录中。 More info

Ansible将为他们提供所有库存。

+0

但这只适用于剧本。即席命令将失败。有没有办法自定义ad-hoc命令执行,以便读取全局group_vars? – ceving

+0

另一个问题似乎是,如果我想从不同的组收集变量,我必须设置'hash_behaviour = merge'。以及哈希中的数组值如何? – ceving

+0

这不适用于ad-hoc。列表不能自动合并,你必须使用一些手动任务。 –

2

简单的选项,在这里(我们做什么)仅仅是符号链接通用组围绕瓦尔文件。

例如,我们可能有这样的事情NGINX该角色通用的角色,然后几个具体的使用情况。在这种情况下,我们创建一个组变量文件,该文件为每个具体用例使用NGINX角色,然后将这些组变量文件简单地链接到适当的文件夹中。然后

我们的项目文件夹结构可能是这个样子(彻底简化):

. 
├── inventories 
│   ├── bar-dev 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── dev.yml -> ../../shared/dev.yml 
│   │   └── inventory 
│   ├── bar-prod 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── prod.yml -> ../../shared/prod.yml 
│   │   └── inventory 
│   ├── bar-test 
│   │   ├── group_vars 
│   │   │   ├── bar.yml -> ../../shared/bar.yml 
│   │   │   └── test.yml -> ../../shared/test.yml 
│   │   └── inventory 
│   ├── foo-dev 
│   │   ├── group_vars 
│   │   │   ├── dev.yml -> ../../shared/dev.yml 
│   │   │   └── foo.yml -> ../../shared/foo.yml 
│   │   └── inventory 
│   ├── foo-prod 
│   │   ├── group_vars 
│   │   │   ├── foo.yml -> ../../shared/foo.yml 
│   │   │   └── prod.yml -> ../../shared/prod.yml 
│   │   └── inventory 
│   ├── foo-test 
│   │   ├── group_vars 
│   │   │   ├── foo.yml -> ../../shared/foo.yml 
│   │   │   └── test.yml -> ../../shared/test.yml 
│   │   └── inventory 
│   └── shared 
│    ├── bar.yml 
│    ├── dev.yml 
│    ├── foo.yml 
│    ├── prod.yml 
│    └── test.yml 
└── roles 
    └── nginx 
     ├── defaults 
     │   └── main.yml 
     ├── meta 
     │   └── main.yml 
     ├── tasks 
     │   └── main.yml 
     └── templates 
      └── main.yml 

现在我们的库存文件可以让主机使用这些共享组瓦尔简单地通过将主机中正确的组。

+1

很高兴看到,我不是唯一有这个问题的人。 – ceving

+0

顺便说一句:我必须使用Fossil SCM,Fossil的默认是遵循符号链接。这样做是为了通过生成Unix问题来避免Windows问题。化石家伙可能认为Unix问题比Windows问题更容易解决。所以我不确定符号链接是否适合我。 – ceving

相关问题