我正在为我的Raspberry Pi 4构建一个剧本,我有一个podman
容器,需要访问打印机(在/dev/bus/usb/XXX/YYY
中)设备。
我有一个任务可以完成这项工作,但它使用了shell
模块,不推荐使用该模块:
- name: "ScannerJS - Detect printer's USB bus"
block:
- name: "ScannerJS - Detect printer's USB bus"
ansible.builtin.shell: |
set -e -o pipefail
lsusb | grep Epson | awk '{print "/dev/bus/usb/"$2"/"substr($4, 1, length($4)-1)}'
args:
executable: /bin/bash
register: scUSBBus
failed_when: scUSBBus.stdout | regex_search("^\/dev\/bus\/usb\/(\\d{3})\/(\\d{3})$") is none
- name: "ScannerJS - assert the device path exists"
ansible.builtin.stat:
path: "{{ scUSBBus.stdout }}"
register: scUSBBusStat
failed_when: scUSBBusStat.stat.exists is not true
是否有更干净的方法来获取打印机的总线/USB?
我试着在事实中搜索,但没有关于USB设备的任何内容,我找不到任何与USB设备相关的模块。
1条答案
按热度按时间cwdobuhd1#
简短的回答是肯定的,有多种可能的方法。
尽管在注解中已经给出了关于使用或Developing Custom Modules的建议,但关于
您可以考虑以下方法
导致输出(在示例中
这里假设
lshw
已预装在远程节点上,这是某些Linux发行版的情况。它能够列出某些对象类的信息,并提供JSON格式的输出,可以通过Ansible轻松注册和处理。你可以通过
sudo lshw -short
查找可用的类。USB设备在bus
类后面,所以lshw -class bus -json
可能就足够了。我将把进一步的测试和实现留给你。进一步阅读
man lshw
lshw
in RHEL 7关于您对
lsusb
的评论,您可能会使用一种预处理输出的方法。为此,您可以使用JSON Convert(
jc
)和jc.parsers.lsub
工具。您的命令只能更改为jc lsusb -v
。该转换器似乎也可以作为Ansible模块jc
filter – Convert output of many shell commands and file-types to JSON使用。这两种方法都可以让代码更小、更简单、更少、更容易维护,并且已经是JSON格式的数据结构。此外,由于不需要
grep
、awk
和regex_search
,因此可以进行另一种数据处理。