Ansible 如何区分具有动态库存的暂存/生产?

Ansible 如何区分具有动态库存的暂存/生产?,ansible,ansible-playbook,Ansible,Ansible Playbook,我卡住了。他妈的在网上搜索,找不到答案 我已经使用Ansible多年了,但总是使用静态库存。为了区分不同的环境,如暂存和生产环境,我分别使用了不同的静态库存文件,staging和production。当我需要配置临时服务器时,我会: ansible-playbook site.yml -i staging 当我想为生产做同样的事情时,我会: ansible-playbook site.yml -i production staging和production都需要具有不同值的变量,因此我有组变

我卡住了。他妈的在网上搜索,找不到答案

我已经使用Ansible多年了,但总是使用静态库存。为了区分不同的环境,如暂存和生产环境,我分别使用了不同的静态库存文件,
staging
production
。当我需要配置临时服务器时,我会:

ansible-playbook site.yml -i staging
当我想为生产做同样的事情时,我会:

ansible-playbook site.yml -i production
staging和production都需要具有不同值的变量,因此我有
组变量/staging
组变量/production
。所有这些都符合最佳实践

现在,我需要在AWS中提供EC2实例。我正在使用。我有一本有两个剧本的剧本。第一个是针对
localhost
运行的,在AWS中创建/查找所需的EC2实例,并使用
add\u host
填充组。第二个重头戏使用该组运行在第一个重头戏中发现的EC2实例上。都是根据那个指南

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


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

虽然我不知道如何使用ansible EC2 moduel,因为我们不使用它从ansible级别构建框,但有一种简单的方法可以通过清单/main中的
和简单设置获得所需的内容。您需要做的是在
清单中设置
ec2.py
ec2.ini
,以便将其用作实例源。确保在
ec2.ini
内部取消注释
group\u by_tag\u keys=True

下一步是区分哪个实例去哪里。虽然在
ec2.py
中有许多选择方法可用,但我更愿意相应地专门标记每个实例。因此,我的所有实例都有一个名为
environment
的标记,该标记将相应地填充(在您的情况下,它将是staging或production)。然后剩下的就是在
清单/main
中处理它,下面是一个小示例

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

[tag_environment_staging]

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

[tag_environment_staging]

[tag_environment_production]

[staging:children]
tag_environment_staging

[production:children]
tag_environment_production

就这样。从现在起,通过环境标记附带的动态清单脚本从ec2中提取的每个实例都将与
组变量中的相应配置相匹配。您需要记住的是,在处理动态库存时,您希望您的
-i
指向
库存
目录,而不是特定的文件,以使其正常工作。

除了Openstack之外,我在动态库存方面也有类似的问题。到目前为止,我提出的解决方案是使用一个环境变量来指定我是要针对暂存环境还是生产环境。它也应该适用于您的情况。在我们的设置中,
$OS\u项目的名称是
stage
prod
。在
ansible.cfg
set中

inventory = ./inventories/${OS_PROJECT_NAME}/openstack.py
然后我们有特定于环境的组变量

inventories/(stage|prod)/group_vars/

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

类似于
[tag\u environment\u staging]
的部分已经假设存在标记的实例。如果我想使用Ansible实际创建这些标记和标记实例,该怎么办?为了正确地做到这一点,在我开始从AWS获取事实之前,我需要将一些
env
变量设置为
staging
。在我运行playbook之前,我们的AWS帐户是干净的,没有任何内容。标记本身很容易,也很简单。当然,您需要将部署的阶段传递给剧本,这是一个非常简单的额外变量或env的使用。每次需要调配/部署到每个环境时,我是否都会使用
-e
传递它们?这正是问题所在:我如何让
组变量/(分段生产)
神奇地包括它们在使用静态库存时的方式?@ElnurAbdurrakhimov,这就是我在回答中解释的。当您设置了动态资源清册之后,在从EC2收集主机事实的过程中,它会将机器标记(和其他特征)公开为您可以使用的可用组。哪些机器标记?AWS中还没有标签或EC2实例。我有一个新的AWS帐户,并想提供它与Ansible。我需要能够指定在运行Ansible时要配置的环境。在此基础上,我将有关于创建和标记EC2实例的标记的信息。您所说的是使用有关现有标记和以前创建的EC2实例的信息。那不是我需要的。也许你可以用不同的剧本做点什么?类似于production.yml和staging.yml。这些剧本将包括site.yml,但也包括他们的env特定变量。这是我在互联网上看了几天书后发现的最好的方法。。。奇怪的是,Ansi的这个相当重要的方面