我有一个使用 vars:中声明的字典创建EC2的剧本,然后将IP注册到稍后要使用的组中。
dict看起来像这样:
servers:
serv1:
name: tag1
type: t2.small
region: us-west-1
image: ami-****
serv2:
name: tag2
type: t2.medium
region: us-east-1
image: ami-****
serv3:
[...]
我想以最简单的方式将标签应用于此剧本,因此我可以使用标签创建其中一些标签。例如,使用--tags tag1,tag3
运行playbook只会启动EC2匹配serv1和serv3。
在字典上应用标签似乎不可能,我希望避免做以下的乘法任务:
虽然我已经有了一个工作循环,但我想立刻创建所有EC2,有没有办法实现这一点(不依赖于--extra-vars,这需要key = value)?例如,通过在运行EC2循环之前仅保留标记的内容来过滤掉字典?
答案 0 :(得分:1)
我怀疑你可以开箱即用。并不确定这是个好主意。
由于代码用于过滤Ansible中的任务,因此您必须使用tags: always
标记所有任务。
您可以使用自定义过滤器插件完成此操作,例如(./filter_plugins/apply_tags.py
):
try:
from __main__ import cli
except ImportError:
cli = False
def apply_tags(src):
if cli:
tags = cli.options.tags.split(',')
res = {}
for k,v in src.iteritems():
keep = True
if 'name' in v:
if v['name'] not in tags:
keep = False
if keep:
res[k] = v
return res
else:
return src
class FilterModule(object):
def filters(self):
return {
'apply_tags': apply_tags
}
在你的剧本中:
- debug: msg="{{ servers | apply_tags }}"
tags: always
答案 1 :(得分:1)
我找到了一种方法来满足我的需求,而不会触及其余的,所以我分享它以防其他人可能有类似的需求。 我需要根据标签组合字典,所以我的“主”字典不会是静态的。
变量变为:
y
因此,我没有复制我的任务,而是将 set_fact 与标记一起使用,如下所示:
- serv1:
- name: tag1
type: t2.small
region: us-west-1
image: ami-****
- serv2:
- name: tag2
type: t2.medium
region: us-east-1
image: ami-****
- serv3:
[...]
20行而不是每个服务器的乘法任务,将变量从字典更改为列表,一些标签和所有好的:)现在,如果我添加一个新服务器,它只需要几行。