1
votes

I need to use variable defined for some hosts (in inventory), on another host.

Here i define it in my inventory

[mygroup:vars]
service_url=my_front_url

Where mygroup contain other groups, containing my hosts.

Then my playbook :

- name: Get variable
  hosts: 127.0.0.1
  tasks:
  - debug:
      var: hostvars[groups['{{ platform }}'][0]]['service_url']
  - debug:
      msg: "{{ hostvars[groups['\"{{ platform }}\"'][0]]['service_url'] }}"

Where platform is an extra-var (setting which "mygroup" to use) and where 127.0.0.1 is my ansible host, distinct from my target hosts.

ex:

ansible-playbook test.yaml --extra-vars='platform=my-group' 


    TASK [debug] ********************************************************************************************************************************************************************
    ok: [127.0.0.1] => {
        "hostvars[groups['idi_se_prod'][0]]['service_url']": "my-front-url"
    }

    TASK [debug] ********************************************************************************************************************************************************************
    fatal: [127.0.0.1]: FAILED! => {"msg": "The task includes an option with an undefined variable. The error was: 'dict object' has no attribute '\"{{ platform }}\"'\n\nThe error appears to have been in 'XXXX/ansible/test.yaml': line 6, column 5, but may\nbe elsewhere in the file depending on the exact syntax problem.\n\nThe offending line appears to be:\n\n      var: hostvars[groups['{{ platform }}'][0]]['service_url']\n  - debug:\n    ^ here\n"}

If i set static group name in yaml, this work fine.

- name: Get variable
  hosts: 127.0.0.1
  tasks:
  - debug:
      var: hostvars[groups['{{ platform }}'][0]]['service_url']
  - debug:
      msg: "{{ hostvars[groups['mygroup'][0]]['service_url'] }}"


TASK [debug] ********************************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "hostvars[groups['my-group'][0]]['service_url']": "my-front-url"
}

TASK [debug] ********************************************************************************************************************************************************************
ok: [127.0.0.1] => {
    "msg": "my_front_url"
}

It look like a syntax probleme but i tried so many ways that i think i could use some help.

Thank you

Nicolas

1
Could you run ansible with verbose flags on and update the question with the details?Istvan

1 Answers

1
votes

Everything inside {{ and }} is more or less just python, so don't use recursive templates like you have:

  msg: "{{ hostvars[groups['\"{{ platform }}\"'][0]]['service_url'] }}"

instead just reference the variable like it is, a variable:

  msg: "{{ hostvars[groups[platform][0]]['service_url'] }}"