简体   繁体   中英

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
}

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM