Ansible set fact не изменяет значение переменной

сценарий ansible-playbook вызывается с переданным в extra var:

-e my_var=init_value

тогда в коде роли значение должно изменяться с помощью вызова set_fact (значение переменной other_var - "new_value"):

set_fact: my_var: {{ other_var }}

Это хороший выход, якобы подтверждающих изменения:

{"ansible facts": {"my_var": "new_value"}}

однако Эхо переменной после ее изменения показывает старое значение:

echo {{ my_var }}
-> "echo init_value"

чтобы добавить к этому, когда я устанавливаю две переменные в приведенном выше пример:

set_fact: my_var: {{ other_var }}
set_fact: new_var: {{ other_var }}

new_var установлен правильно.

является ли переменная каким-то образом неизменяемой? Как использовать set_fact для обновления значения переменной?

2 ответов


модуль "set_fact" эффективно добавляет еще один факт хоста, т. е. "обнаружен факт о системе". Из документации (http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable) Вы можете видеть, что эти факты имеют низкий приоритет и будут переопределены экстра-Варс и различными другими вещами.

Это может быть запутанным, потому что с помощью "set_fact" может показаться, что вы меняете значение переменной при этом точка, но, возможно, имя является ключом к пониманию - это не "set_variable", это "set_(host)fact", а факты хоста имеют низкий приоритет. Приоритет более важен, чем порядок присвоения значения.

один обходной путь, если вы хотите предоставить значение через extra-vars, которое будет перезаписано позже, - это переназначить это значение extra-vars другой переменной через set_fact в начале вашего playbook, а затем переназначить эту новую переменную позже с помощью set_fact снова. Поскольку они находятся на одном уровне приоритета, "перезапись" должна работать так, как вы ожидаете.


переменные командной строки имеют наивысший приоритет среди всех типов переменных. Что-нибудь можно определить в командной строке переопределяет любые другие определения этой переменной.

документация по переменному приоритету в Ansible здесь http://docs.ansible.com/playbooks_variables.html#variable-precedence-where-should-i-put-a-variable в этом списке перечислены все другие места, где вы можете поместить свое начальное/значение по умолчанию.