快速入门:使用 Azure CLI 管理单个虚拟 IoT 设备

重要

此文档不再更新,将被删除。 有关尝试 OSConfig 方案的 up-to日期说明:

  1. 首先,在 5 分钟内按照 创建 OSConfig(使用 Azure IoT)实验室环境的步骤操作
  2. 接下来,尝试以下任一方案:可以预配和管理哪些方案?

本快速入门的目标是通过 OSConfig for IoT 熟悉 IoT/Edge 设备的远程管理。 在第 1 部分中,将设置测试环境,包括创建 VM 以充当虚拟 IoT 设备。 在第 2 部分中,你将执行多个设备管理操作,例如:

  • 远程检索设备的 IP 地址
  • 从设备的角度远程测试终结点连接
  • 远程重启设备
  • 和更多

本快速入门使用单个示例设备。 若要大规模使用 OSConfig,请使用 Iot Hub 设备管理 服务作为控制平面,而不是单独的 Azure CLI 命令。

先决条件

  1. 需要具有活动订阅的 Azure 帐户。 如果需要,可以 免费创建帐户
  2. 将使用 Azure Cloud Shellbash 环境
    • 注意:如果这是你第一次使用 Azure Cloud Shell,门户将引导你在继续之前创建一些存储空间。 这是正常的。
    • 注意:Azure Cloud Shell 已有最新的 Azure CLI 工具,并且会自动登录到 Azure 帐户。 如果想要使用自己的 bash 环境,而不是 cloud shell,可以在自己的 bash 环境中 安装和配置 Azure CLI
  3. 需要使用适用于 Azure CLI 的 Azure IOT 扩展,可以使用以下命令添加该扩展:
az extension add --name azure-iot

显示 az extension add --name azure-iot 的 屏幕截图

验证先决条件

  • Azure Cloud Shell(或备用 bash 环境),确保 Azure CLI 登录到要使用的 Azure 帐户和订阅上下文。
az account show

命令的 屏幕截图:az account show

如果需要使用不同的帐户登录或更改订阅,可以使用 az loginaz account set 命令。

快速入门环境概述

上下文关系图,其中显示了用于创建 IoT 中心和 VM 的 Azure CLI,以及用于使用 OSConfig

第 1 部分:设置环境

1.1:创建 Azure IoT 资源

1.1.1:为 IoT 中心定义唯一名称

需要为 IoT 中心创建唯一名称,例如 “QuickStart12345”“HelloWorld98765”。 该名称将在后面的命令中重复使用,因此我们会将其存储在 bash 变量中,如下所示:

# In the following command replace <Your_Made_Up_Name_Here> 
# with your own preferred hub name, for example:
# MY_IOT_HUB_NAME="MyQuickStart54321"
MY_IOT_HUB_NAME="<Your_Made_Up_Name_Here>"

将 IOT 中心选择的唯一名称分配给变量MY_IOT_HUB_NAME的 bash 示例 屏幕截图

1.1.2:创建资源组和 IoT 中心

az group create --resource-group QuickstartOSConfig --location westus
az iot hub create --resource-group QuickstartOSConfig --name "$MY_IOT_HUB_NAME" --query id

az group create 命令 的 屏幕截图

az iot hub create 命令 的 屏幕截图

提示

如果 az iot hub create... 命令失败,并出现名称不可用的错误,则表示所选名称已在 Azure 中的其他位置使用。 若要解决此问题,请使用新的更唯一的名称重复上述 MY_IOT_HUB_NAME="<Your_Made_Up_Name_Here>" 步骤,然后再次尝试 az iot hub create ... 命令。

提示

az iot hub create... 命令完成几分钟并不罕见。

1.1.3:创建设备 ID 并获取设备连接字符串

az iot hub device-identity create --hub-name "$MY_IOT_HUB_NAME" -d device01 --query deviceId
az iot hub device-identity connection-string show --hub-name "$MY_IOT_HUB_NAME" --device-id device01

示例 az iot 命令 的 屏幕截图

提示

记下最后一个命令返回的 connectionString 值(以 HostName=开头)。 将在后面的步骤中使用此连接字符串。

1.2:创建 Azure VM 以充当虚拟 IoT 设备

使用以下命令创建虚拟机。

az vm create --resource-group QuickstartOSConfig --name device01 --image Canonical:UbuntuServer:18.04-lts:latest --admin-username azureuser --generate-ssh-keys --query publicIpAddress

az vm create 命令 的 屏幕截图

提示

记下最后一个命令返回的 IP 地址。 在以下步骤中,你将使用此地址。

1.3:在虚拟 IoT 设备上安装客户端软件

1.3.1:建立对虚拟设备的 终端访问

接下来的几个命令需要在刚创建的 VM 上运行 。 使用 SSH 进行连接:

# In the following command, replace <public ip address from previous step> with
# the actual IP address. For example:
# ssh azureuser@1.2.3.4
ssh azureuser@<ip address from previous step>

ssh 命令 的 屏幕截图

提示

ssh 客户端可能需要键入 yes 才能继续。 这是正常的。

提示

在继续操作之前,请检查你现在是否已连接到虚拟 IoT 设备。 命令提示符应已从 <your name>@azure: 更改为 azureuser@device01:。 如果命令提示符未更改为 azureuser@device01:,请再次运行上述 ssh 命令。

1.3.2:在虚拟设备上,安装 aziot-identity-service

sudo apt-get update
curl -sSL https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add
sudo apt-add-repository https://packages.microsoft.com/ubuntu/18.04/multiarch/prod
sudo apt-get update
sudo apt install -y aziot-identity-service

apt 命令 的 屏幕截图

apt 命令 的 屏幕截图 2

1.3.3:在虚拟设备上,应用连接字符串

使用以下命令将设备配置为向 Azure IoT 进行身份验证。 将使用之前在 创建 Azure IoT 资源获取的连接字符串值。

sudo aziotctl config mp --connection-string "<your connection string>"
sudo aziotctl config apply

aziotctl 命令 的 屏幕截图

1.3.4:在虚拟设备上,安装 OSConfig 包 并观察它正在运行

sudo apt install -y osconfig
sudo systemctl status osconfig | grep --color=never Active

sudo apt install -y osconfig 的 屏幕截图

1.2.5:退出 SSH 会话

exit

从 ssh 会话退出的屏幕截图,返回到 cloud shell 会话

第 2 部分:使用适用于 IoT 的 OSConfig

你做了! 准备好环境后,我们便可以开始使用 OSConfig 通过 IoT 中心获取和设置主机级配置和状态。 在 Azure Cloud Shell 或计算机中,使用以下 Azure CLI 命令完成每个示例。

2.1:这是否在?

我们将首先获取设备的 IoT 中心 deviceId,并显示 OSConfig 处于活动状态。

az iot hub query --hub-name "$MY_IOT_HUB_NAME" -q "select deviceId,moduleId,connectionState from devices.modules where deviceID='device01' and moduleId='osconfig'"

az iot hub query 命令 的 屏幕截图

2.2:获取 IoT 中心中任何已启用 OSConfig 的设备的设备网络状态,例如 IP 地址和 DNS 服务器

报告托管设备中的网络状态有许多用例。 例如,可能需要本地 IP 地址来连接本地 IP 视频流。同样,你可能希望报告 DNS 服务器用于故障排除或确保设备使用预期的网络基础结构。 以下示例检索分配给每个网络适配器的 IP 地址和 DNS 服务器。

az iot hub query --hub-name "$MY_IOT_HUB_NAME" -q "select deviceId,properties.reported.Networking.NetworkConfiguration.IpAddresses,properties.reported.Networking.NetworkConfiguration.DnsServers from devices.modules where moduleId='osconfig'"

az iot query (其他) 的 屏幕截图

提示

返回的 IP 信息从设备的角度来看,与在设备上本地运行 ifconfigip address 的内容相匹配。 Azure 公共 IP 地址(以前用于 SSH)是在 VM 外部路由的 NAT,因此此处未显示此地址。

2.3:配置 Azure 设备运行状况服务(ADHS)遥测策略,并验证符合性

ADHS 是某些设备中包含的诊断代理。 刚刚创建的 VM 未安装 ADHS,但仍可以主动将策略设置为示例。

