2016-11-29 90 views
1

我有一个剧本通过使用VARS声明的词典生成EC2:然后登记所述IP地址为一组,以在后面使用。Ansible字典和标签

的字典是这样的:

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运行剧本只会启动EC2匹配serv1和serv3。

词典中应用的标签似乎并不可能,我想避免这样做乘法的任务,如:

  • Creatinge EC2
  • 注册的相关信息
  • 获取私有IP从以前注册的相关信息
  • 添加主机到群组

虽然我已经有一个工作循环的情况下我wa nt立刻创建所有的EC2,有没有什么办法可以实现这一点(不依赖--extra-vars,这需要key = value)?例如,通过只保留运行EC2循环之前标记的内容来过滤字典?

+0

林不知道我明白你的问题,但你可以指定'-e',例如'-e复杂的JSON项目“{‘测试’:‘一’,‘二’]}”' – user2599522

+0

我会加一个例子,但我想避免-e使它尽可能简单的使用它。标签是完美的,因为用逗号分隔的关键字。 – Hiruma

回答

1

我找到了一种方法,以符合我的需求,又不触及到如果其他人可能有类似的需求,我会分享它。 我需要根据标签来结合字典,所以我的“主”字典不会是静态的。

变量变成了:

- 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: 
[...] 

因此不是重复我的任务,我用set_fact标签这样的:

- name: Combined dict 
# Declaring empty dict 
    set_fact: 
    servers: [] 
    tags: ['always'] 
- name: Add Server 1 
    set_fact: 
    servers: "{{ servers + serv1 }}" 
    tags: ['tag1'] 
- name: Add Server 2 
    set_fact: 
    servers: "{{ servers + serv2 }}" 
    tags: ['tag2'] 
[..] 

20行,而不是为每个服务器乘任务,将字典中的变量更改为列表,几个标签和所有好:)现在,如果我添加一个新的服务器,它将只需要几行。

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 
+0

'__main__'是指什么? – pepoluan