引号内的变量

Variable inside quotes

我正在尝试将变量传递到 Ansible 剧本中。

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"

有人知道可能是什么问题吗?

由于您将变量传递给 extra-vars 的方式,这可以像

一样简单
facts: '{{ facts | combine({ "configured_status": status }) }}'

这实际上在文档中指出:

Values passed in using the key=value syntax are interpreted as strings. Use the JSON format if you need to pass in anything that shouldn’t be a string (Booleans, integers, floats, lists etc).

来源: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   

尝试

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