ansible-json_查询将布尔值与外部变量进行比较
我试图在json_查询中通过比较dict的值和playbook的其他变量在ansible中进行测试: 我的格言:ansible-json_查询将布尔值与外部变量进行比较,ansible,jinja2,Ansible,Jinja2,我试图在json_查询中通过比较dict的值和playbook的其他变量在ansible中进行测试: 我的格言: cust_pkg: - { name: "a" } - { name: "b", web: true } 我想作为输出: 当web_主机为true时 dict_pkg: - { name: "a" } - { name: "b", web: true } 否则(web_主机错误或未定义) 我试着这样做: - set_fact: dict_pkg: "{{
cust_pkg:
- { name: "a" }
- { name: "b", web: true }
我想作为输出:
当web_主机为true时
dict_pkg:
- { name: "a" }
- { name: "b", web: true }
否则(web_主机错误或未定义)
我试着这样做:
- set_fact:
dict_pkg: "{{ cust_pkg | json_query(\"[?web == '\" + web_host + \"']\") }}"
但是,我有一个错误:
{"msg": "Unexpected templating type error occurred on ({{ cust_pkg | json_query(\"[?web == '\" + web_host + \"']\") }}): cannot concatenate 'str' and 'bool' objects"}
然后如何根据外部布尔变量进行筛选
谢谢
无法连接“str”和“bool”对象
您希望错误消息的清晰度如何
您需要将该值显式强制为str
,以便类型匹配:
dict_pkg: "{{ cust_pkg | json_query(\"[?web == `\" + (web_host|lower) + \"`]\") }}"
接下来,你可能想考虑改变YAML构造以避免引用地狱:
dict_pkg: >-
{{ cust_pkg | json_query("[?web == `" + (web_host|lower) + "`]") }}
谢谢,这就是你的窍门:
---
- hosts: localhost
gather_facts: false
vars:
cust_pkg:
- { name: "a" }
- { name: "b", web: true }
tasks:
- name: Step 1
debug:
msg: "{{ cust_pkg | json_query(\"[?web == nul || web == `\" + (web_host|default('false')|lower) + \"`]\") }}"
输出:
$ ansible-playbook test.yml
PLAY [localhost] ***************************************************************
TASK [Step 1] ******************************************************************
ok: [localhost] => {
"msg": [
{
"name": "a"
}
]
}
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
以及:
在初始消息中添加的Post cust_pkg和desired dict_pkg.似乎不起作用:
“msg:“该任务包含一个带有未定义变量的选项。错误是:'str'未定义…
该死,对不起!我通常会在建议之前尝试这些方法,但我认为这一方法太“简单”,所以我没有:-(但是,如果我真的首先测试了答案,我会意识到您需要在jmespath中使用反勾号来使用文字true
或false
,而不是像您之前尝试的那样使用单引号。我已经用所有这些更新了我的答案。)
$ ansible-playbook test.yml
PLAY [localhost] ***************************************************************
TASK [Step 1] ******************************************************************
ok: [localhost] => {
"msg": [
{
"name": "a"
}
]
}
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0
$ ansible-playbook test.yml --extra-vars="web_host=true"
PLAY [localhost] ***************************************************************
TASK [Step 1] ******************************************************************
ok: [localhost] => {
"msg": [
{
"name": "a"
},
{
"name": "b",
"web": true
}
]
}
PLAY RECAP *********************************************************************
localhost : ok=1 changed=0 unreachable=0 failed=0