Ansible, проблема при использовании переменного содержимого в playbook - PullRequest
1 голос
/ 15 октября 2019

Мне нужно использовать переменную, определенную для некоторых хостов (в инвентаре), на другом хосте.

Здесь я определяю ее в своем инвентаре

[mygroup:vars]
service_url=my_front_url

Где mygroup содержит другие группы, содержащий мои хосты.

Затем моя книга воспроизведения:

- 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'] }}"

Где platform - это экстра-var (параметр, который «mygroup» использовать) и где 127.0.0.1 - мой ответhost, отличный от моих целевых хостов.

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"}

Если я установил статическое имя группы в yaml, это прекрасно работает.

- 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"
}

Это похоже напроблема с синтаксисом, но я пробовал так много способов, что я думаю, что мог бы использовать некоторую помощь.

Спасибо

Николас

1 Ответ

1 голос
/ 15 октября 2019

Все внутри {{ и }} более или менее просто python, поэтому не используйте рекурсивные шаблоны, как у вас:

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

, вместо этого просто ссылайтесь на переменную, как есть, переменная :

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