Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
ansible-json_查询将布尔值与外部变量进行比较_Ansible_Jinja2 - Fatal编程技术网

ansible-json_查询将布尔值与外部变量进行比较

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: "{{

我试图在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 | 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