簡體   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