我一直在阅读有关如何创建动态广告资源的ansible文档。根据我的理解,我必须提供一个能够输出host_vars和group_vars的json。
考虑到这一点,我将如何扩展group_vars和host_vars概念以包含 service 的定义?
从本质上讲,我的最终目标是"将有一些东西允许我定义:
主机A具有服务A B C,然后将转变为相应的主机和组变量。
最好的方法是什么? 我一直在考虑可能是一个数据库,但我不太确定如何正确地抽象服务概念。
提前感谢您提供任何帮助
答案 0 :(得分:3)
我不能给你所有的答案,我刚开始使用Ansible四周前。但是,我已经成功整合了动态库存。以下是我可以分享的内容:(根据您的设置推断,我在RHEL商店,使用6.9和7.4)
[labhosts] labhost-1 labhost-2
[本地主机] 127.0.0.1
/etc/ansible/ansible.cfg将允许您根据需要重新定位库存文件/目录。目前,我的评论将假设默认
上面的示例是静态广告资源。您可以将/ etc / ansible / hosts文件移到一边,然后执行:mkdir / etc / ansible / hosts /
将您的主机文件保存到/ etc / ansible / hosts / hosts好了,在动态目录中有静态库存文件(现在)所以很美,你仍然可以使用静态文件库存,它现在只存在于/ etc / ansible / etc /< - 目录中静态文件名没有什么特别之处。它可以是任何名称,但是某些字符作为静态文件名的一部分无效。
要使用动态库存,您现在只需要将/ etc / ansible / hosts /目录放入可从某些外部数据库中提取主机名的可执行脚本。 AND,这是KEY部分,该脚本的输出(stdout)必须以JSON格式输出。
在我的环境中,我们有一个perl脚本,并根据switch参数提取主机名列表。我们最近修改了perl脚本,使用print语句生成JSON输出。有一个JSON:perl模块,但是我们没有必要使用它,因为使用print格式化输出就足够了。至于群组名称,我们也建立了#34;来自perl脚本上的开关设置的组名。
因此,使用上面的INI库存示例,JSON输出将是这样的:{"服务器":["服务器-1","服务器-2&# 34;,]}
注1:我学到的一个怪癖,如果你只有一个主机,它必须以逗号结束。这是一个原因,我不确定我能解释清楚。当我们生成JSON输出时,无论主机数量多少,我们都会添加一个逗号,它就可以正常工作。
注意2:我意识到这不是真正的JSON输出,但它可以满足我们的需求。
在你的剧本中,你会把 - hosts:all或--host:your_group_name 我通常只是把 - hosts:all,然后限制使用-i选项和/或" - limit = hostname"
" -i",将您的广告资源缩小为静态或动态生成列表 --limit = hostname where" hostname"是-i输出的子集之一。
考虑以下命令:ansible all -m ping 这将ping整个广告资源中的所有主机。静态和动态
ansible all -m ping -i服务器 这将ping您服务器组中的所有主机
ansible all -m ping -i server --limit = server-1 这将只ping一个主机," server-1" 使用--limit =非常适合测试剧本或剧本
在转到剧本时,您可以在剧本中指定主列表。 然后,您只需要在命令行上根据需要添加限制。
祝你好运!