在ansible中读取json就像变量一样

tky*_*ass 14 ansible ansible-2.x

我是ansible的新手,我在从ansible角色的json文件中读取值时遇到问题.我的变量有如下值:

{
  "queue": {
    "first": {
      "car": "bmw",
      "year": "1990",
      "model": "x3",
      "color": "blue"
    },
    "second": {
      "car": "bmw",
      "year": "2000",
      "model": "318",
      "color": "red"
    }
  }
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试打印颜色的值,仅将其与其他变量进行比较.我曾经with_dict迭代过json对象(存储在名为jsonVar的变量中),如下所示:

- name: test loop
  with_dict: "{{jsonVar}}"
  shell:  |
        if echo "blue" | grep -q "${{item.value.color}}" ; then
           echo "success"
Run Code Online (Sandbox Code Playgroud)

到目前为止,从if语句中将json的颜色值与"蓝色"进行比较是没有运气的.我想知道我做错了什么?提前致谢!

Str*_*dic 13

您可以使用调用的查找插件读取json文件file,并将其传递给from_jsonjinja2过滤器.你也有错误的with_dict循环,因为你必须循环jsonVar['queue'],而不仅仅是jsonVar.这是一个有效的完整代码:

---
- hosts: your_host
  vars:
    jsonVar: "{{ lookup('file', 'var.json') | from_json }}"
  tasks:
    - name: test loop
      with_dict: "{{ jsonVar['queue'] }}"
      shell: |
        if echo "blue" | grep -q "{{ item.value.color }}" ; then
            echo "success"
        fi
Run Code Online (Sandbox Code Playgroud)


小智 8

您可以使用| json_query过滤器。

http://docs.ansible.com/ansible/playbooks_filters.html#json-query-filter

但是请确保您输入的文件也采用适当的格式,否则请使用两个过滤器,第一个过滤器转换为适当的过滤器,第二个过滤器执行json查询。

例如:- {{ variable_name | from_json | json_query('')}}

对于您而言,我认为这会有所帮助:

tasks: print the color
set_fact:
  color1 : "{{ jsonVar | from_json | json_query('queue.[0].['color']')}}"
  color2 : "{{ jsonVar | from_json | json_query('queue.[1].['color']')}}"
Run Code Online (Sandbox Code Playgroud)

但请注意类似Ansible版本的要求