【发布时间】:2020-09-24 11:30:52
【问题描述】:
我正在尝试在 ansible playbook 中使用 jq 命令,但在运行 shell 命令时遇到问题
---
- name: shell
hosts: localhost
gather_facts: False
vars:
hbawwn_statement: '{ "HBA WWN" : "Pass" , "Result" : "a\nb" }'
arrayno_statement: '{ "Storage Array Number" : "Pass" , "Result" : "0001a\n0001b" }'
adapterslot_statement: '{ "Host Adapter Slot" : "Pass" , "Result" : "PCI Slot 3\nPCI Slot 2" }'
adaptertype_statement: '{ "Host Adapter Type" : "Pass" , "Result" : "AJB/AHA\nAJB/AHA" }'
tasks:
- name: test
set_fact:
sk_out: "[{{ adaptertype_statement }}, {{ adapterslot_statement }}, {{ arrayno_statement }}, {{ hbawwn_statement }}]"
- debug:
msg: "{{ sk_out }}"
- name: jq command
shell: {{ sk_out }} | jq 'map_values(.Result | split("\n")) | transpose | map( {"Host Adapter Type":.[0], "Host Adapter Slot":.[1], "Storage Array Number":.[2],"HBA WWN":.[3]})' | jq -n '."CUT Sheet " |= [inputs]'
register: out
- debug:
msg: "{{ out.stdout }}"
出现错误
错误!加载 YAML 时出现语法错误。
需要注释或换行符,但找到了 'j'\
错误似乎在“test_jq.yml”中:第 22 行第 29 列,但可能 根据确切的语法问题,位于文件的其他位置。
违规行似乎是:
- name: jq command
shell: {{ sk_out }} | jq 'map_values(.Result | split("\n")) | transpose | map( {"Host Adapter Type":.[0], "Host Adapter Slot":.[1], "Storage Array Number":.[2],"HBA WWN":.[3]})' | jq -n '."CUT Sheet " |= [inputs]'
^ here
我们可能错了,但这个看起来可能是一个问题 缺少引号。总是引用模板表达式括号 开始一个值。例如:
TASK [debug]
ok: [localhost] => {
"msg": [
{
"Host Adapter Type": "Pass",
"Result": "AJB/AHA\nAJB/AHA"
},
{
"Host Adapter Slot": "Pass",
"Result": "PCI Slot 3\nPCI Slot 2"
},
{
"Result": "0001a\n0001b",
"Storage Array Number": "Pass"
},
{
"HBA WWN": "Pass",
"Result": "a\nb"
}
]
}
已验证将 {{ sk_out }} 的内容复制到 txt 文件中
s.txt
[
{
"Host Adapter Type": "Pass",
"Result": "AJB/AHA\nAJB/AHA"
},
{
"Host Adapter Slot": "Pass",
"Result": "PCI Slot 3\nPCI Slot 2"
},
{
"Result": "0001a\n0001b",
"Storage Array Number": "Pass"
},
{
"HBA WWN": "Pass",
"Result": "a\nb"
}
]
输出
cat s.txt | jq 'map_values(.Result | split("\n")) | transpose | map( {"Host Adapter Type":.[0], "Host Adapter Slot":.[1], "Storage Array Number":.[2],"HBA WWN":.[3]})' | jq -n '."CUT Sheet " |= [inputs]'\
此命令有效
试图添加括号,如 shell: "{{ sk_out }}" | jq 但这是不工作的语法错误。
如何在不创建 txt 文件的情况下在 ansible playbook 中处理这个问题。
【问题讨论】:
-
引用整个命令(并相应地转义引号),而不仅仅是开始时的 jinja2 表达式。另请注意,如果您只是输出您的 var(即未找到命令)而不是使用例如,bash 将出错。
echo将其传递给管道中的下一个 jq。 -
或者利用 jq 使用
args: stdin: "{{ sk_out }}"从标准输入读取的事实
标签: ansible