#ansible #ansible-facts
#ansible #ansible-факты
Вопрос:
Я пытаюсь передать переменную в Ansible playbook.
ansible-playbook script.yml --extra-vars "status=false"
Вот моя пьеса:
- name: Enable fact
set_fact:
facts: '{{ facts | combine({ "configured_status": "{{status}}" })}}'
vars:
facts: '{{ facts_raw.content|b64decode }}'
- debug:
var: facts
Однако вывод отладки:
"configured_status": "{{status}}"
Вместо:
"configured_status": "false"
Кто-нибудь знает, в чем может быть проблема?
Комментарии:
1. Вы хотите
"false"
(строку) илиfalse
(логическое значение)?2. Это должна быть строка («false»)
Ответ №1:
Попробуйте
facts: '{{ facts | combine({ "configured_status": status })}}'
Почему вы расшифровываете факты? Если вы использовали slurp, то
- name: Enable fact
set_fact:
facts: "{{ facts_raw.content|b64decode|from_json|default([])| combine({ 'configured_status': status }) }}"
- debug:
var: facts
Комментарии:
1. На самом деле это также работает, потому
key=value
extra-vars
что Ansible всегда принимает форму строки.2. @anatogx отлично работает. Я действительно использую slurp
Ответ №2:
Из-за того, как вы передаете свои переменные extra-vars
, это может быть так просто, как
facts: '{{ facts | combine({ "configured_status": status }) }}'
На самом деле это указано в документации:
Значения, передаваемые с использованием
key=value
синтаксиса, интерпретируются как строки. Используйте формат JSON, если вам нужно передать что-либо, что не должно быть строкой (логические значения, целые числа, числа с плавающей запятой, списки и т. Д.).
Таким образом, вам даже не нужно защищать вас от того, чтобы Ansible рассматривал его как логическое значение, как в приведенном ниже руководстве.
Теперь, не могли бы вы передать ее как реальное логическое значение:
ansible-playbook script.yml --extra-vars '{ "status": false }'
Тогда вложение разделителей Jinja никогда не приведет вас ни к чему хорошему.
Здесь вы хотите использовать оператор сопоставления Jinja ~
, чтобы вы могли объединить строку и переменную, которая status
содержит.
Учитывая сценарий, play.yml:
- hosts: all
gather_facts: no
tasks:
- debug:
msg: '{{ facts | combine({ "configured_status": "" ~ status ~ "" })}}'
vars:
facts:
foo: bar
Выполнить с помощью команды
ansible-playbook play.yml --extra-vars "status=false"
Это приводит к повторению:
PLAY [all] *******************************************************************************************************
TASK [debug] *****************************************************************************************************
ok: [localhost] => {
"msg": {
"configured_status": "false",
"foo": "bar"
}
}
PLAY RECAP *******************************************************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0