eric2025
eric2025

Reputation: 43

Ansible - Use string in a variable lookup

I'm trying to make my playbooks aware of their environment; that being production or stage.

My playbook first pulls the ec2_tag for its environment successfully and set to the variable 'env'. On the ec2 provision task, I would like to use the 'env' variable in the vpc and subnet lookups, so it grabs the correct one based on its environment. Below I tried adding the 'env' variable into the lookups, but I'm getting a full string back instead of it pulling it from my variable file.

Do I need to add some logic checks within the {{}}?

- name: Provision instance
      ec2:
        key_name: "{{ aws_public_key }}"
        instance_type: t2.medium
        image: "{{ aws_ubuntu_ami }}"
        wait: true
        vpc_subnet_id: "{{ env + '_subnet_public1' }}"
        group_id: "{{ env + '_app_group' }}"
        assign_public_ip: yes
        instance_tags:
          Name: "{{ sys_name }}"
          Environment: "{{ env }}"
        region: "{{ aws_region }}"
        volumes:
          - device_name: /dev/sda1
            volume_size: 300
            delete_on_termination: true
      register: ec2

Upvotes: 1

Views: 2631

Answers (1)

ydaetskcoR
ydaetskcoR

Reputation: 56997

If you want to do variable interpolation then you'll need to use the hostvars[inventory_hostname]['variable'] syntax.

The FAQs cover this briefly but for your use case you should be able to do something like:

- name: Provision instance
      ec2:
        key_name: "{{ aws_public_key }}"
        instance_type: t2.medium
        image: "{{ aws_ubuntu_ami }}"
        wait: true
        vpc_subnet_id: hostvars[inventory_hostname][env + '_subnet_public1']
        group_id: hostvars[inventory_hostname][env + '_app_group']
        assign_public_ip: yes
        instance_tags:
          Name: "{{ sys_name }}"
          Environment: "{{ env }}"
        region: "{{ aws_region }}"
        volumes:
          - device_name: /dev/sda1
            volume_size: 300
            delete_on_termination: true
      register: ec2

Upvotes: 1

Related Questions