我正在为我的树莓派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
的评论,您可能可以使用预处理输出的方法。
jc
)和jc.parsers.lsub
工具。您的命令只能更改为jc lsusb -v
。转换器似乎是可用的Ansible模块太jc
过滤器-转换输出的许多shell命令和文件类型到JSON。
通过这两种方式,您可以获得更小、更简单、更少和更容易维护的代码,以及JSON格式的数据结构。此外,由于不需要grep
,awk
和regex_search
,因此可以进行另一种数据处理。