Ansible -是否有一种方法可以访问USB设备?



我正在为我的树莓派4构建一个剧本,我有一个需要访问打印机(在/dev/bus/usb/XXX/YYY)设备的podman容器。

我有一个任务做这项工作,但它使用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设备相关的模块。

Ansible -是否有一种方法可以访问USB设备?

简短的回答是肯定的,有多种可能的方法。

尽管在评论中已经给出了关于使用或开发自定义模块的建议,关于

有没有更干净的方法来获得…

你可以看看下面的方法

---
- hosts: localhost
become: true # is necessary to gather data
gather_facts: false
tasks:
- name: List USB hardware
command: lshw -json
register: lshw
- name: Show USB hardware
debug:
msg: "{{ lshw.stdout }}"

导致输出(例如)

...
"children" : [                                                                                                                                                                                                                                                                                                                                                                                                                                                                 {
"id" : "usb",
"class" : "bus",
"claimed" : true,
"handle" : "PCI:0000:00:14.0",
"description" : "USB controller",
"product" : "C620 Series Chipset Family USB 3.0 xHCI Controller",
"vendor" : "Intel Corporation",
"physid" : "14",
"businfo" : "pci@0000:00:14.0",
"version" : "09",
"width" : 64,
"clock" : 33000000,
"configuration" : {
"driver" : "xhci_hcd",
"latency" : "0"
},
"capabilities" : {
"pm" : "Power Management",
"msi" : "Message Signalled Interrupts",
"xhci" : true,
"bus_master" : "bus mastering",
"cap_list" : "PCI capabilities listing"
},
"children" : [
{
"id" : "usbhost:0",
"class" : "bus",
"claimed" : true,
"handle" : "USB:2:1",
"product" : "xHCI Host Controller",
"vendor" : "Linux 4.18.0-000.0.0.el8.x86_64 xhci-hcd",
"physid" : "0",
"businfo" : "usb@2",
"logicalname" : "usb2",
"version" : "4.18",
"configuration" : {
"driver" : "hub",
"slots" : "16",
"speed" : "480Mbit/s"
},
"capabilities" : {
"usb-2.00" : "USB 2.0"
},
"children" : [
{
"id" : "usb",
"class" : "bus",
"claimed" : true,
"handle" : "USB:2:3",
"description" : "USB hub",
"product" : "Hub",
"vendor" : "Microchip Technology, Inc. (formerly SMSC)",
"physid" : "3",
"businfo" : "usb@2:3",
"version" : "8.01",
"configuration" : {
"driver" : "hub",
"maxpower" : "2mA",
"slots" : "2",
"speed" : "480Mbit/s"
},
"capabilities" : {
"usb-2.00" : "USB 2.0"
}
}
]
},
{
"id" : "usbhost:1",
"class" : "bus",
"claimed" : true,
"handle" : "USB:3:1",
"product" : "xHCI Host Controller",
"vendor" : "Linux 4.18.0-000.0.0.el8.x86_64 xhci-hcd",
"physid" : "1",
"businfo" : "usb@3",
"logicalname" : "usb3",
"version" : "4.18",
"configuration" : {
"driver" : "hub",
"slots" : "10",
"speed" : "5000Mbit/s"
},
"capabilities" : {
"usb-3.00" : true
},
"children" : [
]
}
]
}
...

这里假设lshw预安装在远程节点上,这是某些Linux发行版的情况。它能够列出特定对象类的信息,并可以提供JSON格式的输出,可以很容易地通过Ansible注册和处理。

您可以通过sudo lshw -short查找可用的类。USB设备在bus类后面,所以lshw -class bus -json可能就足够了。我将把进一步的测试和实现留给你。

进一步阅读

  • man lshw
  • 在RHEL 7中包含lshw

关于您对lsusb的评论,您可能可以使用预处理输出的方法。

要做到这一点,您可以查看JSON转换(jc)和jc.parsers.lsub工具。您的命令只能更改为jc lsusb -v。转换器似乎是可用的Ansible模块太jc过滤器-转换输出的许多shell命令和文件类型到JSON。

通过这两种方式,您可以获得更小、更简单、更少和更容易维护的代码,以及JSON格式的数据结构。此外,由于不需要grep,awkregex_search,因此可以进行另一种数据处理。

最新更新