巨大的ansible库存文件的目录结构

时间:2015-07-27 12:43:49

标签: ansible ansible-playbook

我们的ansible库存文件日益变得越来越大。所以我们想用目录和文件模块化它。 比如说。

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

这可以转换成

|--production
|  |--WEBSERVERS
|  |  |--webservers
|  |--DBSERVERS
|  |  |--dbservers

网络服务器是文件;

[webservers]
foo.example.com
bar.example.com

dbservers 是一个文件;

[dbservers]
one.example.com
two.example.com
three.example.com

对于简单的库存文件,它工作正常。当我创建一组组时出现问题。

喜欢

[webservers]
foo.example.com
bar.example.com

[dbservers]
one.example.com
two.example.com
three.example.com

[master:children]
webservers
dbservers

我无法想象这个和它的目录结构。有人可以指导我到正确的教程。 感谢

1 个答案:

答案 0 :(得分:7)

Ansible支持“动态库存”,你可以在这里阅读更多相关信息:http://docs.ansible.com/ansible/developing_inventory.html

它是什么:

以特定格式生成JSON的简单脚本(python,ruby,shell等)。

我如何从中受益:

创建最能反映您需求的文件夹结构,并将服务器配置放在那里。然后创建一个简单的可执行文件来读取这些文件并输出结果。

实施例

inventory.py:

#!/usr/bin/python

import yaml
import json

web = yaml.load(open('web.yml', 'r'))

inventory = { '_meta': { 'hostvars': {} } }

# Individual server configuration
for server, properties in web['servers'].iteritems():
  inventory['_meta']['hostvars'][server] = {}
  inventory['_meta']['hostvars'][server]['ansible_ssh_host'] = properties['ip']

# Magic group for all servers
inventory['all'] = {}
inventory['all']['hosts'] = web['servers'].keys()

# Groups of servers
if 'groups' in web:
  for group, properties in web['groups'].iteritems():
    inventory[group] = {}
    inventory[group]['hosts'] = web['groups'][group]

print json.dumps(inventory, indent=2)
web.yml
---
servers:
  foo:
    ip: 192.168.42.10
  bar:
    ip: 192.168.42.20

groups:
  webservers:
  - foo
  dbservers:
  - bar

然后将您的剧本称为usuall,您将获得与使用标准ini文件相同的结果。