5

Is it possible to define host variables for all hosts using a dynamic inventory?

Currently I can produce an inventory which allows me to assign variables to specific hosts, but what I want to achieve is something like this:

{
    "_meta": {
        "hostvars": {
            "all": {
                "my_global_random_variable": "global_random_value"
            }
        }
    },
    "web_servers": {
        "children": [],
        "hosts": [
            "web_server1",
            "web_server2"
        ],
        "vars": {}
    },
    "database_servers": {
        "children": [],
        "hosts": [
            "database_server1"
        ],
        "vars": {}
    }
}

Which should allow me to access the "my_global_random_variable" from any context as if I would have defined that variable in a vars file.

1

Variables set by dynamic inventory are inventory variables. When a variable is set in multiple places Ansible set the value following variable precedence:

  role defaults [1]
    inventory vars [2]
    inventory group_vars
    inventory host_vars
    playbook group_vars
    playbook host_vars
    host facts
    play vars
    play vars_prompt
    play vars_files
    registered vars
    set_facts
    role and include vars
    block vars (only for tasks in block)
    task vars (only for the task)
    extra vars (always win precedence)

Variables set in inventory have a relativ low precendence. So there is no need to use dynamic inventory to achive this. Just set the variable for example on role level.

  • This wouldn't have helped me because I had a dynamic inventory which retrieved data from LDAP. – user3245821 Oct 20 '16 at 9:30
  • I ended up using a lookup plugin which seems to be the right way. Thanks though! – user3245821 Oct 20 '16 at 9:31
1

I ended up using a lookup plugin instead of the inventory to retrieve my variables.

More information on lookups: https://docs.ansible.com/ansible/playbooks_lookups.html

0

I wanted to do this and seems to work with the following (adapted for your example):

{
    "all": {
        "vars": {
            "my_global_random_variable": "global_random_value"
        }
    },
    "web_servers": {
        "children": [],
        "hosts": [
            "web_server1",
            "web_server2"
        ],
        "vars": {}
    },
    "database_servers": {
        "children": [],
        "hosts": [
            "database_server1"
        ],
        "vars": {}
    }
}

Possibly not best practice but keeps things simple.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service, privacy policy and cookie policy

Not the answer you're looking for? Browse other questions tagged or ask your own question.