Antonio Romero Oca
Antonio Romero Oca

Reputation: 1245

How to wait for a variable to be defined?

Is there a way to make a playbook waiting till a variable is defined?

To reduce some time in the execution of a playbook, I would like to to split it into multiple and start them at the same time. Some of them need a variables, which are defined in the other playbooks.

Is it possible?

Upvotes: 1

Views: 1759

Answers (1)

Vladimir Botka
Vladimir Botka

Reputation: 68034

IMHO it's not possible. Global scope is set only by config, environment variables and the command line.

Other variables are shared in the scope of a play. It is possible to import more playbooks into one playbook with import_playbook and share variables among the playbooks. But, it's not possible to let the imported playbooks run asynchronously and let them wait for each other.

An option would be to use an external shared memory (e.g. database) and to start such playbooks separately. For example, to share variables among the playbooks at the controller, a simple ini file would do the job.

$ cat shared-vars.ini
[global]

The playbook below

- hosts: localhost
  tasks:
    - wait_for:
        path: "{{ playbook_dir }}/shared-vars.ini"
        search_regex: "^shared_var1\\s*=(.*)"
    - debug:
        msg: "{{ lookup('ini', 'shared_var1 file=shared-vars.ini') }}"

waits for a variable shared_var1 in the file shared-vars.ini

$ ansible-playbook wait_for_var.yml

PLAY [localhost] *******************************************************

TASK [wait_for] ********************************************************

Next playbook

- hosts: localhost
  tasks:
    - ini_file:
        path: "{{ playbook_dir }}/shared-vars.ini"
        section: global
        option: shared_var1
        value: Test value set by declare_var.yml

writes the variable shared_var1 into the file shared-vars.ini

$ ansible-playbook declare_var.yml

PLAY [localhost] *******************************************************

TASK [ini_file] ********************************************************
changed: [localhost]

PLAY RECAP *************************************************************
localhost                  : ok=1    changed=1    unreachable=0    failed=0

First playbook which was waiting for the variable continues

TASK [debug] ***********************************************************
ok: [localhost] => {
    "msg": "Test value set by declare_var.yml"
}

PLAY RECAP *************************************************************
localhost                  : ok=2    changed=0    unreachable=0    failed=0

Upvotes: 1

Related Questions