Compartilhar via


Gerenciar o gerenciador de pacotes do sistema operacional usando o Azure IoT e OSConfig

Importante

A versão 1.0.3 (publicada em 28 de junho de 2022) inclui alterações significativas nos nomes dos membros que podem afetar os usuários existentes. Para obter mais informações, consulte: Transição de nomes de membro de PascalCase para camelCase na versão 1.0.3

Público-alvo e escopo

Este artigo foi projetado para dar suporte a pessoas que provisionam ou gerenciam dispositivos com o Azure IoT. Se isso não soar como você, considere dar uma olhada na documentação do Audiences for OSConfig.

Este artigo trata sobre como obter o estado desejado do gerenciador de pacotes e definir o estado desejado do gerenciador de pacotes. Por exemplo:

Funcionalidade Casos de uso
Garantir que os gerenciadores de pacotes efetuem pull de suas fontes desejadas • Sua política operacional é que os gerenciadores de pacotes de dispositivos devem ser retirados de um repositório de pacote privado com versões aprovadas de bibliotecas e componentes
• Você precisa de dispositivos para obter pacotes do repositório de um fornecedor específico
Informar os gerenciadores de pacotes dos pacotes desejados • Sua política operacional é que os dispositivos devem ter um pacote específico, como "library-XYZ-v2"
• Sua política operacional é que os dispositivos devem ter um grafo de dependência específico de pacotes
Comparar o pacote de dispositivos
ou listas de fontes
• Sua política operacional é que a lista de pacotes instalados dos dispositivos implantados deve corresponder a um dispositivo bom conhecido

Se você estiver aqui para obter informações de referência em vez de exemplos interativos de casos de uso, você poderá ir para a seção de referência.

Importante

Neste momento, as distribuições baseadas em apt , incluindo Debian e Ubuntu, estão no escopo. Se você quiser desenvolver suporte para distribuições baseadas em RPM, consulte a documentação de extensibilidade.

Em um ambiente sem apt (por exemplo, compilando da origem e em execução em uma distribuição da família Red Hat), você pode ver as seguintes mensagens de log indicando que o módulo PackageManagerConfiguration não é aplicável.

  • Em osconfig_pmc.log, linhas incluindo o seguinte texto:
    [ERROR] Cannot run on this platform, could not find required tool apt-get
  • Em osconfig_pnp_agent.log, linhas incluindo o seguinte texto:
    [ERROR] PackageManagerConfiguration.state: MpiGet failed with 500

Exemplos de casos de uso

Esses exemplos podem servir como pontos de partida para você se adaptar ao seu ambiente exclusivo.

Pré-requisitos para experimentar os exemplos em sistemas dinâmicos

Se você estiver usando este artigo para referência, não haverá pré-requisitos. Você pode examinar os exemplos, copiar nomes de propriedades etc.

Se você quiser experimentar os exemplos em sistemas dinâmicos (recomendado), siga estas etapas:

  1. Criar uma conta gratuita do Azure ou usar uma conta existente

  2. Conectar pelo menos um dispositivo habilitado para OSConfig a um Hub IoT

    Dica

    Para criar facilmente um Hub IoT com dispositivos (virtuais) anexados, consulte Criar um ambiente de laboratório do OSConfig (com o Azure IoT) em 5 minutos

  3. Prepare-se para seguir a instrução portal do Azure ou as instruções da CLI do Azure nos exemplos:

Se preferir usar o portal do Azure

  1. Entre em seu portal do Azure e acesse a página visão geral do Hub IoT Captura de tela mostrando Hub IoT e dispositivos do Portal do Azure

-OR- Se você preferir usar a CLI do Azure

  1. RECOMENDADO: Use o Cloud Shell do Azure como seu ambiente bash entrando no Portal do Azure e iniciando o Azure Cloud Shell no modo bash Captura de tela abrindo Cloud Shell do Portal do Azure
  2. ALTERNATIVA: se você preferir usar seu próprio ambiente bash em vez de Cloud Shell, instale a CLI do Azure e entre
  3. Verifique se a extensão de IoT do Azure está pronta executando az extension add --name azure-iot

Exemplo 1. Especificar fontes de pacote desejadas

Este exemplo demonstra o fluxo de trabalho do Azure IoT para garantir que os dispositivos usem, como uma de suas fontes de pacote, o canal packages.microsoft.com prod para o Ubuntu 18.04. Você pode adaptar este exemplo para usar qualquer fonte de pacote. Por exemplo, um repositório público de distribuição/versão diferente, um repositório de um fornecedor específico ou um repositório privado que você faz a curadoria.

As instruções estão disponíveis em tipos para portal, CLI, dispositivo específico e provisionamento e gerenciamento em escala.

  1. Na página do portal do seu Hub IoT, navegue até o gêmeo OSConfig para o dispositivo que você deseja gerenciar e adicione o seguinte à properties.desired seção, seguido por uma vírgula para separá-lo do próximo item em properties.desired.

    "PackageManagerConfiguration": {
       "desiredState": {
          "gpgKeys": {
             "pkgs-msft_key": "https://packages.microsoft.com/keys/microsoft.asc"
          },
          "sources": {
             "pkgs-msft_insiders-slow": "deb [arch=amd64,armhf,arm64 signed-by=pkgs-msft_key] https://packages.microsoft.com/ubuntu/18.04/prod insiders-slow main"
          },
          "packages": [
          ]
       }
    }
    
    

    Captura de tela mostrando como configurar a configuração do gerenciador de pacotes no Portal do Azure

