如何在ansible shell任务中使用jq
我试图在ansible剧本中使用jq命令,在运行shell命令时遇到问题如何在ansible shell任务中使用jq,ansible,Ansible,我试图在ansible剧本中使用jq命令,在运行shell命令时遇到问题 --- - name: shell hosts: localhost gather_facts: False vars: hbawwn_statement: '{ "HBA WWN" : "Pass" , "Result" : "a\nb" }' arrayno_statement: '{ "Storage
---
- 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、 文本 输出
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,但这不是有效的语法错误。
如何在ansible playbook中处理此问题而不创建txt文件。虽然zeitounator和mdaniel对该问题的评估非常正确,但我建议使用
YAML结构,而不是在已被引用的表达式周围添加另一对引号:
。。。
-名称:jq命令
外壳:>
回声“{sk_out}”
|jq'map_值(.Result | split(“\n”))| transpose | map({“主机适配器类型”:[0],“主机适配器插槽”:[1],“存储阵列号”:[2],“HBA WWN”:[3]})
|jq-n.““切割表”|=[输入]”
登记:退出
...
我相信这会使您的代码更易于阅读和维护
这就是说,这个字典(或者映射,或者哈希表,或者关联数组,不管你怎么称呼它)操作可以在ansible本身内部执行,不需要在上面执行shell
+jq
。请看Ansible过滤器:
以及Jinja2(模板引擎)内置过滤器:
嗯
Alex我不确定你到底想做什么,但作为一个例子,你可以:
-设置事实:
stmt|u键:{{stmt|u键| d([])+[(项|列表|拒绝('equalto','Result')|列表)[0]}”
stmt_结果:{{stmt_结果| d([])+[item['Result'].split('\n')]}”
循环:{{sk_out}}”
-设定事实:
alt_out:{{stmt_键| zip(stmt_结果)|列表}”
-名称:非jq命令
调试:
msg:alternate={item}
循环:{{alt_out}}”
这将生成输出:
...
TASK [non-jq command] *****************************************************************************
ok: [localhost] => (item=['Host Adapter Type', ['AJB/AHA', 'AJB/AHA']]) => {
"msg": "alternate=['Host Adapter Type', ['AJB/AHA', 'AJB/AHA']]"
}
ok: [localhost] => (item=['Host Adapter Slot', ['PCI Slot 3', 'PCI Slot 2']]) => {
"msg": "alternate=['Host Adapter Slot', ['PCI Slot 3', 'PCI Slot 2']]"
}
ok: [localhost] => (item=['Storage Array Number', ['0001a', '0001b']]) => {
"msg": "alternate=['Storage Array Number', ['0001a', '0001b']]"
}
ok: [localhost] => (item=['HBA WWN', ['a', 'b']]) => {
"msg": "alternate=['HBA WWN', ['a', 'b']]"
}
引用整个命令(以及相应的转义引号),而不仅仅是开始时的jinja2表达式。还请注意,如果您只是输出var(即未找到命令),而不是使用例如
echo
将其传递到管道中的下一个jq,或者利用jq从stdin读取的事实,bash将出错
...
TASK [non-jq command] *****************************************************************************
ok: [localhost] => (item=['Host Adapter Type', ['AJB/AHA', 'AJB/AHA']]) => {
"msg": "alternate=['Host Adapter Type', ['AJB/AHA', 'AJB/AHA']]"
}
ok: [localhost] => (item=['Host Adapter Slot', ['PCI Slot 3', 'PCI Slot 2']]) => {
"msg": "alternate=['Host Adapter Slot', ['PCI Slot 3', 'PCI Slot 2']]"
}
ok: [localhost] => (item=['Storage Array Number', ['0001a', '0001b']]) => {
"msg": "alternate=['Storage Array Number', ['0001a', '0001b']]"
}
ok: [localhost] => (item=['HBA WWN', ['a', 'b']]) => {
"msg": "alternate=['HBA WWN', ['a', 'b']]"
}