Ansible - 有没有办法访问 USB 设备?

问题描述 投票:0回答:2

我正在为我的 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设备相关的模块。

linux ansible ansible-facts
2个回答
0
投票

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


0
投票

对于稍后阅读本文的任何人,现在有一个 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 }}"
© www.soinside.com 2019 - 2024. All rights reserved.