O exemplo 1 foi sobre a definição de uma nova fonte de pacote. Para relatar o mesmo, continue para o Exemplo 2.

Exemplo 2. Relatório sobre o estado e a configuração do gerenciador de pacotes

Neste exemplo, relataremos:

  1. Quais fontes de pacotes foram adicionadas
  2. Se algum dispositivo está enfrentando erros de PackageManagerConfiguration

No Exemplo 1 acima, adicionamos um valor de PackageManagerConfiguration desejado ao módulo gêmeo OSConfig de um dispositivo específico. Agora podemos observar os resultados.

  1. Aguarde 1 minuto (para comunicações de rede, atividade do lado do dispositivo etc.) depois de ter adicionado o PackageManagerConfiguration desejado no exemplo acima

  2. No módulo gêmeo OSConfig do mesmo dispositivo, navegue até as propriedades e, em seguida, reporte e, em seguida, PackageManagerConfiguration e, em seguida, estado.

  3. Isso mostrará o status mais recente da configuração do gerenciador de pacotes.

    1. sourcesFileNames deve refletir os dois canais adicionados
    2. executionStatus deve ser 2. Para obter valores possíveis, consulte: documentação de extensibilidade

    Captura de tela mostrando como verificar a configuração do gerenciador de pacotes no Portal do Azure

Informações de referência

Descrição do modelo de objeto

Esta seção descreve as propriedades do gêmeo e os comportamentos correspondentes.

É útil entender que, no Azure IoT, há dois modelos mentais ou perspectivas para descrever o conteúdo gêmeo.

  • Perspectiva simples desejada/relatada

    Esse é o modelo de objeto principal Hub IoT. Ele é usado pelo serviço de consulta Hub IoT, Hub IoT serviço de configurações, az iot hub module-twin comandos e pelas exibições de gêmeo simples no Portal do Azure e no IoT Explorer.

  • Perspectiva aprimorada da DTDL (Linguagem de Definição de Gêmeo Digital)

    O DTDL (com padrões correspondentes, incluindo o Azure IoT Plug and Play [PnP]) permite que aplicativos e serviços antecipem, validem e contextualizem melhor o conteúdo do gêmeo. Isso é usado pelas exibições PnP no IoT Explorer, pelo serviço dos Gêmeos Digitais do Azure e potencialmente pela sua solução de nuvem ao interagir com Hub IoT.

Na maioria dos casos abaixo, nenhuma distinção é necessária. Por exemplo, "gpgKeys" é chamado de "gpgKeys" em qualquer ponto de exibição.

Em certos casos, uma distinção pode ser útil. Por exemplo, os valores de caminho fornecidos abaixo. Nesses casos, a descrição simples desejada/relatada é fornecida primeiro, seguida por uma perspectiva aprimorada de DTDL em parênteses.

