问题 阅读json就像ansible中的变量一样


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

{
  "queue": {
    "first": {
      "car": "bmw",
      "year": "1990",
      "model": "x3",
      "color": "blue"
    },
    "second": {
      "car": "bmw",
      "year": "2000",
      "model": "318",
      "color": "red"
    }
  }
}

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

- name: test loop
  with_dict: "{{jsonVar}}"
  shell:  |
        if echo "blue" | grep -q "${{item.value.color}}" ; then
           echo "success"

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


7110
2018-04-19 20:26


起源



答案:


您可以使用名为的查找插件读取json文件 file 并把它传递给 from_json jinja2过滤器。你也有错误 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

9
2018-04-19 21:52



感谢@Strahinja Kustudic的回复!我想知道我是否可以在不使用文件插件的情况下实现我的目标?或from_json - tkyass
如果要将json转换为字典,则必须使用 from_json。你不必使用 file 虽然查找插件,你可以使用 command 任务,例如 command: cat var.json 结合起来 register: var 然后使用 set_fact: jsonVar: {{ var.stdout | from_json }}。 - Strahinja Kustudic
@StrahinjaKustudic是 from_json 记录在哪里?我偶然发现了这个答案并意识到了这一点 lookup 也许会支持 from_yaml 它工作了!!!谢谢... - Ajoy
都 from_json 和 from_yaml 在官方文档中 docs.ansible.com/ansible/... - Strahinja Kustudic


答案:


您可以使用名为的查找插件读取json文件 file 并把它传递给 from_json jinja2过滤器。你也有错误 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

9
2018-04-19 21:52



感谢@Strahinja Kustudic的回复!我想知道我是否可以在不使用文件插件的情况下实现我的目标?或from_json - tkyass
如果要将json转换为字典,则必须使用 from_json。你不必使用 file 虽然查找插件,你可以使用 command 任务,例如 command: cat var.json 结合起来 register: var 然后使用 set_fact: jsonVar: {{ var.stdout | from_json }}。 - Strahinja Kustudic
@StrahinjaKustudic是 from_json 记录在哪里?我偶然发现了这个答案并意识到了这一点 lookup 也许会支持 from_yaml 它工作了!!!谢谢... - Ajoy
都 from_json 和 from_yaml 在官方文档中 docs.ansible.com/ansible/... - Strahinja Kustudic


你可以使用| 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']')}}"

但请注意Ansible版本等要求


2
2018-03-30 10:53