How to use Ansible register values as role environment variables?

Viewed 94

I am building an AWS EC2 Instance using Ansible and want to set three environment variables to be used by the roles. The playbook is launched frmo AWX. I get the STS Assume Role values in the "Assume Credentials" task.

---

- name: Create Instance
  hosts: localhost
  gather_facts: false
  connection: local

  tasks:

    - import_tasks: usshared.yml
      when: (buildenv == "us-shared")

    - import_tasks: ossettings.yml

    - name: Assume Credentials
      sts_assume_role:
        region: "{{ target_region }}"
        role_arn: "{{ awsarnrole }}"
        role_session_name: "AWXBuildServer"
      register: assumed_role

    # - name: Assume Role Data
    #   debug:
    #     var: assumed_role

    - name: Find AMI Target
      ec2_ami_info:
        filters:
          name: "cmpc*{{ osselection }}*base*"
        owners: self
        region: "{{ target_region }}"
        aws_access_key: "{{ assumed_role.sts_creds.access_key }}"
        aws_secret_key: "{{ assumed_role.sts_creds.secret_key }}"
        security_token: "{{ assumed_role.sts_creds.session_token }}"
      register: found_base_ami

    - import_tasks: osbuildlinux.yml
      when: (osselection == "centos7") or (osselection == "rhel7")

    - import_tasks: osbuildwin.yml
      when: (osselection == "win2019")

- name: Configure New Linux Instance
  hosts: new_launch_linux
  gather_facts: true

  roles:
    - systemupdates
    - generalostasks
    - networkconfig
    - appgroup

  environment:
    AWS_ACCESS_KEY: "{{ assumed_role.sts_creds.access_key }}"
    AWS_SECRET_ACCESS_KEY: "{{ assumed_role.sts_creds.secret_key }}"
    AWS_SECURITY_TOKEN: "{{ assumed_role.sts_creds.session_token }}"

- name: Configure New Windows Instance
  hosts: new_launch_windows
  gather_facts: true

  roles:
    - systemupdates
    - generalostasks
    - networkconfig
    - winadjoin
    - appgroup

This is the assumed_role register contents:

"assumed_role": {
  "changed": true,
  "sts_creds": {
    "access_key": "HIDDEN",
    "secret_key": "HIDDEN",
    "session_token": "HIDDEN",
    "expiration": "2022-06-08T16:58:38+00:00"
  },
  "sts_user": {
    "assumed_role_id": "HIDDEN:AWXBuildServer",
    "arn": "arn:aws:sts::0123456789:assumed-role/sre-ec2-role-assumed/AWXBuildServer"
  }
}

Now I want to use some of the register values as environment variables for roles like so:

roles:
- systemupdates
- generalostasks
- networkconfig
- appgroup

environment:
  AWS_ACCESS_KEY: "{{ assumed_role.sts_creds.access_key }}"
  AWS_SECRET_ACCESS_KEY: "{{ assumed_role.sts_creds.secret_key }}"
  AWS_SECURITY_TOKEN: "{{ assumed_role.sts_creds.session_token }}"

However, I am getting this error:

The field 'environment' has an invalid value, which includes an undefined variable. The error was: 'assumed_role' is undefined. 'assumed_role' is undefined

How do I correctly pass the register values to the environment?

1 Answers

ok you have more than one plays in same playbook with different hosts, so i suggest to use add_host after you have register the result:

- name: Assume Credentials
  sts_assume_role:
    region: "{{ target_region }}"
    role_arn: "{{ awsarnrole }}"
    role_session_name: "AWXBuildServer"
  register: assumed_role
        
- name: add variables to dummy host
  add_host:
    name: "variable_holder"
    shared_variable:  "{{ assumed_role }}"

then in second play:

- name: Configure New Linux Instance
  hosts: new_launch_linux
  gather_facts: true
  vars:
    assumed_role: "{{ hostvars['variable_holder']['shared_variable'] }}"
  roles:
    - systemupdates
    - generalostasks
    - networkconfig
    - appgroup

  environment:
    AWS_ACCESS_KEY: "{{ assumed_role.sts_creds.access_key }}"
    AWS_SECRET_ACCESS_KEY: "{{ assumed_role.sts_creds.secret_key }}"
    AWS_SECURITY_TOKEN: "{{ assumed_role.sts_creds.session_token }}"
Related