第一个命令将 ADHS 的孪生所需属性设置为 2(这意味着选择加入)。 第二个命令比较所需(由你、管理员设置)和报告(由设备发送)版本的属性,以验证设备是否已收到并应用策略。

az iot hub module-twin update --hub-name "$MY_IOT_HUB_NAME" -d device01 -m osconfig --desired '{"Settings":{"__t":"c","DeviceHealthTelemetryConfiguration":2}}' > /dev/null
az iot hub query --hub-name "$MY_IOT_HUB_NAME" -q "select deviceId,properties.desired.Settings.DeviceHealthTelemetryConfiguration AS ADHSLevel_Desired,properties.reported.Settings.DeviceHealthTelemetryConfiguration.value AS ADHSLevel_Reported from devices.modules where moduleId='osconfig'"

az iot query 的 屏幕截图(另一个附加示例)

2.4:应用自定义配置(时区示例)

OSConfig 的 CommandRunner 功能使你能够获取和设置设备上的几乎所有内容。 本示例将设备的 OS 时区设置为 UTC。 在终结点上强制实施统一时区(无论其物理位置如何),是在整个分布式解决方案中改进时间戳处理的常见做法。

以下 Azure CLI 命令告知 OSConfig 使用 timedatectl设置时区,并报告生成的时区。

az iot hub module-twin update --hub-name "$MY_IOT_HUB_NAME" -d device01 -m osconfig --desired '{"CommandRunner":{"__t":"c","CommandArguments":{"CommandId":"my_timezone_config", "Action":3, "Arguments": "timedatectl set-timezone UTC; timedatectl | grep zone | tr -d '[:space:]'"}}}' --query "properties.desired.CommandRunner"

az iot hub module-twin update 命令 的 屏幕截图

输出显示我们在孪生体中设置了所需的命令。 若要确认它正常工作,我们将采取其他步骤。 首先,我们将等待至少 30 秒 让设备接收命令、处理命令,并使用结果更新孪生体。

自上一个命令以来, 至少等待了 30 秒 ,请使用以下命令检索输出:

az iot hub query --hub-name "$MY_IOT_HUB_NAME" -q "select deviceId,properties.reported.CommandRunner.CommandStatus from devices.modules where moduleId='osconfig'"

az iot query (时区示例) 屏幕截图

2.5:测试设备连接(ping 示例)

此示例使用 CommandRunner 功能以及 ping 从设备的角度测试网络连接。

az iot hub module-twin update --hub-name "$MY_IOT_HUB_NAME" -d device01 -m osconfig --desired '{"CommandRunner":{"__t":"c","CommandArguments":{"CommandId":"connectivity_test_1", "Action":3, "Arguments":"ping -c 2 example.com"}}}' --query "properties.desired.CommandRunner"

az iot hub module-twin update 命令(ping 示例) 的屏幕截图

与前面的示例一样,az iot hub module-twin update 的输出显示我们在孪生体上设置了所需的命令属性,我们将使用第二步来检索结果。

自上一个命令以来,至少等待了 30 秒,请使用以下命令检索结果:

az iot hub query --hub-name "$MY_IOT_HUB_NAME" -q "select deviceId,properties.reported.CommandRunner.CommandStatus from devices.modules where moduleId='osconfig'"

az iot query (ping example) 的 屏幕截图

2.6:使用 CommandRunner 预定义的操作重新启动或关闭

以下示例重新启动设备。 若要改为关闭,请将 Action: 1 更改为所需属性值中的 Action: 2

az iot hub module-twin update --hub-name "$MY_IOT_HUB_NAME" -d device01 -m osconfig --desired '{"CommandRunner":{"__t":"c","CommandArguments":{"CommandId":"my_reboot_command", "Action":1}}}' --query "properties.desired.CommandRunner"

az iot hub module-twin update (reboot example) 的屏幕截图

清理资源

如果不打算保留任何资源,可以通过删除之前创建的资源组来删除它们。

az group delete --resource-group QuickstartOSConfig

屏幕截图 az group delete

后续步骤

  • 本指南仅使用一台设备快速入门。 若要大规模配置设备,可以将 OSConfig 与 IoT 中心设备管理 与 OSConfig 配合使用。
  • 若要了解有关 OSConfig 的详细信息,请参阅:OSConfig 文档