Amazon web services 如何在多个环境中以可扩展和灵活的方式管理ansible库存?
在ansible的世界里,处理库存的方法似乎太多了,我们面临着一些棘手的问题 我们目前有4个正式的目标环境:生产、登台、测试和本地(localhost)。现在,它们都是位于根目录中的单个inventory.ini中的主机组 几乎所有的基础设施都在AWS上运行,唯一的例外是一些开发人员在本地主机或本地VM上运行他们的本地环境。尽管如此,所有其他非个人环境都在AWS上 一些工作人员希望为每个环境将其划分为不同的库存,以避免一次对所有环境意外执行。我有点担心,这可能会增加维护成本,这可能会使Ansible Tower、Semanphore或RunDeck等工具更难使用。我还想切换到ec2动态库存,这使得拆分不那么有趣 以下是一些必须通过优化设置添加的问题:Amazon web services 如何在多个环境中以可扩展和灵活的方式管理ansible库存?,amazon-web-services,ansible,ansible-playbook,ansible-2.x,Amazon Web Services,Ansible,Ansible Playbook,Ansible 2.x,在ansible的世界里,处理库存的方法似乎太多了,我们面临着一些棘手的问题 我们目前有4个正式的目标环境:生产、登台、测试和本地(localhost)。现在,它们都是位于根目录中的单个inventory.ini中的主机组 几乎所有的基础设施都在AWS上运行,唯一的例外是一些开发人员在本地主机或本地VM上运行他们的本地环境。尽管如此,所有其他非个人环境都在AWS上 一些工作人员希望为每个环境将其划分为不同的库存,以避免一次对所有环境意外执行。我有点担心,这可能会增加维护成本,这可能会使Ansib
- 如何向特定环境部署特定组件
- 如何在不影响生产或舞台的情况下测试剧本
- 他应该在我们的剧本中保留什么默认值作为“hosts:value”
- 如果我们要使用多个文件,那么默认清单应该是什么
- 我们如何针对整个基础架构部署一些东西(同时部署多个库存)
- 我认为是时候进行动态库存了。我遇到了一个类似的问题,我有3个要部署的环境和一个清单文件。我通过将所有主机存储在一个数据库(在我的例子中是MongoDB)中,然后编写一个动态清单来创建主机列表来解决这个问题。环境的选择是通过在调用ansible之前添加一个env变量来完成的(类似于
environ=PROD-ansible playbook-i inventory..
。库存中还有一些逻辑,以避免任何人部署到生产环境中(基于uid/gid)。
回答您的问题:
- 您可以使用多种方法来实现这一点,使用env变量和动态资源清册、单独的资源清册文件,或者使用单个资源清册并将组命名为
(prod | dev | staging)u
- 这完全取决于您选择如何管理库存
- 剧本中的
没有默认值。只能从正确的资源清册中选择所需的主机-hosts:
- 默认值取决于您的决定,但我要说的是,不要使用生产作为默认值。这不是最安全的事情,也许使用dev作为默认值
- 只需使用
。您可以将目录传递到-i inventory\u dir/
ansible将读取所有文件并执行所有-x文件-i
[mysql]
db-server.prod.domain
[web]
app-1-server.prod.domain
app-2-server.prod.domain
playbook是通过组来组织的。所以我有一个用于所有数据库内容的mysql.yml
playbook和一个用于web服务器的web.yml
playbook。
它们被包含在main.yml
playbook中,以便按照特定的顺序编排它们,以进行完整的运行
include mysql.yml
include web.yml
这可能不是最好或最聪明的解决方案,但它很有效,而且很容易向所有团队成员解释。我喜欢环境变量的概念,但我认为最好是有一个简单但有效的解决方案。我们从几个月以来就使用此模式,没有任何意外的部署到错误的环境
我想,对于任何环境,您都需要一些更神奇的或简单的命令,您可以将其包装在任务运行程序中,如ant或类似的东西。不管我的回答如何,我认为目标环境与剧本无关。它应该始终是一个附加信息,您应该提供明确说明。感谢您的输入。不过,还是有一些事情我不完全理解:为什么在使用环境变量时会有不同的清单?为什么不通过清单本身中的一个组来分配环境?关于playbook中没有主机的默认值…有点奇怪,我的直觉会告诉我在那里指定一个组,一个包含所有主机的组这本剧本应该适用于哪些方面。我不太喜欢假设ansible将由知道应用于哪个主机的人执行,这应该在一个文件中。抱歉,也许我不清楚。我在动态清单中使用了一个env变量,在我的例子中是一个python脚本读取env变量并选择主机如果您不想/不能使用动态清单或环境变量,则将使用多个清单。我不太明白默认值部分的意思。