[英]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.