3

似乎在 ansible 世界中处理库存的方法太多了,我们面临一些难题。

我们目前有 4 个官方目标环境:生产、登台、测试和本地(localhost)。现在它们都是位于根目录中的单个inventory.ini 中的所有主机组。

几乎所有的整个基础设施都在 AWS 上运行,唯一的例外是一些开发人员在 localhost 或本地 VM 上运行他们的本地环境。尽管如此,所有其他非个人环境都在 AWS 上。

一些工作人员希望将其拆分为每个环境的不同清单,以避免一次意外执行。我有点担心这可能会增加维护成本,并且可能会使使用 Ansible Tower、Semamphore 或 RunDeck 等工具变得更加困难。我还想切换到 ec2 动态库存,这使得拆分不那么有趣。

以下是一些必须通过最佳设置解决的问题:

  • 如何将特定组件部署到特定环境?
  • 如何在不影响生产或登台的情况下测试剧本?
  • 他应该在我们的剧本中保留什么默认值作为“主机:值”
  • 如果我们要使用多个文件,默认清单应该是什么
  • 我们如何针对整个基础架构部署一些东西(同时多个库存)
4

2 回答 2

2

我认为是时候进行动态库存了。我遇到了类似的问题,我有 3 个要部署的环境和一个清单文件。我通过将所有主机存储在数据库(在我的情况下为 MongoDB)中,然后编写动态清单来创建主机列表来解决它。环境的选择是通过在调用 ansible 之前添加一个 env 变量来完成的(类似于environ=PROD ansible-playbook -i inventory ..。库存中还有一些逻辑以避免任何人部署到生产环境(基于 uid/gid)。回答您的问题:

  • 您可以使用多种方法来执行此操作,使用环境变量和动态清单,单独的清单文件,或使用单个清单并命名组(prod|dev|staging)_<hostgroup>
  • 这完全取决于您选择如何管理库存
  • 剧本中没有默认值- hosts:。仅从正确的清单中选择您需要的主机。
  • 默认值取决于您的决定,但我会说,不要将生产用作默认值.. 不是最安全的事情,也许使用 dev 作为默认值?
  • 只需使用-i inventory_dir/. 您可以将目录传递给-iansible 将读取所有文件并执行所有 -x 文件。
于 2016-04-19T07:54:22.890 回答
1

当您在 AWS 上时,我会使用动态清单。

我们不在 AWS 或类似的地方。所以不幸的是,我没有带有标签等的花哨的 api。在这种情况下,每个环境的清单对我们来说是最好的解决方案。在本清单中,我们使用简单的主机组。

库存文件存储在子目录中:inventory/prod.ini

[mysql]
db-server.prod.domain

[web]
app-1-server.prod.domain
app-2-server.prod.domain

剧本是通过组来组织的。所以我有一本mysql.yml适用于所有数据库内容的web.yml剧本和一本适用于网络服务器的剧本。它们包含在main.yml剧本中,以编排它们以可能以特定顺序进行全面运行。

include mysql.yml
include web.yml

这可能不是最好或最聪明的解决方案,但它很有效,并且很容易向所有团队成员解释。我喜欢环境变量的想法,但在我看来,最好有一个简单但有效的解决方案。我们从一个月开始就使用这个模式,没有任何意外推出到错误的环境。

对于任何环境,您都需要更多的魔法或简单的命令,您可以将其包装在任务运行程序中,如 ant 或类似的东西。

于 2016-04-19T08:28:03.910 回答