Zelfstudie: Een verbonden register implementeren in een geneste IoT Edge-hiërarchie

In deze zelfstudie gebruikt u Azure CLI-opdrachten om een tweelaagshiërarchie van Azure IoT Edge-apparaten te maken en een verbonden register te implementeren als module op elke laag. In dit scenario communiceert een apparaat in de bovenste laag met een cloudregister. Een apparaat in de onderste laag communiceert met het gekoppelde bovenliggende register in de bovenste laag.

Zie Verbonden register gebruiken met Azure IoT Edge voor een overzicht van het gebruik van een verbonden register met IoT Edge.

Vereisten

  • Azure IoT Hub. Zie Een IoT-hub maken met behulp van de Azure Portal voor implementatiestappen.

  • Twee verbonden registerresources in Azure. Zie quickstarts met de Azure CLI of Azure Portal voor implementatiestappen.

    • Voor de bovenste laag kan het verbonden register zich in de modus ReadWrite of ReadOnly bevinden. In dit artikel wordt ervan uitgegaan dat de readWrite-modus wordt gebruikt en dat de naam van het verbonden register wordt opgeslagen in de omgevingsvariabele $CONNECTED_REGISTRY_RW.
    • Voor de onderste laag moet het verbonden register zich in de modus ReadOnly bevinden. In dit artikel wordt ervan uitgegaan dat de naam van het verbonden register is opgeslagen in de omgevingsvariabele $CONNECTED_REGISTRY_RO.

Installatiekopieën importeren in uw cloudregister

Importeer de volgende containerinstallatiekopieën in uw cloudregister met behulp van de opdracht az acr import . Sla deze stap over als u deze installatiekopieën al hebt geïmporteerd.

Installatiekopieën van verbonden register

Ter ondersteuning van geneste IoT Edge scenario's moet de containerinstallatiekopie voor de verbonden registerruntime beschikbaar zijn in uw persoonlijke Azure-containerregister. Gebruik de opdracht az acr import om de verbonden registerinstallatiekopieën te importeren in uw privéregister.

# 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

IoT Edge- en API-proxy-installatiekopieën

Als u het verbonden register op geneste IoT Edge wilt ondersteunen, moet u modules implementeren voor de IoT Edge en API-proxy. Importeer deze installatiekopieën in uw persoonlijke register.

Met de IoT Edge API-proxymodule kan een IoT Edge apparaat meerdere services beschikbaar maken met behulp van het HTTPS-protocol op dezelfde poort, zoals 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

Hello-world-afbeelding

Importeer de installatiekopieën om het verbonden register te hello-world testen. Deze opslagplaats wordt gesynchroniseerd met het verbonden register en opgehaald door de verbonden registerclients.

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

Configuratie van verbonden register ophalen

Als u elk verbonden register wilt implementeren op het IoT Edge apparaat in de hiërarchie, moet u configuratie-instellingen ophalen uit de verbonden registerresource in Azure. Voer indien nodig de opdracht az acr connected-registry get-settings uit voor elk verbonden register om de configuratie op te halen.

Standaard bevat de informatie over instellingen niet het wachtwoord voor het synchronisatietoken , dat ook nodig is om het verbonden register te implementeren. U kunt desgewenst een van de wachtwoorden genereren door de --generate-password 1 parameter of --generate-password 2 door te geven. Sla het gegenereerde wachtwoord op een veilige locatie op. Het kan niet opnieuw worden opgehaald.

Waarschuwing

Het opnieuw genereren van een wachtwoord roteert de referenties van het synchronisatietoken. Als u een apparaat hebt geconfigureerd met het vorige wachtwoord, moet u de configuratie bijwerken.

# 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

Opdrachtuitvoer bevat de register-connection string en gerelateerde instellingen. In de volgende voorbeelduitvoer ziet u de connection string voor het verbonden register met de naam myconnectedregistry met het bovenliggende register contosoregistry:

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

Implementatiemanifesten configureren

