如何解决Ansible Junos_command模块无法使用管道符的问题
解决Ansible junos_command模块不支持管道符的问题
刚好我之前也碰到过这个情况,junos_command模块确实因为底层用的是NETCONF的<command> RPC,没法直接支持CLI里的管道修饰符(比如| match、| count这类)。不过有几个实用的替代方案可以搞定:
方案1:用junos_cli模块直接模拟CLI交互
这个模块是直接对接Junos CLI的,完全支持管道符,用法和junos_command类似:
- name: 执行带管道的CLI命令 junipernetworks.junos.junos_cli: command: "show interfaces terse | match ge-"
注意:需要确保设备开启了CLI远程访问权限,而且这个模块依赖junos-eznc库,得提前装好。
方案2:在Ansible端处理输出(推荐)
先用junos_command获取完整的命令输出,再用Ansible的过滤器做过滤,这种方法更符合NETCONF的设计思路,处理结构化数据也更靠谱:
处理文本输出
- name: 获取完整的接口信息 junipernetworks.junos.junos_command: commands: "show interfaces terse" register: full_output - name: 过滤出包含ge-的接口行 debug: msg: "{{ full_output.stdout[0] | regex_findall('^ge-\\S+.*$', multiline=True) }}"
处理结构化输出(更高效)
如果让junos_command返回JSON或XML格式的结构化数据,用json_query过滤会更精准:
- name: 获取结构化的接口数据(JSON格式) junipernetworks.junos.junos_command: commands: "show interfaces terse" format: json register: interface_data - name: 筛选名称以ge-开头的物理接口 debug: msg: "{{ interface_data.stdout[0].interface_information.physical_interface | selectattr('name', 'match', '^ge-') | list }}"
方案3:直接调用NETCONF RPC(最推荐)
很多CLI命令都有对应的NETCONF RPC,直接调用RPC并传入过滤参数,能直接拿到你要的结果,效率最高:
比如show interfaces terse | match ge-对应的RPC是get-interface-information,可以直接指定接口名称过滤:
- name: 通过RPC获取过滤后的接口信息 junipernetworks.junos.junos_rpc: rpc: get-interface-information args: terse: True interface_name: ge-* register: rpc_result
你可以根据自己的需求选最合适的方案,一般优先用结构化输出或者RPC的方式,比直接模拟CLI更稳定~
内容的提问来源于stack exchange,提问作者user2883071
相关产品推荐
相关产品推荐

