Ansible Dict and Tags

北城以北 提交于 2019-12-11 06:14:53

问题


I have a playbook creating EC2 by using a dictionary declared in vars: then registering the IPs into a group to be used later on.

The dict looks like this:

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

I would like to apply tags to this playbook in the simplest way so I can create just some of them using tags. For example, running the playbook with --tags tag1,tag3 would only start EC2 matching serv1 and serv3.

Applying tags on the dictionary doesn't seem possible and I would like to avoid doing multiplying tasks like:

  • Creatinge EC2
  • Register infos
  • Getting private IP from previously registered infos
  • adding host to group

While I already have a working loop for the case I want to create all EC2 at once, is there any way to achieve that (without relying on --extra-vars, which would need key=value) ? For example, filtering out the dictionary by keeping only what is tagged before running the EC2 loop ?


回答1:


I doubt you can do this out of the box. And not sure this is good idea at all.
Because tags are used to filter tasks in Ansible, so you will have to mark all tasks with tags: always.

You can accomplish this with custom filter plugin, for example (./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
        }

And in your playbook:

- debug: msg="{{ servers | apply_tags }}"
  tags: always



回答2:


I found a way to match my needs without touching to the rest so I'm sharing it in case other might have a similar need. I needed to combine dictionaries depending on tags, so my "main" dictionary wouldn't be static.

Variables became :

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

So instead of duplicating my tasks, I used set_fact with tags like this:

- 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 lines instead of multiply tasks for each server, change vars from dictionary to lists, a few tags and all good :) Now if I add a new server it will only take a few lines.



来源:https://stackoverflow.com/questions/40871686/ansible-dict-and-tags

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!