Een implementatiemanifest is een JSON-document waarin wordt beschreven welke modules moeten worden geïmplementeerd op een IoT Edge-apparaat. Zie Begrijpen hoe IoT Edge modules kunnen worden gebruikt, geconfigureerd en hergebruikt voor meer informatie.

Als u de verbonden registermodule op elk IoT Edge apparaat wilt implementeren met behulp van de Azure CLI, slaat u de volgende implementatiemanifesten lokaal op als JSON-bestanden. Gebruik de informatie uit de vorige secties om de relevante JSON-waarden in elk manifest bij te werken. Gebruik de bestandspaden in de volgende sectie wanneer u de opdracht uitvoert om de configuratie toe te passen op uw apparaat.

Implementatiemanifest voor de bovenste laag

Maak voor het apparaat in de bovenste laag een implementatiemanifestbestand deploymentTopLayer.json met de volgende inhoud. Dit manifest is vergelijkbaar met het manifest dat wordt gebruikt in Quickstart: Een verbonden register implementeren op een IoT Edge-apparaat.

Notitie

Als u al een verbonden register hebt geïmplementeerd op een bovenste laag IoT Edge apparaat met behulp van de quickstart, kunt u dit in de bovenste laag van een geneste hiërarchie gebruiken. Wijzig de implementatiestappen in deze zelfstudie om deze te configureren in de hiërarchie (niet weergegeven).

Instellingen voor verbonden registermodules

  • Gebruik de tokenreferenties en connection string uit de vorige secties om de relevante JSON-waarden in het env knooppunt bij te werken.

  • De volgende omgevingsvariabelen zijn optioneel in het env knooppunt:

    Variabele Beschrijving
    ACR_REGISTRY_LOGIN_SERVER Hiermee geeft u een unieke hostnaam of FQDN op. Indien gebruikt, accepteert het verbonden register alleen aanvragen voor deze aanmeldingsserverwaarde.

    Als er geen waarde wordt opgegeven, kan het verbonden register worden geopend met elke waarde voor de aanmeldingsserver.
    ACR_REGISTRY_CERTIFICATE_VOLUME Als het verbonden register toegankelijk is via HTTPS, verwijst u naar het volume waar de HTTPS-certificaten zijn opgeslagen.

    Als dit niet is ingesteld, is /var/acr/certsde standaardlocatie .
    ACR_REGISTRY_DATA_VOLUME Overschrijft de standaardlocatie /var/acr/data waar de installatiekopieën worden opgeslagen door het verbonden register.

    Deze locatie moet overeenkomen met de volumebinding voor de container.

    Belangrijk

    Als het verbonden register luistert op een andere poort dan 80 en 443, moet de ACR_REGISTRY_LOGIN_SERVER waarde (indien opgegeven) de poort bevatten. Bijvoorbeeld: 192.168.0.100:8080.

  • Er HostPort moet een binding voor het verbonden register worden ingesteld als de API-proxymodule niet wordt gebruikt. Voorbeeld:

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

Instellingen voor API-proxymodules

  • De API-proxy luistert op poort 8000 die is geconfigureerd als NGINX_DEFAULT_PORT. Zie de IoT Edge GitHub-opslagplaats voor meer informatie over de API-proxyinstellingen.
{
    "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
                }
            }
        }
    }
}

Implementatiemanifest voor de onderste laag

Maak voor het apparaat in de onderste laag een implementatiemanifestbestand deploymentLowerLayer.json met de volgende inhoud.

Over het algemeen is het implementatiebestand van de onderste laag vergelijkbaar met het implementatiebestand van de bovenste laag. De verschillen zijn:

  • De vereiste installatiekopieën worden opgehaald uit het met de bovenste laag verbonden register in plaats van uit het cloudregister.

    Wanneer u het met de bovenste laag verbonden register instelt, moet u ervoor zorgen dat alle vereiste installatiekopieën lokaal worden gesynchroniseerd, inclusief azureiotedge-agent, azureiotedge-hub, azureiotedge-api-proxyen acr/connected-registry. Het IoT-apparaat in de onderste laag moet deze installatiekopieën ophalen uit het verbonden register van de bovenste laag.

  • Het maakt gebruik van het synchronisatietoken dat is geconfigureerd op de onderste laag om te verifiëren met het verbonden register van de bovenste laag.

  • Het bovenliggende gateway-eindpunt wordt geconfigureerd met het IP-adres of de FQDN van het bovenste laag verbonden register in plaats van met de FQDN van het cloudregister.

