Ansible Dict和标签

时间:2016-11-29 17:07:41

标签: ansible ansible-playbook

我有一个使用 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。

在字典上应用标签似乎不可能,我希望避免做以下的乘法任务:

  • Creatinge EC2
  • 注册信息
  • 从以前注册的信息中获取私人IP
  • 将主机添加到群组

虽然我已经有了一个工作循环,但我想立刻创建所有EC2,有没有办法实现这一点(不依赖于--extra-vars,这需要key = value)?例如,通过在运行EC2循环之前仅保留标记的内容来过滤掉字典?

2 个答案:

答案 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行而不是每个服务器的乘法任务,将变量从字典更改为列表,一些标签和所有好的:)现在,如果我添加一个新服务器,它只需要几行。