引号内的变量
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).
因此,您甚至不必像下面的剧本那样保护自己免受 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
我正在尝试将变量传递到 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).
因此,您甚至不必像下面的剧本那样保护自己免受 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