Belangrijk

In het volgende implementatiemanifest $upstream wordt gebruikt als het IP-adres of de FQDN van het apparaat dat als host fungeert voor het bovenliggende verbonden register. Wordt echter $upstream niet ondersteund in een omgevingsvariabele. Het verbonden register moet de omgevingsvariabele ACR_PARENT_GATEWAY_ENDPOINT lezen om het eindpunt van de bovenliggende gateway op te halen. In plaats van te gebruiken $upstream, ondersteunt het verbonden register het dynamisch omzetten van het IP-adres of de FQDN vanuit een andere omgevingsvariabele.

Op de geneste IoT Edge bevindt zich een omgevingsvariabele $IOTEDGE_PARENTHOSTNAME op de onderste laag die gelijk is aan het IP-adres of de FQDN van het bovenliggende apparaat. Vervang de omgevingsvariabele handmatig als de waarde van ParentGatewayEndpoint in de connection string om te voorkomen dat het bovenliggende IP-adres of de FQDN wordt gecodeerd. Omdat het bovenliggende apparaat in dit voorbeeld wordt uitgevoerd nginx op poort 8000, geeft u door $IOTEDGE_PARENTHOSTNAME:8000. U moet ook het juiste protocol selecteren in ParentEndpointProtocol.

{
    "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
                }
            }
        }
    }
}

Verbonden registermodules instellen en implementeren

De volgende stappen zijn aangepast uit Zelfstudie: Een hiërarchie van IoT Edge apparaten maken en zijn specifiek voor het implementeren van verbonden registermodules in de IoT Edge-hiërarchie. Zie deze zelfstudie voor meer informatie over afzonderlijke stappen.

Apparaten in de bovenste en onderste laag maken

Virtuele machines in de bovenste en onderste laag maken met behulp van een bestaande ARM-sjabloon. Met de sjabloon wordt ook de IoT Edge-agent geïnstalleerd. Als u in plaats daarvan vanaf uw eigen apparaten wilt implementeren, raadpleegt u Zelfstudie: Azure IoT Edge voor Linux installeren of verwijderen voor meer informatie over het handmatig instellen van het apparaat.

Belangrijk

Voor latere toegang tot de modules die zijn geïmplementeerd op het apparaat in de bovenste laag, moet u de volgende poorten voor inkomend verkeer openen: 8000, 443, 5671, 8883. Zie Poorten openen op een virtuele machine met de Azure Portal voor configuratiestappen.

De hiërarchie maken en configureren

Gebruik het iotedge-config hulpprogramma om uw hiërarchie te maken en te configureren door deze stappen te volgen in de Azure CLI of Azure Cloud Shell:

  1. Download het configuratieprogramma.

     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
    

    Met deze stap maakt u de iotedge_config_cli_release map in de map zelfstudie. Het sjabloonbestand dat wordt gebruikt om uw apparaathiërarchie te maken, is het iotedge_config.yaml bestand in ~/nested_iot_edge_tutorial/iotedge_config_cli_release/templates/tutorial. In dezelfde map bevinden zich twee implementatiemanifesten voor de bovenste en onderste lagen: deploymentTopLayer.json en deploymentLowerLayer.json bestanden.

  2. Bewerken iotedge_config.yaml met uw gegevens. Bewerk de bestandsnamen van het iothub_hostnameiot_nameimplementatiemanifest , voor de bovenste laag en de onderste laag, en de clienttokenreferenties die u hebt gemaakt om installatiekopieën upstream uit elke laag op te halen. Het volgende voorbeeld is een voorbeeldconfiguratiebestand:

    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. Bereid de implementatiebestanden voor de bovenste en onderste laag voor: deploymentTopLayer.json en deploymentLowerLayer.json. Kopieer de implementatiemanifestbestanden die u eerder in dit artikel hebt gemaakt naar de volgende map: ~/nestedIotEdgeTutorial/iotedge_config_cli_release/templates/tutorial.

  4. Navigeer naar de map iotedge_config_cli_release en voer het hulpprogramma uit om uw hiërarchie van IoT Edge apparaten te maken.

    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
    

    Met de --output parameter maakt het hulpprogramma de apparaatcertificaten, certificaatbundels en een logboekbestand in een map van uw keuze. Met de -f parameter zoekt het hulpprogramma automatisch naar bestaande IoT Edge apparaten in uw IoT Hub en verwijdert deze om fouten te voorkomen en uw hub schoon te houden.

    Het hulpprogramma kan enkele minuten worden uitgevoerd.

  5. Kopieer de gegenereerde top-layer.zip - en lower-layer.zip-bestanden die in de vorige stap zijn gegenereerd naar de bijbehorende virtuele machines in de bovenste en onderste laag met behulp van scp:

    scp <PATH_TO_CONFIGURATION_BUNDLE>   <USER>@<VM_IP_OR_FQDN>:~
    
  6. Maak verbinding met het apparaat in de bovenste laag om de configuratiebundel te installeren.

    1. Pak de configuratiebundel uit. U moet eerst zip installeren.

      sudo apt install zip
      unzip ~/<PATH_TO_CONFIGURATION_BUNDLE>/<CONFIGURATION_BUNDLE>.zip #unzip top-layer.zip
      
    2. Voer sudo ./install.sh uit. Voer het IP-adres of de hostnaam in. U wordt aangeraden het IP-adres te gebruiken.

    3. Voer uit sudo iotedge list om te bevestigen dat alle modules worden uitgevoerd.

  7. Maak verbinding met het apparaat in de onderste laag om de configuratiebundel te installeren.

    1. Pak de configuratiebundel uit. U moet eerst zip installeren.

      sudo apt install zip
      unzip ~/<PATH_TO_CONFIGURATION_BUNDLE>/<CONFIGURATION_BUNDLE>.zip #unzip lower-layer.zip
      
    2. Voer sudo ./install.sh uit. Voer het apparaat en de bovenliggende IP-adressen of hostnamen in. U wordt aangeraden de IP-adressen te gebruiken.

    3. Voer uit sudo iotedge list om te bevestigen dat alle modules worden uitgevoerd.

Als u geen implementatiebestand voor apparaatconfiguratie hebt opgegeven of als er implementatieproblemen optreden, zoals een ongeldig implementatiemanifest op het apparaat in de bovenste of onderste laag, implementeert u de modules handmatig. Zie de volgende sectie.

De verbonden registermodule handmatig implementeren

Gebruik de volgende opdracht om de verbonden registermodule handmatig te implementeren op een IoT Edge apparaat:

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

Zie Azure IoT Edge-modules implementeren met Azure CLI voor meer informatie.

Na een geslaagde implementatie geeft het verbonden register de status weer van Online.

Als u de status van het verbonden register wilt controleren, gebruikt u de volgende opdracht az acr connected-registry show :

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

Mogelijk moet u enkele minuten wachten totdat de implementatie van het verbonden register is voltooid.

Na een geslaagde implementatie geeft het verbonden register de status weer van Online.

Als u problemen met een implementatie wilt oplossen, voert u uit iotedge check op het betreffende apparaat. Zie Probleemoplossing voor meer informatie .

Volgende stappen

In deze quickstart hebt u geleerd hoe u een verbonden register implementeert op een geneste IoT Edge apparaat. Ga door naar de volgende handleiding voor meer informatie over het ophalen van installatiekopieën uit het zojuist geïmplementeerde verbonden register.