2017-08-30 52 views
1

我一直在阅读关于如何创建动态库存的安全文档。据我所知,我必须提供一个能够输出host_vars和group_vars的json。Ansible动态库存服务概念

考虑到这一点,我将如何去扩展group_vars和host_vars概念以包含服务的定义?

从本质上说,我的“最终目标”是有东西,让我来定义:

主机A的服务A B C,那么这将变成相应的主机和组瓦尔。

什么是接近最好的方法? 我一直在想可能是一个数据库,但我不太确定如何适当地抽象服务概念。

预先感谢任何帮助

回答

3

我不能给你所有的答案,我刚开始使用Ansible四个星期前。不过,我已经成功整合了动态库存。这是我可以分享:(推断为您的设置,我在RHEL店,使用6.9和7.4)

  1. 默认情况下,ansible查找您的库存在的/ etc/ansible/hosts中找到的文件该文件的默认格式是(我相信)INI格式。 [服务器] 服务器-1 服务器2

[labhosts] labhost-1 labhost-2

[本地主机] 127.0.0.1

  1. 的/ etc/ansible/ansible.cfg将允许您根据需要重新定位库存文件/目录。目前,我的意见将假设没有默认的变化

  2. 上面的例子是静态库存。你可以将你的/ etc/ansible/hosts文件放到一边,然后执行:mkdir/etc/ansible/hosts/012/////ansible/hosts/hosts可以将静态库存文件在您的动态目录(现在)因此,美是,你仍然可以使用静态库存,它只是住在/ etc/ansible/etc/< - 目录没有什么特别的静态文件名。它可以是任何名称,但是某些字符作为静态文件名称的一部分无效。

  3. 要使用动态库存,您现在只需将放入/ etc/ansible/hosts /目录中的可执行脚本从您的外部数据库中提取主机名即可。 AND,这是关键部分,该脚本的输出(stdout)必须以JSON格式输出。

  4. 当你找到你的库存文件时,它会“看到”/ etc/ansible/hosts /是一个目录,然后在那里寻找脚本。当您运行剧本或剧本时,它将执行脚本,并使用JSON输出作为您的播放的主机目标。
  5. 现在,我不是JSON专家,但是这对我有用。JSON的语法如下所示:{“GROUPNAME”:[“HOST1”,“HOST2”,“HOST3”,]}
  6. 所以整个字符串由左右花括号括起来。第一个字段是带引号的groupname,用冒号分隔,然后是逗号分隔的引用主机列表,由左右方括号界定。

在我的环境中,我们有一个perl脚本,并根据切换参数提取主机名列表。我们最近修改了perl脚本,使用print语句生成JSON输出。有一个JSON:perl模块,但我们没有发现它需要使用,因为使用print来格式化输出已经足够了。至于组名,我们还从perl脚本的开关设置中“建立”了组名。

因此,使用上述我的INI库存例如,JSON输出将是这样的:{“服务器”:[“服务器1”,“服务器2”,]}

注1:一个怪癖,我了解到,如果您只有一台主机,则必须以逗号结尾。有一个原因,我不确定我能解释它。当我们生成我们的JSON输出时,无论主机的数量如何,我们都会添加一个逗号,并且它正常工作。注意2:我意识到这不是真正的JSON输出,但它正在满足我们的需求。

在你的剧本,你会放 - 主机:全部或 - 主机:your_group_name 我通常只是把 - 主机:所有的,然后使用限制-i选项和/或“--limit =主机名”

“-i”将您的清单缩小到静态或动态生成列表 --limit = hostname其中“hostname”是-i输出的子集之一。

请考虑以下命令:ansible all -m ping 这将ping您整个清单中的所有主机。静态和动态

ansible所有-m平-i服务器 这将ping通的所有主机在您的服务器组

ansible所有-m平-i服务器--limit =服务器1 这将只是ping通一台主机“server-1” 使用--limit =非常适合用于测试播放或剧本

当转到剧本时,您可以在剧本中指定主机列表。 然后你只需要在命令行中根据需要添加限制。

祝你好运!