使用 Azure IoT 和 OSConfig 进行自定义配置和报告
本文内容
自定义报告和配置的常见示例
用例示例
后续步骤
本文旨在支持使用 Azure IoT 预配或管理设备 的人员。 如果这听起来不像你,请考虑查看 OSConfig 的受众文档 。
CommandRunner -->RunCommand 功能允许你权衡一些简单性,以获得灵活性。 如果需要,可以下拉抽象级别来执行自定义报告和配置。
验证设备与密钥终结点的连接
验证特定守护程序是否正在运行
调试或排查设备问题,例如收集日志文件并将其上传到云存储
将所有设备配置为在记录数据、生成时间戳等时使用所需的时区。
报告 (或配置自己的唯一设备组件) ,否则 OSConfig 永远不会知道
可能性是无休止的,几乎任何可以在 shell 中为一台设备执行的任务- 可以使用 Azure IoT 和 OSConfig CommandRunner 为设备群执行
这些示例可用作适应独特环境的起点。
每个示例包括用于在 Azure 门户 中工作的步骤和屏幕截图,以及使用 Azure CLI 在 bash 中工作的步骤和屏幕截图。
每个示例还包括一个设备 (的变体,例如故障排除方案) ,或许多设备 (,例如配置预配或报告方案) 。
预期内容 :
在单个设备说明中,你将直接在设备的 OSConfig 孪生中读取和写入报告和所需属性。 在大规模指令中,你将使用IoT 中心配置 (也称为“自动设备管理”或“ADM ”) 将所需属性推送到多个孪生体,并使用IoT 中心 (查询 单独使用,或作为指标 附加到“配置”) 来观察从设备返回的结果。
例如,如果使用本文进行参考 (,则在此处复制属性名称) ,则无需先决条件。
如果要尝试实时系统上的示例 (建议) ,则:
需要使用具有IoT 中心的 Azure 帐户
本文假设你熟悉IoT 中心和相关工具。 例如,它假设你愿意创建 IoT 中心和附加设备。 如果更倾向于从头开始安装和使用 OSConfig 的更规范性的分步介绍,请参阅: 快速入门:改用 Azure CLI 管理单个虚拟 IoT 设备 。
至少需要安装并连接到 Azure IoT 的 OSConfig 代理的 Linux 设备。
有关详细信息,请参阅: 如何以及如何安装适用于 Linux 的 OSConfig 代理 。
你将使用 Azure 门户或 Azure CLI 通过IoT 中心与设备交互
有关进一步步骤,请选择首选体验:
确保已登录到 Azure 门户,可以访问IoT 中心的“概述”页
使用要使用的帐户登录到 Azure 门户
在 bash 模式屏幕捕获中启动 Azure Cloud Shell
(可选) 使用命令 az account show
来确保已登录到要用于示例的上下文。
提示
应了解 CommandRunner 行为的两个事项才能使用以下示例成功:
如示例中所示,每个新请求必须包含 (的新值 commandId
可以是任何字符串,例如“MyCmd01”、“MyCmd02”) 。
该过程是异步的,因此结果无法即时提供。 最简单的过程是在启动 CommandRunner 请求后等待大约一分钟。 在该分钟后,无需执行任何额外的步骤,结果将可用 properties.reported.CommandRunner.commandStatus
。 有关刷新行为、异步状态更新等的详细信息,请参阅: 如何与 OSConfig 和 Azure IoT 的 CommandRunner 功能进行交互 。
在此示例中,我们要求设备 () ping www.github.com 3 次。 我们观察 ping 的退出代码 (成功或失败) ,我们可以观察 ping 命令的文本输出。
在IoT 中心的门户页中,导航到要管理的设备的 OSConfig 模块孪生。 然后将以下内容添加到 properties.desired
节 (后跟一个逗号,以将其与) 中的 properties.desired
下一项分开。
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "pingcmd",
"arguments": "ping -c 3 www.github.com",
"timeout": 120,
"singleLineTextResult": false,
"action": 3
}
}
可以通过检查 OSConfig 模块孪生本身对 ping 命令的响应来验证设备连接。 向下滚动模块孪生,查找 CommandRunner 的报告 属性。 检查 resultCode:0, 指示命令已成功,并显示 ping 命令输出的 textResult 。
在Azure IoT 中心的门户页中,选择“设备管理 ”-“>配置 ”-“>添加模块配置 ”。
指定一个名称,并使用所需的包管理器配置设置 孪生设置 。 将 模块孪生属性 设置为 properties.desired.CommandRunner
模块 孪生属性,并将模块孪生属性内容 设置为以下内容:
{"properties.desired.CommandRunner": {
"commandArguments": {
"commandId": "pingcmd",
"arguments": "ping -c 3 www.github.com",
"timeout": 120,
"singleLineTextResult": false,
"action": 3
}
}}
创建名称成功 和指标条件 的自定义指标 ,如下所示。 此指标查询将标识已成功 ping 终结点的所有设备。
SELECT deviceId FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.resultCode = 0
AND properties.reported.CommandRunner.commandStatus.commandId = 'pingcmd'
对于 目标模块 ,请指定设备在范围内的条件。 在此示例中,我们将通过指定 目标条件 来面向所有已启用 OSConfig 的设备 FROM devices.modules where moduleId='osconfig'
若要查看哪些设备孪生已使用所需的孪生属性内容 (云端) 更新,请参阅 “已应用 ”指标 (也称为 appliedCount )
若要查看哪些设备已成功 ping 终结点,请参阅上面创建的自定义 成功 指标。
还可以使用以下查询验证此示例中使用的 ping 命令的输出。 在Azure IoT 中心的门户页中,选择“设备管理 ”-->左侧导航中的“查询 ”。
SELECT deviceId, properties.reported.CommandRunner.commandStatus
FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.commandId = 'pingcmd'
使用以下示例命令设置单个设备的 OSConfig 孪生体,替换 <设备 ID> 和/或 <中心名称> 以匹配环境。
az iot hub module-twin update -m osconfig --desired \
'{
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "pingcmd",
"arguments": "ping -c 3 www.github.com",
"timeout": 120,
"singleLineTextResult": false,
"action": 3
}
}
}' -d <device id> --hub-name <hub name>
可以通过检查 对 ping 命令的响应来验证设备连接。 使用以下示例命令获取 ping 命令的结果,替换 <设备 ID> 和/或 <中心名称> 以匹配环境。 检查 resultCode:0, 指示命令已成功,并显示 ping 命令输出的 textResult 。
az iot hub query -q \
"SELECT properties.reported.CommandRunner.commandStatus.resultCode,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig'
AND deviceId='<device id>'" --hub-name <hub name> --output table
使用以下示例命令创建IoT 中心配置,检查连接到IoT 中心的设备群的网络连接。 此配置包括目标条件、自定义指标和所需配置。 请务必将<中心名称> 替换为IoT 中心名称。
az iot hub configuration create -c "checkconnectivity_devicefleet" --content \
'{"moduleContent":
{"properties.desired.CommandRunner":
{"commandArguments":
{"commandId": "checkconnectivity_devicefleet",
"arguments": "ping -c 3 www.github.com",
"timeout": 120,
"singleLineTextResult": false,
"action": 3
}}}}' \
--target-condition "from devices.modules where moduleId='osconfig'" --priority 10 \
--metrics "{\"metrics\": {\"queries\": {\"successfulpings\":\"select deviceId from devices.modules \
where moduleId='osconfig' AND properties.reported.CommandRunner.commandStatus.resultCode=0 \
and properties.reported.CommandRunner.commandStatus.commandId='checkconnectivity_devicefleet'\"}}}" \
--hub-name <hub name>
若要观察哪些设备的孪生已使用所需的孪生属性内容 (云端) 更新,请参阅 应用 指标 (也称为 appliedCount ) 。 若要查看哪些设备已成功 ping 终结点,请参阅上面创建的自定义 成功 指标。
使用以下命令检查 应用 指标和自定义指标 是否成功 。
az iot hub configuration show-metric --metric-id appliedCount \
-c "checkconnectivity_devicefleet" \
-n <hub name> --metric-type system
az iot hub configuration show-metric --metric-id successfulpings \
-c "checkconnectivity_devicefleet" \
-n <hub name> --metric-type user
使用以下命令,可以验证每个设备的 ping 命令的结果,以查看其是否成功。 检查 resultCode:0, 指示命令已成功,并显示 ping 命令输出的 textResult 。
az iot hub query -q \
"SELECT deviceId, properties.reported.CommandRunner.commandStatus.resultCode,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig'" \
--output table --hub-name <hub name> --output table
还可以使用以下查询验证此示例中使用的 ping 命令的输出。 在Azure IoT 中心的门户页中,选择“设备管理 ”-->左侧导航中的“查询 ”。 输出中的 textResult 将显示所需的文件内容。
SELECT deviceId, properties.reported.CommandRunner.commandStatus
FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.commandId = 'checkconnectivity_devicefleet'
示例 2。 获取 /etc/ssh/sshd_config 的内容
在此示例中,我们使用 CommandRunner 从每个设备捕获文件的内容。 在此示例中,我们不会将文件显式上传到任何云存储服务,而只是捕获其内容在孪生体中。
重要
孪生属性更新限制为 4KB。 此处所示的方法捕获从 cat
) 内联到孪生体的文件内容 (。 对于非常小的文件,此方法的优点是不需要任何外部存储服务或凭据。 对于较大的文件,此方法不适用。 而是在脚本/命令中包含逻辑,以便将文件上传到所选的本地或云存储。 例如,可以连接到 cifs 共享并在那里复制文件,或将文件内容推送到 Azure 存储。
在IoT 中心的门户页中,导航到要管理的设备的 OSConfig 孪生。 然后将以下内容添加到 properties.desired
节 (后跟逗号,将其与) 中的 properties.desired
下一项分开。 可以在下面的 参数 字段中替换所选的文件名。
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "sshdconfig",
"arguments": "cat /etc/ssh/sshd_config",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}
}
可以从模块孪生本身查看文件内容。 向下滚动模块孪生,在 CommandRunner 的报告 属性下查找 commandStatus ,此处将在 textResult 中看到这一点。 检查 resultCode:0 ,指示命令已成功, textResult 将显示所需的文件内容。
"CommandRunner": {
"__t": "c",
"commandStatus": {
"commandId": "sshdconfig",
"resultCode": 0,
"textResult": "<sshd_config_file_contents>",
"currentState": 2
}
}
从Azure IoT 中心的门户页中,选择“设备管理 ”--“>配置 ”-“>添加模块配置 ”。
指定一个名称,并使用所需的包管理器配置设置 孪生设置 。 将 模块孪生属性 设置为 properties.desired.CommandRunner
模块 孪生属性,并将模块孪生属性内容 设置为以下内容:
{
"properties.desired.CommandRunner": {
"commandArguments": {
"commandId": "sshdconfigfile_contents",
"arguments": "cat /etc/ssh/sshd_config",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}
}
}
对于 目标模块 ,请指定设备在范围内的条件。 在此示例中,我们将通过指定 目标条件 来面向所有已启用 OSConfig 的设备 FROM devices.modules where moduleId='osconfig'
若要观察哪些设备孪生已使用所需的孪生属性内容 (云端) 更新,请参阅 “应用 ”指标 (也称为 appliedCount )
还可以使用以下查询读取此示例中的文件内容。 在Azure IoT 中心的门户页中,选择“设备管理 ”-->左侧导航中的查询 。 可在 commandStatus.textResult 中看到实际文件内容。
SELECT deviceId, properties.reported.CommandRunner.commandStatus
FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.commandId = 'sshdconfigfile_contents'
使用以下示例命令通过在孪生) 部分放置请求来启动请求 properties.desired
(。
az iot hub module-twin update -m osconfig --desired \
'{
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "sshdconfig",
"arguments": "cat /etc/ssh/sshd_config",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}
}
}' -d <device id> --hub-name <hub name>
使用以下命令查看结果。 检查 resultCode:0 ,指示命令已成功, textResult 将显示所需的文件内容。
az iot hub query --output table -q \
"SELECT properties.reported.CommandRunner.commandStatus.resultCode,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig'
AND deviceID='<device id>'" --hub-name <hub name>
使用以下示例命令创建IoT 中心配置。 此配置包括目标条件、所需配置。 请务必将中心名称 替换为IoT 中心名称。
az iot hub configuration create -c "sshdconfigfile_contents" --content \
'{"moduleContent":
{"properties.desired.CommandRunner":
{"commandArguments":
{"commandId": "sshdconfigfile_contents",
"arguments": "cat /etc/ssh/sshd_config",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}}}}' \
--target-condition "from devices.modules where moduleId='osconfig'" --priority 10 \
--hub-name <hub-name>
使用以下命令查看结果。 检查 resultCode:0 ,指示命令已成功,并显示文件内容的 textResult 。
az iot hub query -q \
"SELECT deviceId, properties.reported.CommandRunner.commandStatus.resultCode,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig'" \
--output table --hub-name <hub name>
若要观察哪些设备孪生已使用所需的孪生属性内容 (云端) 更新,请参阅 “应用 ”指标 (也称为 appliedCount ) 。
使用以下命令检查 应用的 指标。
az iot hub configuration show-metric --metric-id appliedCount \
-c "sshdconfigfile_contents" \
-n <hub name> --metric-type system
还可以使用以下查询读取文件内容。 在Azure IoT 中心的门户页中,选择“设备管理 ”-->左侧导航中的查询 。
SELECT deviceId, properties.reported.CommandRunner.commandStatus,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.commandId = 'sshdconfigfile_contents'
示例 3。 部署简单的内联脚本,将时区设置为 UTC 并报告时区
此示例演示了一个简单的用例,其中脚本和结果都可以作为孪生体的一部分内联处理。 以下示例将时区设置为 UTC,然后在设置时区后查询时区。
在IoT 中心的门户页中,导航到要管理的设备的 OSConfig 孪生体,并将以下内容properties.desired
添加到该部分,然后用逗号将其与下properties.desired
一项分开。
下面的 action=3 指定 RunCommand 操作。
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "settimezonecmd",
"arguments": "timedatectl set-timezone Etc/UTC | timedatectl | grep Time",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}
}
执行该命令后,向下滚动模块孪生以在 CommandRunner 的报告 属性下查找 commandStatus ,此处将看到 textResult 显示设备上设置的当前时区。
"CommandRunner": {
"__t": "c",
"commandStatus": {
"commandId": "settimezonecmd",
"resultCode": 0,
"textResult": " Time zone: Etc/UTC (UTC, +0000)",
"currentState": 2
}
}
若要将设备群的时区设置为 UTC,如以下示例所示,你将创建一个IoT 中心配置 (也称为IoT 中心自动设备管理 [ADM] ) 。
从Azure IoT 中心的门户页中,选择“设备管理 ”--“>配置 ”-“>添加模块配置 ”。
指定一个名称,并使用所需的包管理器配置设置 孪生设置 。 将 模块孪生属性 设置为 properties.desired.CommandRunner
模块 孪生属性,并将模块孪生属性内容 设置为以下内容:
"properties.desired.CommandRunner": {
"commandArguments": {
"commandId": "settimezone_config",
"arguments": "timedatectl set-timezone Etc/UTC | timedatectl | grep Time",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}
}
对于 目标模块 ,请指定设备在范围内的条件。 在此示例中,我们将通过指定 目标条件 来面向所有已启用 OSConfig 的设备 FROM devices.modules where moduleId='osconfig'
创建名称成功配置的 自定义指标 和指标条件 ,如下所示。 此指标查询将标识已成功更新时区的所有设备。
SELECT deviceId FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.resultCode = 0
AND properties.reported.CommandRunner.commandStatus.commandId = 'settimezone_config'
将配置应用到设备后,可以通过检查 应用 指标 ((也称为 appliedCount ) )来验证哪些设备的孪生体已使用所需的孪生属性内容 (云端) 更新。 若要查看哪些设备已成功更新时区,请参阅上面创建的自定义 成功配置 指标。
还可以使用以下查询从此示例中读取这些设备上的当前时区。 在Azure IoT 中心的门户页中,选择“设备管理 ”-->左侧导航中的查询 。 可以从 commandStatus.textResult 检查这些设备上的当前时区。
SELECT deviceId, properties.reported.CommandRunner.commandStatus
FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.commandId = 'settimezone_config'
使用以下示例在设备上设置时区,然后读取当前时区。
下面的 action=3 指定 RunCommand 操作。 替换 <设备 ID> 和/或 <中心名称> 以匹配你的环境。
az iot hub module-twin update -m osconfig --desired \
'{
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "settimezone_cmd",
"arguments": "timedatectl set-timezone Etc/UTC | timedatectl | grep Time",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}
}
}' -d <device id> --hub-name <hub name>
可以使用以下示例查询上述命令的结果并检查设备上的当前时区。 检查 resultCode:0 ,指示命令已成功, textResult 将显示当前时区。
az iot hub query -q \
"SELECT properties.reported.CommandRunner.commandStatus.resultCode,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig'
AND deviceID='<device id>'" --hub-name <hub name> --output table
使用以下示例命令创建IoT 中心配置。 此配置包括目标条件、所需配置。 请务必将中心名称 替换为IoT 中心名称。
az iot hub configuration create -c "settimezone_config" --content \
'{"moduleContent":
{"properties.desired.CommandRunner":
{"commandArguments":
{"commandId": "settimezone_cmd",
"arguments": "timedatectl set-timezone Etc/UTC | timedatectl | grep Time",
"timeout": 30,
"singleLineTextResult": false,
"action": 3
}}}}' \
--target-condition "from devices.modules where moduleId='osconfig'" --priority 10 \
--metrics "{\"metrics\": {\"queries\": {\"successfullyconfigured\":\"select deviceId from devices.modules \
where moduleId='osconfig' AND properties.reported.CommandRunner.commandStatus.resultCode=0 \
and properties.reported.CommandRunner.commandStatus.commandId='settimezone_cmd'\"}}}" \
--hub-name <hub-name>
可以使用以下示例查询设备上设置时区。 在 commandStatus.textResult 中可以看到当前时区。
az iot hub query -q \
"SELECT deviceId, properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig'" \
--output table --hub-name <hub name>
若要观察哪些设备孪生已使用所需的孪生属性内容 (云端) 更新,请参阅 “应用 ”指标 (也称为 appliedCount ) 。 若要观察哪些设备已成功 ping 终结点,请参阅上面创建的自定义 成功配置 指标。
使用以下命令检查这两个指标。
az iot hub configuration show-metric --metric-id appliedCount \
-c "settimezone_config" \
-n <hub name> --metric-type system
az iot hub configuration show-metric --metric-id successfullyconfigured \
-c "settimezone_config" \
-n <hub name> --metric-type user
此示例演示如何调用位于孪生体外部的脚本。 例如,可以将脚本放在 GitHub 中。 (脚本对于孪生体) 或首选项来说,这种模式可能出于必要而产生。 孪生体中的命令是一个简单的包装器。 它下载主脚本并运行它。
重要
为了支持本文档,我们发布了一个 示例脚本 。 此示例脚本作为 GitHub 或其他位置你自己的脚本的备用脚本提供。 它从设备收集几个数据点,包括时间戳、守护程序状态和可用磁盘空间。 在设备上运行脚本之前,应先检查 Internet 中的脚本,包括此脚本。
在IoT 中心的门户页中,导航到要管理的设备的 OSConfig 孪生体,然后将以下内容properties.desired
添加到该部分,然后用逗号将其与下一项properties.desired
分开。
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "runcustomscript",
"arguments": "curl -s -L https://learn.microsoft.com/azure/osconfig/samples/report-multiple-datapoints-from-device.sh | tr -d \r| bash",
"timeout": 60,
"singleLineTextResult": false,
"action": 3
}
}
向下滚动模块孪生,在孪生体的报告 属性部分中查找 CommandRunner -->commandStatus 。 检查 resultCode:0, 指示命令已成功,并显示执行脚本的输出 的 textResult 。 下面是从设备的 OSConfig 孪生获取的示例输出:
"CommandRunner": {
"__t": "c",
"commandStatus": {
"commandId": "runcustomscript",
"resultCode": 0,
"textResult": "+TIMESTAMP: 'Fri Jul 8 19:01:15 UTC 2022' +DAEMON_STATUS: 'Active: active (running) since Mon 2022-06-27 19:02:46 UTC; 1 weeks 3 days ago' +FREE_SPACE: '/dev/sda1 30309264 8811724 21481156 30% /'"
"currentState": 2
},
}
若要下载并安装应用或在设备群上执行脚本,如此示例所示,你将创建一个IoT 中心配置 (也称为IoT 中心自动设备管理 [ADM] ) 。
在Azure IoT 中心的门户页中,选择“设备管理 ”-“>配置 ”-“>添加模块配置 ”。
指定一个名称,并使用所需的包管理器配置设置 孪生设置 。 将 模块孪生属性 设置为 properties.desired.CommandRunner
模块 孪生属性,并将模块孪生属性内容 设置为以下内容。
{
"properties.desired.CommandRunner": {
"commandArguments": {
"commandId": "runcustomscript_configuration",
"arguments": "curl -s -L https://learn.microsoft.com/azure/osconfig/samples/report-multiple-datapoints-from-device.sh | tr -d \r| bash",
"timeout": 60,
"singleLineTextResult": false,
"action": 3
}
}
}
对于 目标模块 ,请指定设备在范围内的条件。 在此示例中,我们将通过指定 目标条件 来面向所有已启用 OSConfig 的设备 FROM devices.modules where moduleId='osconfig'
创建名称成功运行 和指标条件 的自定义指标 ,如下所示。 此指标查询将标识脚本成功运行或执行的所有设备。
SELECT deviceId
FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.resultCode = 0
AND properties.reported.CommandRunner.commandStatus.commandId = 'runcustomscript_configuration'
将配置应用到设备后,可以通过检查 应用 (指标(也称为 appliedCount ) )来验证是否已使用所需的孪生属性内容 (云端) 更新设备孪生。 若要查看哪些设备已成功更新时区,请参阅上面创建的自定义 成功运行 指标。
还可以检查上述配置是否已成功应用,以及安装是否成功,方法是使用以下查询。 在Azure IoT 中心的门户页中,选择“设备管理 ”-->左侧导航中的“查询 ”。 检查 resultCode:0, 指示命令已成功,并显示脚本输出的 textResult 。
SELECT deviceId, properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE properties.reported.CommandRunner.commandStatus.commandId = 'runcustomscript_configuration'
以下示例演示在特定设备上下载和执行简单脚本。 替换 <设备 ID> 和/或 <中心名称> 以匹配环境。
az iot hub module-twin update -m osconfig --desired \
'{
"CommandRunner": {
"__t": "c",
"commandArguments": {
"commandId": "runcustomscript",
"arguments": "curl -s -L 'https://learn.microsoft.com/azure/osconfig/samples/report-multiple-datapoints-from-device.sh' | tr -d \'\r'| bash",
"timeout": 60,
"singleLineTextResult": false,
"action": 3
}
}
}' -d <device id> --hub-name <hub name>
可以使用以下示例在设备上查询上述脚本的结果。 检查 resultCode:0, 指示命令已成功,并显示脚本输出的 textResult 。
az iot hub query -q \
"SELECT properties.reported.CommandRunner.commandStatus.resultCode,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig' AND properties.reported.CommandRunner.commandStatus.commandId = 'runcustomscript'
AND deviceId = '<device id>'" \
--hub-name <hub name> --output table
使用以下示例命令创建IoT 中心配置,以在多个设备上下载和运行自定义脚本。 此配置包括目标条件和所需配置。 请务必将中心名称 替换为IoT 中心名称。
az iot hub configuration create -c "runcustomscript_multipledevices" --content \
'{"moduleContent":
{"properties.desired.CommandRunner":
{"commandArguments":
{"commandId": "runcustomscript_multipledevices",
"arguments": "curl -s -L 'https://learn.microsoft.com/azure/osconfig/samples/report-multiple-datapoints-from-device.sh' | tr -d \'\r'| bash",
"timeout": 60,
"singleLineTextResult": false,
"action": 3
}}}}' \
--target-condition "from devices.modules where moduleId='osconfig'" --priority 10 \
--metrics "{\"metrics\": {\"queries\": {\"successfulruns\":\"select deviceId from devices.modules \
where moduleId='osconfig' AND properties.reported.CommandRunner.commandStatus.resultCode=0 \
and properties.reported.CommandRunner.commandStatus.commandId='runcustomscript_multipledevices'\"}}}" \
--hub-name <hub-name>
可以使用以下示例验证设备上的脚本执行结果。 检查 resultCode:0, 指示命令已成功,并显示所执行的脚本的输出的 textResult 。
az iot hub query -q \
"SELECT deviceId, properties.reported.CommandRunner.commandStatus.resultCode,
properties.reported.CommandRunner.commandStatus.textResult
FROM devices.modules
WHERE moduleId='osconfig' AND properties.reported.CommandRunner.commandStatus.commandId = 'runcustomscript_multipledevices'" \
--output table --hub-name <hub name>
有关 OSConfig 方案和功能的概述,请参阅:
有关特定实际示例,请参阅: