Search code examples
ansibleansible-toweransible-awx

Ansible AWX/Tower - Access a variable saved as artifact from another play


I have a playbook which contains more than one plays. One of the plays generates a variable and stores it using the set_stats module as an artifact. The subsequent plays need to access the variable, but an error occurs that the given variable is undefined. How can I access a variable in the artifacts? (Btw using a workflow which would result in saving the variable in the extra_variables instead of the artifacts container is no option in this scenario)

The Problem in detail:

I have the following playbook which includes 2 plays which get executed on different hosts:

---
- hosts: ansible
  roles:
    - role_parse_strings

- hosts: all, !ansible
  roles:
    - role_setup_basics
    - role_create_accounts

The role "role_parse_strings" in the first play generates the variable "users" which gets stored because of the set_stats module as an artifact. The following content lands in the artifact section of ansible awx:

users:
  - username: user1
    admin: true
  - username: user2
    admin: false

When the role "role_create_accounts" gets executed which tries to access the variable "users" in the following way...

- user: name={{ item.username }}
    shell=/bin/bash
    createhome=yes
    groups=user
    state=present
  with_items: "{{ users }}"

..this error gets displayed:

{
    "msg": "'users' is undefined",
    "_ansible_no_log": false
}

Solution

  • You can use set_fact to share variable between hosts. Below example show how to share a file content via set_fact.

    - hosts: host1
      pre_tasks:
        - name: Slurp the public key
          slurp:
            src: /tmp/ssh_key.pub
          register: my_key_pub
    
        - name: Save the public key
          set_fact:
            my_slave_key: >-
              {{ my_key_pub['content'] | b64decode }} 
    
    - hosts: host2
      vars:
        slave_key: "{{ my_slave_key }}"
      pre_tasks:
        - set_fact:
            my_slave_key: >-
              {{ hostvars[groups["host1"][0]].my_slave_key | trim }}
    

    We saved the content of public key as a fact name called my_slave_key and assgined it another variable as slave_key in host2 with:

    hostvars[groups["host1"][0]].my_slave_key