繁体   English   中英

如何将 set_fact 设置的 json 变量传递给 ansible shell 任务中的 jq 管道?

[英]How can I pass a json variable set by set_fact to jq pipeline in ansible shell task?

我有一个 ansible 剧本,它使用set_fact模块设置了一个 json 变量。 我正在尝试在 ansible 剧本中使用 jq 命令,将 json 转换为特定格式,但出现解析错误: Invalid numeric literal at line, column

我的剧本:

- name: get data
  set_fact:
    data: "{{ value.stdout | from_json }}"

- name: get key value pairs
  shell:  echo "{{ data }}" | jq 'to_entries | map((.key) + "=" + .value)|join(",")'
  register: key_value

错误:

TASK [utils : debug] *************************************************************************************
ok: [localhost] => {
    "data": {
        "key1": "keyval1",
        "key2": "keyval2"
    }
}

TASK [utils : get key value pairs] ***************************************************************
FAILED! => {"changed": true, "cmd": "echo \"{'key1': 'keyval1', 'key2': 'keyval2'}\" | jq 'to_entries | map((.key) + \"=\" + .value)|join(\",\")'", "stderr": "parse error: Invalid numeric literal at line , column", "stderr_lines": ["parse error: Invalid numeric literal at line , column"], "stdout": "", "stdout_lines": []}

PS:我曾尝试使用在如何在 ansible shell 任务中使用 jq 中指定的 > YAML 构造,但得到相同的错误

- name: get key value pairs
  shell:  >
     echo "{{ data }}" 
     | jq 'to_entries | map((.key) + "=" + .value)|join(",")'
  register: key_value

我使用set_fact模块设置的data变量:

"data": {
        "key1": "keyval1",
        "key2": "keyval2"
}

工作 jq 命令和预期 output: jqPlay

如何将使用set_fact设置的事实变量集传递给 ansible 中的 jq 管道?

错误似乎是 jq 抱怨传递给它的 JSON。 正如@knittl 所述,错误消息中打印的 json 无效 JSON。 尽管调试打印出有效的 JSON,但不知何故双引号被单引号取代。 无效的 JSON 被传递给 jq。

用双引号替换单引号解决了这个问题。

shell: echo "{{ data }}" | sed "s/'/\"/g" | jq 'to_entries | map((.key) + "=" + .value)|join(",")'

或者

shell: echo "{{ data | to_json }}"| jq 'to_entries | map((.key) + "=" + .value)|join(",")'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM