Verwenden Sie Azure CLI-Befehle, um eine verbundene Azure-Container-Registry in einer verschachtelten Azure IoT Edge-Hierarchie bereitzustellen.

In diesem Tutorial verwenden Sie Azure CLI-Befehle, um eine zweischichtige Hierarchie von Azure IoT Edge-Geräten zu erstellen und eine verbundene Registrierung als ein Modul auf jeder Schicht bereitzustellen. In diesem Szenario kommuniziert ein Gerät auf der obersten Ebene mit einer Cloudregistrierung. Ein Gerät auf der unteren Ebene kommuniziert mit seiner verbundenen übergeordneten Registrierung auf der obersten Ebene.

Einen Überblick über die Verwendung einer verbundenen Registrierung mit IoT Edge finden Sie unter Verwendung einer verbundenen Registrierung mit Azure IoT Edge.

Voraussetzungen

  • Verwenden Sie die Bash-Umgebung in Azure Cloud Shell. Weitere Informationen finden Sie unter Schnellstart für Bash in Azure Cloud Shell.

  • Wenn Sie CLI-Referenzbefehle lieber lokal ausführen, installieren Sie die Azure CLI. Wenn Sie Windows oder macOS ausführen, sollten Sie die Azure CLI in einem Docker-Container ausführen. Weitere Informationen finden Sie unter Ausführen der Azure CLI in einem Docker-Container.

    • Wenn Sie eine lokale Installation verwenden, melden Sie sich mithilfe des Befehls az login bei der Azure CLI an. Führen Sie die in Ihrem Terminal angezeigten Schritte aus, um den Authentifizierungsprozess abzuschließen. Informationen zu anderen Anmeldeoptionen finden Sie unter Anmelden mit der Azure CLI.

    • Installieren Sie die Azure CLI-Erweiterung beim ersten Einsatz, wenn Sie dazu aufgefordert werden. Weitere Informationen zu Erweiterungen finden Sie unter Verwenden von Erweiterungen mit der Azure CLI.

    • Führen Sie az version aus, um die installierte Version und die abhängigen Bibliotheken zu ermitteln. Führen Sie az upgrade aus, um das Upgrade auf die aktuelle Version durchzuführen.

  • Azure IoT Hub. Schritte zur Bereitstellung finden Sie unter Erstellen eines IoT-Hubs über das Azure-Portal.

  • Zwei verbundene Registry-Ressourcen in Azure. Informationen zu den Bereitstellungsschritten finden Sie unter Schnellstarts mit der Azure CLI oder dem Azure Portal.

    • Für die oberste Ebene kann die angeschlossene Registrierung entweder im ReadWrite- oder im ReadOnly-Modus sein. Dieser Artikel geht vom ReadWrite-Modus aus, und der Name der verbundenen Registrierung wird in der Umgebungsvariablen $CONNECTED_REGISTRY_RW gespeichert.
    • Für die untere Schicht muss die angeschlossene Registrierung im ReadOnly-Modus sein. Dieser Artikel geht davon aus, dass der Name der verbundenen Registrierung in der Umgebungsvariablen $CONNECTED_REGISTRY_RO gespeichert ist.

Importieren von Images in die Cloudregistrierung

Importieren Sie mit dem Befehl az acr import die folgenden Containerimages in Ihre Cloudregistrierung. Überspringen Sie diesen Schritt, wenn Sie diese Images bereits importiert haben.

Image der verbundenen Registrierung

Um geschachtelte IoT Edge-Szenarien zu unterstützen, muss das Containerimage der Runtime der verbundenen Registrierung in Ihrer privaten Azure-Containerregistrierung verfügbar sein. Mit dem Befehl az acr import können Sie das Image der verbundenen Registrierung in Ihre private Registrierung importieren.

# Use the REGISTRY_NAME variable in the following Azure CLI commands to identify the registry
REGISTRY_NAME=<container-registry-name>

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/acr/connected-registry:0.8.0

Images von IoT Edge- und API-Proxy

Um die verbundene Registrierung für geschachteltes IoT Edge zu unterstützen, müssen Sie Module für den IoT Edge- und API-Proxy bereitstellen. Importieren Sie diese Images in Ihre private Registrierung.

Das IoT Edge- und API-Proxymodul ermöglicht einem IoT Edge Gerät, mehrere Dienste über das HTTPS-Protokoll am selben Port verfügbar zu machen, z. B. 443.

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-agent:1.2.4

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-hub:1.2.4

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-api-proxy:1.1.2

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/azureiotedge-diagnostics:1.2.4

Image „hello-world“

Importieren Sie das Image, um die verbundene Registrierung hello-world zu testen. Dieses Repository wird mit der verbundenen Registrierung synchronisiert und von den verbundenen Registrierungsclients gepullt.

az acr import \
  --name $REGISTRY_NAME \
  --source mcr.microsoft.com/hello-world:1.1.2

Abrufen der verbundenen Registrierungskonfiguration

Um jede verbundene Registrierung auf dem IoT Edge-Gerät in der Hierarchie bereitzustellen, müssen Sie die Konfigurationseinstellungen von der verbundenen Registrierungsressource in Azure abrufen. Führen Sie bei Bedarf den Befehl az acr connected-registry get-settings für jede verbundene Registrierung aus, um die Konfiguration abzurufen.

Standardmäßig enthalten die Einstellungsinformationen nicht das Sync-Token-Kennwort, das ebenfalls für die Bereitstellung der verbundenen Registrierung benötigt wird. Optional können Sie eines der Passwörter generieren, indem Sie den Parameter --generate-password 1 oder --generate-password 2 übergeben. Speichern Sie das generierte Passwort an einem sicheren Ort. Es kann nicht wieder abgerufen werden.

Warnung

Durch die Neuerstellung eines Kennworts werden die Sync-Token-Anmeldeinformationen ausgetauscht. Wenn Sie ein Gerät mit dem vorherigen Passwort konfiguriert haben, müssen Sie die Konfiguration aktualisieren.

# Use the REGISTRY_NAME variable in the following Azure CLI commands to identify the registry
REGISTRY_NAME=<container-registry-name>

# Run the command for each registry resource in the hierarchy

az acr connected-registry get-settings \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RW \
  --parent-protocol https

az acr connected-registry get-settings \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RO \
  --parent-protocol https

Die Befehlsausgabe umfasst die Registrierungsverbindungszeichenfolge und die zugehörigen Einstellungen. Die folgende Beispielausgabe zeigt die Verbindungszeichenfolge für die verbundene Registrierung namens myconnectedregistry mit der übergeordneten Registrierung contosoregistry:

{
  "ACR_REGISTRY_CONNECTION_STRING": "ConnectedRegistryName=myconnectedregistry;SyncTokenName=myconnectedregistry-sync-token;SyncTokenPassword=xxxxxxxxxxxxxxxx;ParentGatewayEndpoint=contosoregistry.eastus.data.azurecr.io;ParentEndpointProtocol=https"
}

Konfigurieren von Bereitstellungsmanifesten

Ein Bereitstellungsmanifest ist ein JSON-Dokument, das beschreibt, welche Module auf einem IoT Edge-Gerät bereitgestellt werden sollen. Weitere Informationen finden Sie unter Verstehen, wie IoT Edge-Module verwendet, konfiguriert und wiederverwendet werden können.

Um das verbundene Registrierungsmodul auf jedem IoT Edge-Gerät mithilfe der Azure CLI bereitzustellen, speichern Sie die folgenden Bereitstellungsmanifeste lokal als JSON-Dateien. Verwenden Sie die Informationen aus den vorherigen Abschnitten, um die relevanten JSON-Werte in jedem Manifest zu aktualisieren. Verwenden Sie die Dateipfade im nächsten Abschnitt, wenn Sie den Befehl ausführen, um die Konfiguration auf Ihr Gerät anzuwenden.

Bereitstellungsmanifest für die oberste Schicht

Erstellen Sie für das Gerät auf der obersten Ebene eine Bereitstellungsmanifestdatei deploymentTopLayer.json mit dem folgenden Inhalt. Dieses Manifest ähnelt dem, das in Quickstart verwendet wird: Bereitstellen einer verbundenen Registrierung auf einem IoT Edge-Gerät.

Hinweis

Wenn Sie bereits eine verbundene Registrierung auf einem IoT-Edge-Gerät der obersten Ebene mithilfe der Schnellstartanleitung bereitgestellt haben, können Sie sie auf der obersten Ebene einer verschachtelten Hierarchie verwenden. Ändern Sie die Bereitstellungsschritte in diesem Tutorial, um sie in der Hierarchie zu konfigurieren (nicht gezeigt).

Einstellungen für verbundene Registrierungsmodule

  • Verwenden Sie die Token-Anmeldeinformationen und die Verbindungszeichenfolge aus den vorherigen Abschnitten, um die relevanten JSON-Werte im env Knoten zu aktualisieren.

  • Die folgenden Umgebungsvariablen sind optional im env Knoten:

    Variable BESCHREIBUNG
    ACR_REGISTRY_LOGIN_SERVER Gibt einen eindeutigen Hostnamen oder FQDN an. Bei Verwendung akzeptiert die verbundene Registrierung nur Anforderungen, die an diesen Anmeldeserverwert gesendet werden.

    Wenn kein Wert angegeben wird, kann auf die verbundene Registrierung mit einem beliebigen Anmeldeserverwert zugegriffen werden.
    ACR_REGISTRY_CERTIFICATE_VOLUME Wenn auf Ihre verbundene Registrierung über HTTPS zugegriffen werden kann, verweist sie auf das Verzeichnis, auf dem die HTTPS-Zertifikate gespeichert sind.

    Wenn nicht festgelegt, ist der Standardspeicherort /var/acr/certs.
    ACR_REGISTRY_DATA_VOLUME Überschreibt den Standardspeicherort /var/acr/data, an dem die Images von der verbundenen Registrierung gespeichert werden.

    Dieser Speicherort muss mit der Verzeichnisbindung für den Container übereinstimmen.

    Wichtig

    Wenn die verbundene Registrierung auf einen anderen Port als 80 und 443 lauscht, muss der Wert ACR_REGISTRY_LOGIN_SERVER (sofern angegeben) den Port enthalten. Beispiel: 192.168.0.100:8080.

  • Wenn das API-Proxymodul nicht verwendet wird, sollte eine HostPort Bindung für die verbundene Registrierung festgelegt werden. Beispiel:

     "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"],\"PortBindings\":{\"8080/tcp\":[{\"HostPort\":\"8080\"}]}}}"
    

API-Proxymodul Einstellungen

  • Der API-Proxy lauscht auf Port 8000, der als NGINX_DEFAULT_PORT konfiguriert ist. Weitere Informationen zu den API-Proxyeinstellungen finden Sie im IoT Edge GitHub Repository.
{
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "modules": {
                    "connected-registry": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/acr/connected-registry:0.8.0",
                            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"]}}"
                        },
                        "type": "docker",
                        "env": {
                            "ACR_REGISTRY_CONNECTION_STRING": {
                                "value": "ConnectedRegistryName=<REPLACE_WITH_CONNECTED_REGISTRY_NAME>;SyncTokenName=<REPLACE_WITH_SYNC_TOKEN_NAME>;SyncTokenPassword=REPLACE_WITH_SYNC_TOKEN_PASSWORD;ParentGatewayEndpoint=<REPLACE_WITH_CLOUD_REGISTRY_NAME>.<REPLACE_WITH_CLOUD_REGISTRY_REGION>.data.azurecr.io;ParentEndpointProtocol=https"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    },
                    "IoTEdgeAPIProxy": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-api-proxy:1.1.2",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"8000/tcp\":[{\"HostPort\":\"8000\"}]}}}"
                        },
                        "type": "docker",
                        "env": {
                            "NGINX_DEFAULT_PORT": {
                                "value": "8000"
                            },
                            "CONNECTED_ACR_ROUTE_ADDRESS": {
                                "value": "connected-registry:8080"
                            },
                            "BLOB_UPLOAD_ROUTE_ADDRESS": {
                                "value": "AzureBlobStorageonIoTEdge:11002"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    }
                },
                "runtime": {
                    "settings": {
                        "minDockerVersion": "v1.25",
                        "registryCredentials": {
                            "cloudregistry": {
                                "address": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io",
                                "password": "<REPLACE_WITH_SYNC_TOKEN_PASSWORD>",
                                "username": "<REPLACE_WITH_SYNC_TOKEN_NAME>"
                            }
                        }
                    },
                    "type": "docker"
                },
                "schemaVersion": "1.1",
                "systemModules": {
                    "edgeAgent": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-agent:1.2.4",
                            "createOptions": ""
                        },
                        "type": "docker",
                        "env": {
                            "SendRuntimeQualityTelemetry": {
                                "value": "false"
                            }
                        }
                    },
                    "edgeHub": {
                        "settings": {
                            "image": "<REPLACE_WITH_CLOUD_REGISTRY_NAME>.azurecr.io/azureiotedge-hub:1.2.4",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
                        },
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always"
                    }
                }
            }
        },
        "$edgeHub": {
            "properties.desired": {
                "routes": {
                    "route": "FROM /messages/* INTO $upstream"
                },
                "schemaVersion": "1.1",
                "storeAndForwardConfiguration": {
                    "timeToLiveSecs": 7200
                }
            }
        }
    }
}

Bereitstellungsmanifest für die untere Schicht

Erstellen Sie für das Gerät auf der unteren Ebene eine Bereitstellungsmanifestdatei deploymentLowerLayer.json mit dem folgenden Inhalt.

Insgesamt ähnelt die Bereitstellungsdatei der unteren Schicht der Bereitstellungsdatei der oberen Schicht. Folgende Unterschiede bestehen:

  • Es zieht die erforderlichen Bilder aus dem mit der obersten Schicht verbundenen Register und nicht aus dem Cloud-Register.

    Wenn Sie die verbundene Registrierung der obersten Ebene einrichten, stellen Sie sicher, dass sie alle erforderlichen Images lokal synchronisiert, einschließlich azureiotedge-agent, azureiotedge-hub, azureiotedge-api-proxy und acr/connected-registry. Das IoT-Gerät der unteren Schicht muss diese Bilder von der angeschlossenen Registrierung der oberen Schicht beziehen.

  • Sie verwendet das auf der unteren Schicht konfigurierte Sync-Token, um sich bei der mit der oberen Schicht verbundenen Registrierung zu authentifizieren.

  • Er konfiguriert den übergeordneten Gateway-Endpunkt mit der IP-Adresse oder dem FQDN der mit der obersten Schicht verbundenen Registrierung und nicht mit dem FQDN der Cloud-Registrierung.

Wichtig

Im folgenden Bereitstellungsmanifest wird $upstream als IP-Adresse oder FQDN des Geräts verwendet, das die übergeordnete verbundene Registrierung hostet. Allerdings wird $upstream in einer Umgebungsvariablen nicht unterstützt. Die angeschlossene Registrierung muss die Umgebungsvariable ACR_PARENT_GATEWAY_ENDPOINT lesen, um den Endpunkt des übergeordneten Gateways zu erhalten. Anstatt $upstream zu verwenden, unterstützt die angeschlossene Registrierung die dynamische Auflösung der IP-Adresse oder des FQDN aus einer anderen Umgebungsvariablen.

Auf dem verschachtelten IoT Edge gibt es auf der unteren Ebene eine Umgebungsvariable $IOTEDGE_PARENTHOSTNAME, die der IP-Adresse oder dem FQDN des übergeordneten Geräts entspricht. Ersetzen Sie die Umgebungsvariable manuell als Wert von ParentGatewayEndpoint in der Verbindungszeichenfolge, um die Festcodierung der übergeordneten IP-Adresse oder des FQDN zu vermeiden. Da auf dem übergeordneten Gerät in diesem Beispiel nginx an Port 8000 ausgeführt wird, übergeben Sie $IOTEDGE_PARENTHOSTNAME:8000. Sie müssen auch das richtige Protokoll in ParentEndpointProtocol auswählen.

