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