Ansible动态库存服务理念

时间:2017-08-30 16:06:10

标签: ansible ansible-inventory

我一直在阅读有关如何创建动态广告资源的ansible文档。根据我的理解,我必须提供一个能够输出host_vars和group_vars的json。

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

从本质上讲,我的最终目标是"将有一些东西允许我定义:

主机A具有服务A B C,然后将转变为相应的主机和组变量。

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

提前感谢您提供任何帮助

1 个答案:

答案 0 :(得分:3)

我不能给你所有的答案,我刚开始使用Ansible四周前。但是,我已经成功整合了动态库存。以下是我可以分享的内容:(根据您的设置推断,我在RHEL商店,使用6.9和7.4)

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

    [本地主机] 127.0.0.1

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

    2. 没有变化
    3. 上面的示例是静态广告资源。您可以将/ etc / ansible / hosts文件移到一边,然后执行:mkdir / etc / ansible / hosts /

    4. 将您的主机文件保存到/ etc / ansible / hosts / hosts好了,在动态目录中有静态库存文件(现在)所以很美,你仍然可以使用静态文件库存,它现在只存在于/ etc / ansible / etc /< - 目录中静态文件名没有什么特别之处。它可以是任何名称,但是某些字符作为静态文件名的一部分无效。

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

    6. 当ansible查找您的库存文件时,它会"看到" / etc / ansible / hosts /是一个目录,然后查看脚本。当您运行游戏或剧本时,它将执行该脚本,并使用JSON输出作为您游戏的主机目标。
    7. 现在,我不是JSON专家,但这里对我有用。 JSON的语法是这样的:{&#34; GROUPNAME&#34;:[&#34; HOST1&#34;,&#34; HOST2&#34;,&#34; HOST3&#34;,]} < / LI>
    8. 因此整个字符串由左右花括号限定。第一个字段是引用的组名,用冒号分隔,然后用逗号分隔的引用主机列表,用左右方括号括起来。
    9. 在我的环境中,我们有一个perl脚本,并根据switch参数提取主机名列表。我们最近修改了perl脚本,使用print语句生成JSON输出。有一个JSON:perl模块,但是我们没有必要使用它,因为使用print格式化输出就足够了。至于群组名称,我们也建立了#34;来自perl脚本上的开关设置的组名。

      因此,使用上面的INI库存示例,JSON输出将是这样的:{&#34;服务器&#34;:[&#34;服务器-1&#34;,&#34;服务器-2&# 34;,]}

      注1:我学到的一个怪癖,如果你只有一个主机,它必须以逗号结束。这是一个原因,我不确定我能解释清楚。当我们生成JSON输出时,无论主机数量多少,我们都会添加一个逗号,它就可以正常工作。

      注意2:我意识到这不是真正的JSON输出,但它可以满足我们的需求。

      在你的剧本中,你会把 - hosts:all或--host:your_group_name 我通常只是把 - hosts:all,然后限制使用-i选项和/或&#34; - limit = hostname&#34;

      &#34; -i&#34;,将您的广告资源缩小为静态或动态生成列表 --limit = hostname where&#34; hostname&#34;是-i输出的子集之一。

      考虑以下命令:ansible all -m ping 这将ping整个广告资源中的所有主机。静态和动态

      ansible all -m ping -i服务器 这将ping您服务器组中的所有主机

      ansible all -m ping -i server --limit = server-1 这将只ping一个主机,&#34; server-1&#34; 使用--limit =非常适合测试剧本或剧本

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

      祝你好运!