{
    "modulesContent": {
        "$edgeAgent": {
            "properties.desired": {
                "modules": {
                    "connected-registry": {
                        "settings": {
                            "image": "$upstream:8000/acr/connected-registry:0.8.0",
                            "createOptions": "{\"HostConfig\":{\"Binds\":[\"/home/azureuser/connected-registry:/var/acr/data\"]}}"
                        },
                        "type": "docker",
                        "env": {
                            "ACR_REGISTRY_CONNECTION_STRING": {
                                "value": "ConnectedRegistryName=<REPLACE_WITH_CONNECTED_REGISTRY_NAME>;SyncTokenName=<REPLACE_WITH_SYNC_TOKEN_NAME>;SyncTokenPassword=<REPLACE_WITH_SYNC_TOKEN_PASSWORD>;ParentGatewayEndpoint=$IOTEDGE_PARENTHOSTNAME:8000;ParentEndpointProtocol=https"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "version": "1.0"
                    },
                    "IoTEdgeApiProxy": {
                        "settings": {
                            "image": "$upstream:8000/azureiotedge-api-proxy:1.1.2",
                            "createOptions": "{\"HostConfig\": {\"PortBindings\": {\"8000/tcp\": [{\"HostPort\": \"8000\"}]}}}"
                        },
                        "type": "docker",
                        "version": "1.0",
                        "env": {
                            "NGINX_DEFAULT_PORT": {
                                "value": "8000"
                            },
                            "CONNECTED_ACR_ROUTE_ADDRESS": {
                                "value": "connected-registry:8080"
                            },
                            "NGINX_CONFIG_ENV_VAR_LIST": {
                                    "value": "NGINX_DEFAULT_PORT,BLOB_UPLOAD_ROUTE_ADDRESS,CONNECTED_ACR_ROUTE_ADDRESS,IOTEDGE_PARENTHOSTNAME,DOCKER_REQUEST_ROUTE_ADDRESS"
                            },
                            "BLOB_UPLOAD_ROUTE_ADDRESS": {
                                "value": "AzureBlobStorageonIoTEdge:11002"
                            }
                        },
                        "status": "running",
                        "restartPolicy": "always",
                        "startupOrder": 3
                    }
                },
                "runtime": {
                    "settings": {
                        "minDockerVersion": "v1.25",
                        "registryCredentials": {
                            "connectedregistry": {
                                "address": "$upstream:8000",
                                "password": "<REPLACE_WITH_SYNC_TOKEN_PASSWORD>",
                                "username": "<REPLACE_WITH_SYNC_TOKEN_NAME>"
                            }
                        }
                    },
                    "type": "docker"
                },
                "schemaVersion": "1.1",
                "systemModules": {
                    "edgeAgent": {
                        "settings": {
                            "image": "$upstream:8000/azureiotedge-agent:1.2.4",
                            "createOptions": ""
                        },
                        "type": "docker",
                        "env": {
                            "SendRuntimeQualityTelemetry": {
                                "value": "false"
                            }
                        }
                    },
                    "edgeHub": {
                        "settings": {
                            "image": "$upstream:8000/azureiotedge-hub:1.2.4",
                            "createOptions": "{\"HostConfig\":{\"PortBindings\":{\"443/tcp\":[{\"HostPort\":\"443\"}],\"5671/tcp\":[{\"HostPort\":\"5671\"}],\"8883/tcp\":[{\"HostPort\":\"8883\"}]}}}"
                        },
                        "type": "docker",
                        "status": "running",
                        "restartPolicy": "always"
                    }
                }
            }
        },
        "$edgeHub": {
            "properties.desired": {
                "routes": {
                    "route": "FROM /messages/* INTO $upstream"
                },
                "schemaVersion": "1.1",
                "storeAndForwardConfiguration": {
                    "timeToLiveSecs": 7200
                }
            }
        }
    }
}

Einrichten und Bereitstellen von verbundenen Registrierungsmodulen

Die folgenden Schritte sind an das Tutorial angepasst: Erstellen einer Hierarchie von IoT Edge-Geräten und sind spezifisch für die Bereitstellung verbundener Registrierungsmodule in der IoT Edge-Hierarchie. Einzelheiten zu den einzelnen Schritten finden Sie in dieser Anleitung.

Erstellen von Geräten der oberen und unteren Schicht

Erstellen von VMs der obersten und unteren Ebene unter Verwendung einer vorhandenen ARM-Vorlage. Mit der Vorlage wird auch der IoT Edge-Agent installiert. Wenn Sie stattdessen von Ihren eigenen Geräten aus bereitstellen möchten, siehe Tutorial: Azure IoT Edge für Linux installieren oder deinstallieren, um zu erfahren, wie Sie das Gerät manuell einrichten.

Wichtig

Stellen Sie sicher, dass Sie für den späteren Zugriff auf die auf dem Gerät der obersten Schicht installierten Module die folgenden eingehenden Ports öffnen: 8000, 443, 5671, 8883. Die Konfigurationsschritte finden Sie unter Öffnen von Ports für eine virtuelle Maschine mit dem Azure-Portal.

Erstellen und Konfigurieren der Hierarchie

Verwenden Sie das iotedge-config Tool, um Ihre Hierarchie zu erstellen und zu konfigurieren, indem Sie die folgenden Schritte in der Azure CLI oder Azure Cloud Shell ausführen:

  1. Laden Sie das Konfigurationstool herunter.

     mkdir nested_iot_edge_tutorial
     cd ~/nested_iot_edge_tutorial
     wget -O iotedge_config.tar "https://github.com/Azure-Samples/iotedge_config_cli/releases/download/latest/iotedge_config_cli.tar.gz"
     tar -xvf iotedge_config.tar
    

    In diesem Schritt wird der Ordner iotedge_config_cli_release in Ihrem Lehrgangsverzeichnis erstellt. Die Vorlagendatei, die zum Erstellen Ihrer Gerätehierarchie verwendet wird, ist die Datei iotedge_config.yaml unter ~/nested_iot_edge_tutorial/iotedge_config_cli_release/templates/tutorial. Im selben Verzeichnis befinden sich zwei Deployment-Manifeste für die obere und untere Schicht: deploymentTopLayer.json und deploymentLowerLayer.json Dateien.

  2. Bearbeiten Sie iotedge_config.yaml mit Ihren Informationen. Bearbeiten Sie die Dateinamen iothub_hostname und iot_name der Bereitstellungsmanifeste für die oberste und die untere Ebene sowie die Clienttoken-Anmeldeinformationen, die Sie erstellt haben, um Images upstream von jeder Ebene zu pullen. Das folgende Beispiel ist eine Beispielkonfigurationsdatei:

    config_version: "1.0"
    
    iothub:
        iothub_hostname: <REPLACE_WITH_HUB_NAME>.azure-devices.net
        iothub_name: <REPLACE_WITH_HUB_NAME>
        ## Authentication method used by IoT Edge devices: symmetric_key or x509_certificate
        authentication_method: symmetric_key 
    
        ## Root certificate used to generate device CA certificates. Optional. If not provided a self-signed CA will be generated
        # certificates:
        #   root_ca_cert_path: ""
        #   root_ca_cert_key_path: ""
    
        ## IoT Edge configuration template to use
    configuration:
        template_config_path: "./templates/tutorial/device_config.toml"
        default_edge_agent: "$upstream:8000/azureiotedge-agent:1.2.4"
    
        ## Hierarchy of IoT Edge devices to create
    edgedevices:
        device_id: top-layer
        edge_agent: "<REPLACE_WITH_REGISTRY_NAME>.azurecr.io/azureiotedge-agent:1.2.4" ## Optional. If not provided, default_edge_agent will be used
        deployment: "./templates/tutorial/deploymentTopLayer.json" ## Optional. If provided, the given deployment file will be applied to the newly created device
            # hostname: "FQDN or IP" ## Optional. If provided, install.sh will not prompt user for this value nor the parent_hostname value
        container_auth: ## The token used to pull the image from cloud registry
            serveraddress: "<REPLACE_WITH_REGISTRY_NAME>.azurecr.io"
            username: "<REPLACE_WITH_SYNC_TOKEN_NAME_FOR_TOP_LAYER>"
            password: "<REPLACE_WITH_SYNC_TOKEN_PASSWORD_FOR_TOP_LAYER>"
        child:
            - device_id: lower-layer
              deployment: "./templates/tutorial/deploymentLowerLayer.json" ## Optional. If provided, the given deployment file will be applied to the newly created device
               # hostname: "FQDN or IP" ## Optional. If provided, install.sh will not prompt user for this value nor the parent_hostname value
              container_auth: ## The token used to pull the image from parent connected registry
                serveraddress: "$upstream:8000"
                username: "<REPLACE_WITH_SYNC_TOKEN_NAME_FOR_LOWER_LAYER>"
                password: "<REPLACE_WITH_SYNC_TOKEN_PASSWORD_FOR_LOWER_LAYER>"
    
  3. Bereiten Sie die Bereitstellungsdateien der obersten und unteren Schicht vor: deploymentTopLayer.json und deploymentLowerLayer.json. Kopieren Sie die zuvor in diesem Artikel erstellten Bereitstellungsmanifestdateien in den folgenden Ordner: ~/nestedIotEdgeTutorial/iotedge_config_cli_release/templates/tutorial.

  4. Navigieren Sie zu Ihrem Verzeichnis iotedge_config_cli_release, und führen Sie das Tool aus, um Ihre Hierarchie von IoT Edge-Geräten zu erstellen.

    cd ~/nestedIotEdgeTutorial/iotedge_config_cli_release
    ./iotedge_config --config ~/nestedIotEdgeTutorial/iotedge_config_cli_release/templates/tutorial/iotedge_config.yaml --output ~/nestedIotEdgeTutorial/iotedge_config_cli_release/outputs -f
    

    Mit dem Parameter --output erstellt das Tool die Gerätezertifikate, Zertifikatpakete und eine Protokolldatei in einem Verzeichnis Ihrer Wahl. Mit dem Parameter -f sucht das Tool automatisch nach vorhandenen IoT Edge-Geräten auf Ihrer IoT Hub-Instanz und entfernt diese, um Fehler zu vermeiden und für Ihren Hub den bereinigten Zustand sicherzustellen.

    Das Programm kann mehrere Minuten lang laufen.

  5. Kopieren Sie die im vorherigen Schritt generierten Dateien top-layer.zip und lower-layer.zip mithilfe von scp auf die entsprechenden VMs der obersten und unteren Schicht:

    scp <PATH_TO_CONFIGURATION_BUNDLE>   <USER>@<VM_IP_OR_FQDN>:~
    
  6. Stellen Sie eine Verbindung mit dem Gerät der obersten Schicht her, um das Konfigurationspaket zu installieren.

    1. Entpacken Sie das Konfigurationsbündel. Sie müssen zuerst zip installieren.

      sudo apt install zip
      unzip ~/<PATH_TO_CONFIGURATION_BUNDLE>/<CONFIGURATION_BUNDLE>.zip #unzip top-layer.zip
      
    2. sudo ./install.sh ausführen. Geben Sie die IP-Adresse oder den Hostnamen ein. Wir empfehlen die Verwendung der IP-Adresse.

    3. Führen Sie sudo iotedge list aus, um zu bestätigen, dass alle Module ausgeführt werden.

  7. Stellen Sie eine Verbindung mit dem Gerät der unteren Schicht her, um das Konfigurationspaket zu installieren.

    1. Entpacken Sie das Konfigurationsbündel. Sie müssen zuerst zip installieren.

      sudo apt install zip
      unzip ~/<PATH_TO_CONFIGURATION_BUNDLE>/<CONFIGURATION_BUNDLE>.zip #unzip lower-layer.zip
      
    2. sudo ./install.sh ausführen. Geben Sie die IP-Adressen oder Hostnamen des Geräts und des übergeordneten Geräts ein. Wir empfehlen die Verwendung der IP-Adressen.

    3. Führen Sie sudo iotedge list aus, um zu bestätigen, dass alle Module ausgeführt werden.

Wenn Sie keine Bereitstellungsdatei für die Gerätekonfiguration angegeben haben oder wenn Probleme bei der Bereitstellung auftreten, z. B. ein ungültiges Bereitstellungsmanifest auf dem Gerät der obersten oder unteren Schicht, stellen Sie die Module manuell bereit. Informationen hierzu finden Sie im nächsten Abschnitt.

Manuelle Bereitstellung des verbundenen Registrierungsmoduls

Verwenden Sie den folgenden Befehl, um das verbundene Registrierungsmodul manuell auf einem IoT Edge-Gerät bereitzustellen:

az iot edge set-modules \
  --device-id <device-id> \
  --hub-name <hub-name> \
  --content <deployment-manifest-filename>

Einzelheiten finden Sie unter Bereitstellung von Azure IoT Edge-Modulen mit Azure CLI.

Nach erfolgreicher Bereitstellung weist die verbundene Registrierung den Status Online auf.

Um den Status der verbundenen Registrierung zu überprüfen, verwenden Sie den folgenden Befehl az acr connected-registry show:

az acr connected-registry show \
  --registry $REGISTRY_NAME \
  --name $CONNECTED_REGISTRY_RO \
  --output table

Möglicherweise müssen Sie einige Minuten warten, bis die Bereitstellung der verbundenen Registrierung abgeschlossen ist.

Nach erfolgreicher Bereitstellung weist die verbundene Registrierung den Status Online auf.

Führen Sie iotedge check auf dem betroffenen Gerät aus, um eine Fehlersuche durchzuführen. Weitere Informationen finden Sie unter Problembehandlung.

Nächste Schritte

In diesem Schnellstart haben Sie gelernt, wie Sie eine verbundene Registrierung für ein verschachteltes IoT Edge-Gerät bereitstellen. Fahren Sie mit der nächsten Anleitung fort, um zu erfahren, wie Sie Bilder aus der neu eingerichteten verbundenen Registrierung abrufen.