desiredState (entrada do administrador)
  • Caminho: properties.desired.PackageManagerConfiguration.desiredState (DTDL: PackageManagerConfiguration componente -->desiredState propriedade gravável)

  • Descrição: entrada do administrador; habilita a adição de fontes de pacote e pacotes a dispositivos

  • Membros

    Nome Type Observações
    origens mapa de sourceName: sourceDescriptor pares (cadeias de caracteres) Para cada par no dicionário:
    sourceName é um identificador especificado pelo administrador, por exemplo: *my-source-foo*
    sourceDescriptor é uma cadeia de caracteres de definição de origem no formato usado pelo gerenciador de pacotes; por exemplo: deb [arch=amd64,armhf,arm64 signed-by=my-repo-key] https://packages.microsoft.com/ubuntu/18.04/prod focal main
    • Dentro sourceDescriptor do valor passado deve signed-by= ser o nome de uma chave de gpgKeys (descrito abaixo); por exemplo: signed-by=my-source-foo-key
    • Ao adicionar ou modificar uma origem, um arquivo em sources.list.d será preenchido (substituindo o arquivo existente se presente) com o descritor de origem
    • Para especificar que os dispositivos não devem usar uma fonte específica (supondo que ela tenha sido definida anteriormente em sources.list.d, não em outro lugar do sistema), inclua um par como "my-source-bar": ""; Se um arquivo chamado my-source-bar.list existir em sources.list.d , ele será removido
    • Se você não precisar mais de uma diretiva não deve usar (por exemplo, minha barra de origem não é mais relevante após algum tempo), você pode removê-la do gêmeo desejado alterando o valor de "my-source-bar": "" para "my-source-bar": null
    gpgKeys mapa de key-name: uri pares (cadeias de caracteres) Usado para informar o pacote
    gerente de chaves públicas do repositório;
    Para cada par no dicionário:
    key-name é um identificador especificado pelo administrador; por exemplo: my-repo-foo-key, que é referenciado em signed-bysources
    uri é o local da chave pública de um repositório; por exemplo: https://packages.microsoft.com/keys/microsoft.asc
    • A chave é adicionada como um arquivo a /usr/share/keyrings/; Observe que, para garantir que a aplicabilidade da chave esteja no escopo, esse caminho não específico é usado; apt só aplicará essa chave a fontes que estão explicitamente associadas a ela (por meio de signed-by
    • Para remover um arquivo de chave de /usr/share/keyrings definido key-name para corresponder ao nome do arquivo (sem extensão) e definir uri como ""
    pacotes matriz de identificadores de pacote (cadeias de caracteres) • Instrui o gerenciador de pacotes a garantir que esses pacotes sejam instalados
    • Análogo a apt instalar <nomes> de pacote no Debian
    • Aditivo (não destrutivo) por natureza; por exemplo, uma lista vazia significa "não fazer nada" (não "desinstalar todos os pacotes no sistema")
  • Conteúdo de exemplo (como visto na seção do properties.desired gêmeo de um gêmeo Hub IoT)

    "PackageManagerConfiguration": {
        "desiredState": {
           "gpgKeys": {
              "pkgs-msft_key": "https://packages.microsoft.com/keys/microsoft.asc"
           },
           "sources": {
              "pkgs-msft_insiders-slow": "deb [arch=amd64,armhf,arm64 signed-by=pkgs-msft_key] https://packages.microsoft.com/ubuntu/18.04/prod insiders-slow main"
           },
           "packages": [
              "cowsay"
           ]
        }
    }
    
state
  • Caminho: properties.reported.PackageManagerConfiguration.state (perspectiva DTDL: PackageManagerConfiguration componente -->state propriedade somente leitura)

  • Descrição: estado PackageManagerConfiguration, conforme relatado pelo dispositivo

  • Membros

    Nome Type Observações
    packagesFingerprint string • Impressão digital opaca para a lista de todos os pacotes instalados no dispositivo (não limitado a pacotes referenciados em desiredState.packages)
    • Usado para comparar um grande número de dispositivos com um dispositivo conhecido
    pacotes matriz de identificadores de pacote (cadeias de caracteres) • Nome e status (versão ou "falha") dos pacotes especificados pelo administrador de desiredState.packages
    • Se um pacote tiver sido instalado com êxito, o nome será seguido pelo número de versão instalado
    • Se não foi possível instalar um pacote, o nome será seguido por "falha"
    sourcesFingerprint string • Impressão digital opaca das fontes de pacote usadas pelo dispositivo
    • Usado para comparar um grande número de dispositivos com um dispositivo conhecido
    sourcesFilenames matriz de nomes de arquivo (cadeias de caracteres) • Lista de fontes de pacote (como nomes de arquivo, por exemplo , my-repo.list) que foram adicionadas ao gerenciador de pacotes por meio de /etc/apt/sources.list.d (no Debian)
    • Inclui todas as fontes presentes, independentemente de terem sido adicionadas por meio de desiredState.sources
    executionState INT • Estado geral de êxito/falha
    • Os valores nominais são 0 (estado inicial, nenhum desiredState foi especificado) ou 2 (êxito)
    • Para outros valores, consulte: documentação de extensibilidade
    executionSubstate INT • Para obter valores possíveis, consulte: documentação de extensibilidade
    executionSubstateDetails string • Informações adicionais para solução de problemas
  • Conteúdo de exemplo (como visto na seção do properties.reported gêmeo)

    "PackageManagerConfiguration": {
        "state": {
           "packagesFingerprint": "9e7a85de3d067474e3621d7e1618f6ac0e2e8fc6cb9d60ee92af9927294114d3",
           "packages": [
              "cowsay=3.03+dfsg2-7"
           ],
           "executionState": 2,
           "executionSubstate": 0,
           "executionSubstateDetails": "",
           "sourcesFingerprint": "64b7de49c2be4ef2c180e4a978300fbb7b8a743a89e4038ba7ac6a91c31b625f",
           "sourcesFilenames": [
              "pkgs-msft_insiders-slow.list"
           ]
        }
    }
    
desiredState (relatado; confirmação do dispositivo)
  • Caminho: properties.reported.PackageManagerConfiguration.desiredState (perspectiva DTDL: PackageManagerConfiguration componente --> parte ACK da desiredState propriedade gravável)

  • Descrição: esse elemento relatado adicional é uma confirmação do dispositivo; para ferramentas de administração e suplementos de relatório, permitindo que a cadeia de ferramentas statede administrador determine se o dispositivo ainda recebeu a intenção de administrador capturada no admin-writable/desired desiredState

  • Membros

    Nome Type Observações
    value objeto • Deve espelhar properties.desired.PackageManagerConfiguration.desiredState
    ac INT • Indica êxito (valor 200) ou falha (valor 400) do dispositivo que recebe e processa desiredState do administrador

Próximas etapas

Para obter uma visão geral dos cenários e funcionalidades do OSConfig, consulte:

Para obter exemplos práticos específicos, consulte: