第一次创建Ansible库存时,我创建了按角色大致分开的单独文件,但位于一个目录中。因此,我的目录结构如下所示(由角色组成):
ansible\
inventory\
dbservers
logservers
webservers
host_vars\
roles\
例如,这使得在所有DB服务器或所有Web服务器上运行剧本变得容易,但是我现在意识到我也可以通过使用主机组(无论如何我已经拥有)来做到这一点。
我现在遇到的一个问题是,我想在一个清单中列出主机,而在另一个清单上运行剧本。例如,dbserver可能具有防火墙规则以允许从Web服务器进行访问,而我想做lookup('inventory_hostnames', 'webservers')
-但是,当在“ webservers”清单中定义了“ webservers”组并且我正在运行时,该规则不起作用与-i inventory/dbservers
。另一个问题是,除角色以外的其他主机组(例如服务器的物理位置)在文件之间重复。
为解决这个问题,我很想将所有内容都移到一个库存中。这样做有不利之处吗?
(我知道我可以与-i inventory_dir
一起运行,因此我仍然可以拥有多个清单文件,但可以将它们用作一个逻辑清单。)
答案 0 :(得分:1)
每种解决方案都有其优缺点。
当然,如果您有2个数据库服务器,1个日志和3个Web服务器,那么在一个文件中声明所有6个数据库服务器是可以的。
但是,当您管理更大的系统时,您可能有100台服务器。在这种情况下,将它们分开将更加有益,并且更不会出错。
因此,如果问题是哪种方法更好,那就没有答案了。每个人都有自己的喜好。
如果问题是将所有服务器声明在一个文件中是否不好?那么答案是否定的。只要您保持井井有条,并且情况适合您。
答案 1 :(得分:1)
我认为没有“正确的方法”或“错误的方法”,但让我从过去几年部署Ansible所做的事情中提供一些见解。
我们使用单独的库存来指示生产与分期或测试,这对我们非常有用。这样,我们可以使用组来表示剧本中的不同机器角色(不要与Ansible角色混淆),但是我们可以轻松地在生产和登台之间进行切换。
在库存中,我们设置了某些标准变量和组,以方便确定我们是在测试机器还是在生产机器。
这样,当我们运行剧本时,我们使用诸如:
ansible-playbook -i prod name-of-playbook.yml
如果在舞台计算机上运行prod
,则将stage
替换为[db-servers]
db1.foo.net
[web-servers]
web.foo.net
[all:vars]
env: prod
。
这不是所有人的解决方案,但是对我们来说非常有效。
对我们来说,标准库存文件看起来像:
db-servers
然后,我们将在剧本的剧本中使用web-servers
和env
,如果需要知道我们是在使用生产还是演出,则可以在必要时检查{{1}}系统。
答案 2 :(得分:0)
正如已经提到的,这两种方法都有其局限性。 我们在各个阶段分别处理库存:DEMO TEST等。 主要是将各个阶段明确分开,以避免意外配置错误。 和戏剧的应用。另外,您还必须明确设置要使用的清单。 使用多个库存时的主要缺点是必须多次设置vars布局更改(对childs进行分组等)。
现在由您决定:)