Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/amazon-web-services/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Amazon web services 如何在多个环境中以可扩展和灵活的方式管理ansible库存?_Amazon Web Services_Ansible_Ansible Playbook_Ansible 2.x - Fatal编程技术网

Amazon web services 如何在多个环境中以可扩展和灵活的方式管理ansible库存?

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

在ansible的世界里,处理库存的方法似乎太多了,我们面临着一些棘手的问题

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

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

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

以下是一些必须通过优化设置添加的问题:

  • 如何向特定环境部署特定组件
  • 如何在不影响生产或舞台的情况下测试剧本
  • 他应该在我们的剧本中保留什么默认值作为“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/
        。您可以将目录传递到
        -i
        ansible将读取所有文件并执行所有-x文件

      当您使用AWS时,我会使用动态库存

      我们不在AWS或类似的平台上。所以很遗憾,我没有一个带有标签等的高级api。在这种情况下,每个环境的清单是我们最好的解决方案。在这个清单中,我们使用简单的主机组

      库存文件存储在子顺序中:Inventory/prod.ini

      [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变量并选择主机如果您不想/不能使用动态清单或环境变量,则将使用多个清单。我不太明白默认值部分的意思。