Home > Software engineering >  Using variable for tag name in Ansible AWS modules
Using variable for tag name in Ansible AWS modules

Time:12-01

ec2_snapshot module allows me to create snapshots of volumes and tag at the same time. This is straight forward while using fix names for tags. But how can I set tag name itself from a variable?

Example task:

- name: AWS EBS Disks Snapshot For Volumes
  ec2_snapshot:
    aws_access_key: "{{ aws_access_key_id }}"
    aws_secret_key: "{{ aws_secret_key_id }}"
    security_token: "{{ aws_security_token }}"
    volume_id: "{{ item.id }}"
    region:  "{{ aws_region }}"
    snapshot_tags: 
      Name: "{{ timestamp.stdout }}"
      "{{ tagname_variable }}": "{{ tagvalue_variable }}"
      type: "{{ item.type }}"
    description: "{{ timestamp.stdout }}_snapshot"
  with_items:
    - "{{ volumeinputs }}"

The tagname_variable is literally created as a tag name, not the value of the variable.
How I can make this work?

CodePudding user response:

You will need to dynamically create that part of you dictionary, for example, with a combine, as YAML dictionaries key are usually not templated by Ansible.

This can be done in a vars sections of the task itself:

- name: AWS EBS Disks Snapshot For Volumes
  ec2_snapshot:
    aws_access_key: "{{ aws_access_key_id }}"
    aws_secret_key: "{{ aws_secret_key_id }}"
    security_token: "{{ aws_security_token }}"
    volume_id: "{{ item.id }}"
    region:  "{{ aws_region }}"
    snapshot_tags: "{{ _snapshot_tags }}"
    description: "{{ timestamp.stdout }}_snapshot"
  loop: "{{ volumeinputs }}"
  vars:
    _snapshot_tags_static:
      Name: "{{ timestamp.stdout }}"
      type: "{{ item.type }}"
    _snapshot_tags: >-
      {{
        _snapshot_tags_static
        | combine({tagname_variable: tagvalue_variable})
      }}
  • Related