我正在为我的 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设备相关的模块。
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
就足够了。我将把进一步的测试和实施留给你。
进一步阅读
关于您对
lsusb
的评论,您可能可以使用预处理输出的方法。
为此,您可以查看工具 JSON Convert (
jc
) 和 jc.parsers.lsub
。
您的命令只能更改为 jc lsusb -v
。该转换器似乎也可用作 Ansible 模块 jc
过滤器 – 将许多 shell 命令和文件类型的输出转换为 JSON。
通过这两种方式,您都可以获得更小、更简单、更少且更容易维护的代码以及已经采用 JSON 格式的数据结构。此外,还有另一种数据处理,因为不需要
grep
、awk
和 regex_search
。
对于稍后阅读本文的任何人,现在有一个 facts 模块 可以收集有关 USB 设备的信息。
你可以这样使用它:
- name: Get information about USB devices
community.general.usb_facts:
- name: Print information about USB devices
ansible.builtin.debug:
msg: "On bus {{ item.bus }} device {{ item.device }} with id {{ item.id }} is {{ item.name }}"
loop: "{{ ansible_facts.usb_devices }}"