4

I have a playbook with two plays, one local and one remote. I have two inventories, one for test and one for production. Each inventory defines a variable for the remote group, but I would like to use the variable in the local play without using delegation. Is that possbile and how would I do that?

Example Playbook:

- hosts: local
  tasks:
    # ... lots of local build steps here
    - command: tar -czf {{ archive_name }} /build_dir
- hosts: remote
  tasks:
    - unarchive: src={{ archive_name }} dest=/deploy_dir

Test inventory:

[local]
127.0.0.1

[remote]
test.example.com

[remote:vars]
archive_name=/tmp/test-build.tgz

Production Inventory:

[local]
127.0.0.1

[remote]
www.example.com

[remote:vars]
archive_name=/tmp/production-build.tgz

This example fails because {{ archive_name }} is not defined for the local group.

A solution to this would have the following constraints:

  • I can't put it into a file in group_vars because I have different inventories with the same group names.
  • I'd rather not delegate the build process tasks instead of using a separate play.
  • I would like to keep the variable in the inventory file and not dynamically load other files.

The only option I see at the moment is to define {{ archive_name }} again for the local group, but that's error-prone.

0

1 Answer 1

2

You should be able to access the value of archive_name through hostvars:

- hosts: local
  tasks:
    # ... lots of local build steps here
    - command: tar -czf {{ hostvars[groups['remote'][0]]['archive_name'] }} /build_dir
- hosts: remote
  tasks:
    - unarchive: src={{ hostvars[groups['remote'][0]]['archive_name'] }} dest=/deploy_dir

You must log in to answer this question.

Not the answer you're looking for? Browse other questions tagged .