如何在ansible shell任务中使用jq

如何在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

我试图在ansible剧本中使用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、 文本

输出

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']]"
}