Переменная в кавычках

#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, если вам нужно передать что-либо, что не должно быть строкой (логические значения, целые числа, числа с плавающей запятой, списки и т. Д.).

Источник: https://docs.ansible.com/ansible/2.9/user_guide/playbooks_variables.html#passing-variables-on-the-command-line

Таким образом, вам даже не нужно защищать вас от того, чтобы 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