【问题标题】:How to differentiate between staging/production with a dynamic inventory?如何区分暂存/生产与动态库存?
【发布时间】:2016-03-03 17:05:59
【问题描述】:

我被困住了。用谷歌搜索了网络,找不到答案。

多年来我一直在使用 Ansible,但总是使用静态清单。为了区分暂存和生产等不同环境,我分别使用了不同的静态清单文件stagingproduction。当我需要配置临时服务器时,我会这样做:

ansible-playbook site.yml -i staging

当我想为生产做同样的事情时,我会这样做:

ansible-playbook site.yml -i production

暂存和生产都需要具有不同值的变量,所以我有group_vars/staginggroup_vars/production。一切都很好,并且符合最佳做法。

现在,我需要在 AWS 中预置 EC2 实例。我正在使用this AWS guide。我有一本包含两部戏剧的剧本。第一个针对localhost 运行,在AWS 中创建/查找所需的EC2 实例,并使用add_host 填充组。第二场比赛使用该组运行在第一场比赛中发现的 EC2 实例。一切都按照该指南进行。

除了一件事,一切都很好。我不知道如何指定要配置的环境,因此没有从group_vars/(staging|production) 加载所需的变量。基本上,我想要的是类似于 -i (staging|production) 的东西,这些年来我一直使用静态库存,但现在使用 -i 似乎没有意义,因为库存是动态的。我想要一种能够根据我在运行时传递给ansible-playbook 的参数从group_vars/staginggroup_vars/production 加载变量的方法。

我该怎么做?最佳做法是什么?

【问题讨论】:

  • 也许你可以用单独的剧本做点什么?像 production.yml 和 staging.yml 这样的东西。然后,这些剧本将包含 site.yml,但也包含其特定于 env 的变量。

标签: ansible ansible-playbook


【解决方案1】:

虽然我不确定如何使用 ansible EC2 模块,因为我们不使用它从 ansible 级别构建盒子,但有一种简单的方法可以使用 ec2 external inventory script 和 @ 中的简单设置来获得你想要的东西987654323@。您需要做的是在您的inventories 中设置ec2.pyec2.ini,以便将其用作实例源。确保取消注释 group_by_tag_keys = True 内的 ec2.ini

下一步是区分哪个实例去哪里。虽然ec2.py 中提供了许多选择方法,但我更喜欢相应地专门标记每个实例。所以我所有的实例都有一个名为environment 的标签,它会被相应地填充(在你的情况下,它可以是登台或生产)。然后剩下的就是在你的inventories/main 中处理它,这里有一个小例子。

首先,您必须为要使用的标签定义空组:

[tag_environment_staging]

[tag_environment_production]

以便我们以后可以参考它们。之后,剩下要做的就是将这些组指定为适当阶段的子组。所以之后我们的最小文件将如下所示:

[tag_environment_staging]

[tag_environment_production]

[staging:children]
tag_environment_staging

[production:children]
tag_environment_production

然后就可以了。从现在开始,通过环境标签附带的动态清单脚本从 ec2 中提取的每个实例都将与group_vars 中的适当配置相匹配。您必须记住,在处理动态库存时,您希望 -i 指向 inventories 目录而不是特定文件才能正常工作。

【讨论】:

  • [tag_environment_staging] 这样的部分已经假定存在标记的实例。如果我想使用 Ansible 实际 create 那些标签和 tag 实例怎么办?为了正确地做到这一点,我需要一些 env 变量设置为 staging 之前我什至开始从 AWS 获取事实。在我运行我的剧本之前,我们的 AWS 账户是干净的,里面什么都没有。
  • 标记本身很简单,laid out neatly in documentation。然后当然你需要将你正在部署的阶段传递给剧本,这是对 extra_vars 或 env 的相当简单的使用。
  • 我对每个环境都有一组变量——十几个变量。每次我需要配置/部署到每个环境时,我是否将它们中的每一个都传递给-e?这正是问题所在:我如何让group_vars/(staging|production) 神奇地包含在使用静态清单时的方式?
  • @ElnurAbdurrakhimov 这就是我在答案中所解释的。当您设置了动态清单后,在从 EC2 收集主机的事实期间,它会将机器标签(和其他特征)公开为您可以使用的 ansible 组。
  • 哪个机器标签? AWS 中还没有标签或 EC2 实例。我有一个新的 AWS 账户,想用 Ansible 预置它。 当我运行 Ansible 时,我需要能够指定要配置的环境。基于此,我将获得有关创建和标记 EC2 实例的标签的信息。您所说的是使用有关 existing 标签和之前创建的 EC2 实例的信息。这不是我需要的。
【解决方案2】:

我在动态库存方面也有类似的问题,但对于 Openstack。到目前为止,我提出的解决方案是使用环境变量来指定我是要针对暂存环境还是生产环境。它也应该适用于您的情况。在我们的设置中,$OS_PROJECT_NAMEstageprod。在ansible.cfg设置

inventory = ./inventories/${OS_PROJECT_NAME}/openstack.py

然后我们在下面有特定于环境的组变量

inventories/(stage|prod)/group_vars/

缺点是您必须将库存脚本放在两个位置或将其符号链接。另请注意,相对于 playbook 目录找到的 group_vars 仍将覆盖清单 group_vars。

【讨论】:

  • 这是我在上网和阅读这本书几天后发现的最佳方法......奇怪的是,Ansible 的这个非常重要的方面没有得到很好的记录。
  • 所以这个配置仍然将 every 主机(dev/stage/prod)返回到 every 环境中,openstack.py 本身没有变化吗?您如何定位为 dev/stage/prod 指定的单个 VM?
  • 不,我们为不同的环境使用不同的 openstack 项目。所以库存脚本只返回当前环境中的主机
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
  • 2019-12-09
  • 1970-01-01
  • 2011-07-20
  • 2011-05-04
相关资源
最近更新 更多