Planeamiento de la migración de State Configuration de Azure Automation a la configuración de máquina

La configuración de máquina es la implementación más reciente de la funcionalidad proporcionada por State Configuration de Azure Automation (también conocida como Azure Automation Desired State Configuration o AADSC). Cuando sea posible, debe planear el traslado de su contenido y sus máquinas al nuevo servicio. En este artículo se proporcionan instrucciones sobre cómo desarrollar una estrategia de migración de Azure Automation a la configuración de máquina.

Las nuevas características de la configuración de máquina abordan las solicitudes de los clientes:

  • Aumento del límite de tamaño para las configuraciones a 100 MB
  • Informes avanzados a través de Azure Resource Graph, incluidos el Id. y el estado de los recursos
  • Administración de varias configuraciones para la misma máquina
  • Control de cuándo se produce la corrección en aquellos casos en los que la máquinas se desvían del estado deseado
  • Consumo de recursos de DCS basados en PowerShell por parte de Linux y Windows

Antes de empezar, es aconsejable leer la información conceptual general que está disponible en la página Configuración de máquina de Azure Policy.

Descripción de la migración

El mejor método de migración es, primero, volver a implementar el contenido y, después, migrar las máquinas. En esta sección se describen los pasos esperados para la migración.

  1. Exportación de configuraciones desde Azure Automation
  2. Detección de los requisitos de módulo y carga en el entorno
  3. Compilación de configuraciones
  4. Creación y publicación de paquetes de configuración de máquina
  5. Paquetes de configuración de la máquina de prueba
  6. Incorporación de máquinas híbridas a Azure Arc
  7. Anulación del registro de servidores de Azure Automation State Configuration
  8. Asignación de configuraciones a servidores mediante la configuración de máquina

La configuración de máquina usa la versión 3 de DSC con la versión 7 de PowerShell. La versión 3 de DSC puede coexistir con versiones anteriores en Windows y Linux. Las implementaciones son independientes. Sin embargo, no se detectan posibles conflictos.

La configuración de máquina no requiere la publicación de módulos o configuraciones en un servicio ni la compilación en este. En su lugar, desarrolla y prueba el contenido mediante herramientas creadas específicamente y lo publica en cualquier lugar al que la máquina pueda acceder a través de HTTPS (normalmente Azure Blob Storage).

Si decide tener máquinas en ambos servicios durante cierto tiempo, no habrá ninguna limitación técnica. Ambos servicios son independientes.

Exportación de contenido desde Azure Automation

Empiece detectando y exportando contenido desde Azure Automation State Configuration a un entorno de desarrollo donde cree, pruebe y publique paquetes de contenido para la configuración de máquina.

Configurations

Solo puede exportar scripts de configuración desde Azure Automation. No es posible exportar configuraciones de nodo ni archivos MOF compilados. Si ha publicado archivos MOF directamente en la cuenta de Automation y ya no tiene acceso al archivo original, debe volver a compilar la configuración a partir de los scripts privados. Si no encuentra la configuración original, debe volver a crearla.

Para exportar scripts de configuración desde Azure Automation, primero identifique la cuenta del servicio que tiene las configuraciones y el nombre del grupo de recursos donde está implementada.

Instale el módulo de PowerShell Az.Automation.

Install-Module -Name Az.Automation

A continuación, use el comando Get-AzAutomationAccount para identificar las cuentas de Automation y el grupo de recursos donde están implementadas. Las propiedades ResourceGroupName y AutomationAccountName son importantes para los siguientes pasos.

Get-AzAutomationAccount
SubscriptionId        : <your-subscription-id>
ResourceGroupName     : <your-resource-group-name>
AutomationAccountName : <your-automation-account-name>
Location              : centralus
State                 :
Plan                  :
CreationTime          : 6/30/2021 11:56:17 AM -05:00
LastModifiedTime      : 6/30/2021 11:56:17 AM -05:00
LastModifiedBy        :
Tags                  : {}

Detecte las configuraciones en su cuenta de Automation. La salida tiene una entrada por configuración. Si tiene muchas, almacene la información como una variable para que sea más fácil trabajar con ella.

$getParams = @{
    ResourceGroupName     = '<your-resource-group-name>'
    AutomationAccountName = '<your-automation-account-name>'
}

Get-AzAutomationDscConfiguration @getParams
ResourceGroupName     : <your-resource-group-name>
AutomationAccountName : <your-automation-account-name>
Location              : centralus
State                 : Published
Name                  : <your-configuration-name>
Tags                  : {}
CreationTime          : 6/30/2021 12:18:26 PM -05:00
LastModifiedTime      : 6/30/2021 12:18:26 PM -05:00
Description           :
Parameters            : {}
LogVerbose            : False

Por último, exporte cada configuración a un archivo de script local mediante el comando Export-AzAutomationDscConfiguration. El nombre de archivo resultante usa el patrón \ConfigurationName.ps1.

$exportParams = @{
    OutputFolder          = '<location-on-your-machine>'
    ResourceGroupName     = '<your-resource-group-name>'
    AutomationAccountName = '<your-automation-account-name>'
    Name                  = '<your-configuration-name>'
}
Export-AzAutomationDscConfiguration @exportParams
UnixMode   User             Group                 LastWriteTime           Size Name
--------   ----             -----                 -------------           ---- ----
                                               12/31/1600 18:09

Exportación de configuraciones mediante la canalización de PowerShell

Una vez que haya detectado sus cuentas y el número de configuraciones, es posible que quiera exportar todas las configuraciones a una carpeta local de su máquina. Para automatizar este proceso, canalice la salida de cada comando de los ejemplos anteriores al siguiente comando.

En el ejemplo se exportan cinco configuraciones. El patrón de salida es la única indicación de éxito.

Get-AzAutomationAccount |
    Get-AzAutomationDscConfiguration |
    Export-AzAutomationDSCConfiguration -OutputFolder <location on your machine>
UnixMode   User             Group                 LastWriteTime           Size Name
--------   ----             -----                 -------------           ---- ----
                                               12/31/1600 18:09
                                               12/31/1600 18:09
                                               12/31/1600 18:09
                                               12/31/1600 18:09
                                               12/31/1600 18:09

Posibilidad de descomponer archivos de configuración complejos

La configuración de máquina puede administrar más de una configuración por máquina. Muchas configuraciones escritas para Azure Automation State Configuration daban por sentada la limitación de administrar una única configuración por máquina. Para aprovechar las funcionalidades ampliadas que ofrece la configuración de máquina, puede dividir los archivos de configuración de gran tamaño en muchas configuraciones más pequeñas, donde cada una se encarga de un escenario específico.

No hay ninguna orquestación en la configuración de máquina para controlar el orden de las configuraciones. Mantenga los pasos de una configuración juntos en un paquete si es necesario que ocurran secuencialmente.

Módulos

No es posible exportar módulos desde Azure Automation ni correlacionar automáticamente qué configuraciones requieren qué módulos y versiones. Debe tener los módulos en su entorno local para crear un paquete de configuración de máquina. Si desea crear una lista de los módulos que necesita para la migración, use PowerShell para consultar a Azure Automation el nombre y la versión de los módulos.

Si usa módulos personalizados de creación propia que solo existen en su entorno de desarrollo privado, no es posible exportarlos desde Azure Automation.

Si no encuentra un módulo personalizado en el entorno necesario para una configuración y en la cuenta, no puede compilar la configuración. Por lo tanto, no se puede migrar la configuración.

Enumeración de los módulos importados en Azure Automation

Para recuperar una lista de todos los módulos instalados en su cuenta de Automation, use el comando Get-AzAutomationModule. La propiedad IsGlobal le indica si el módulo está integrado siempre en Azure Automation o si se ha publicado en la cuenta.

Por ejemplo, para crear una lista de todos los módulos publicados en cualquiera de sus cuentas:

Get-AzAutomationAccount |
    Get-AzAutomationModule |
    Where-Object IsGlobal -eq $false

También puede usar la Galería de PowerShell como ayuda para encontrar detalles sobre los módulos que están disponibles públicamente. En el ejemplo siguiente se enumeran los módulos integrados en nuevas cuentas de Automation y que contienen recursos de DSC.

Get-AzAutomationAccount |
    Get-AzAutomationModule |
    Where-Object IsGlobal -eq $true |
    Find-Module -ErrorAction SilentlyContinue |
    Where-Object {'' -ne $_.Includes.DscResource} |
    Select-Object -Property Name, Version -Unique |
    Format-Table -AutoSize
Name                       Version
----                       -------
AuditPolicyDsc             1.4.0
ComputerManagementDsc      8.4.0
PSDscResources             2.12.0
SecurityPolicyDsc          2.10.0
xDSCDomainjoin             1.2.23
xPowerShellExecutionPolicy 3.1.0.0
xRemoteDesktopAdmin        1.1.0.0

Si los módulos se han importado desde la Galería de PowerShell, puede canalizar la salida desde Find-Module directamente en Install-Module. La canalización de la salida entre comandos proporciona una solución para cargar un entorno de desarrollador con todos los módulos que se encuentran en una cuenta de Automation y están disponibles en la Galería de PowerShell.

Puede usar el mismo método para extraer módulos de una fuente de NuGet personalizada si ha registrado la fuente en su entorno local como repositorio de PowerShellGet.

El comando Find-Module de este ejemplo no suprime los errores, por lo que los módulos que no se encuentren en la galería devolverán un mensaje de error.

Get-AzAutomationAccount |
    Get-AzAutomationModule |
    Where-Object IsGlobal -eq $false |
    Find-Module |
    Where-Object { '' -ne $_.Includes.DscResource } |
    Install-Module

Inspección de scripts de configuración para comprobar si cumplen los requisitos de módulo

Si ha exportado scripts de configuración desde Azure Automation, también puede revisar el contenido para obtener detalles sobre los módulos que deben compilar cada configuración en un archivo MOF. Este enfoque solo es necesario si encuentra configuraciones en sus cuentas de Automation donde se hayan eliminado los módulos. En ese caso, las configuraciones ya no serían útiles para las máquinas, pero puede que sí en la cuenta.

Hacia la parte superior de cada archivo, busque una línea que incluya Import-DscResource. Este comando solo es aplicable dentro de una configuración y se usa para cargar módulos en el momento de la compilación.

En el siguiente ejemplo es la configuración WindowsIISServerConfig de la Galería de PowerShell la que tiene las líneas.

configuration WindowsIISServerConfig
{

Import-DscResource -ModuleName @{ModuleName = 'xWebAdministration';ModuleVersion = '1.19.0.0'}
Import-DscResource -ModuleName 'PSDesiredStateConfiguration'

La configuración requiere que tenga la versión 1.19.0.0 del módulo xWebAdministration y el módulo PSDesiredStateConfiguration.

Prueba del contenido en la configuración de máquina de Azure

Para evaluar si puede usar su contenido de State Configuration de Azure Automation con la configuración de máquina, siga el tutorial paso a paso de la página Creación de artefactos de paquetes de configuración de máquina personalizados.

Cuando llegue al paso Creación de una configuración, el script de configuración que genera un archivo MOF debe ser uno de los scripts que haya exportado desde Azure Automation State Configuration. Debe tener instalados en su entorno los módulos de PowerShell necesarios para poder compilar la configuración en un archivo MOF y crear un paquete de configuración de máquina.

¿Qué ocurre si un módulo no funciona con la configuración de máquina?

Algunos módulos pueden tener problemas de compatibilidad con la configuración de máquina. Los problemas más comunes guardan relación con el uso de .NET Framework o .NET Core. Dispone de información técnica detallada en la página Diferencias entre Windows PowerShell 5.1 y PowerShell 7.x.

Una opción para resolver problemas de compatibilidad es ejecutar comandos en Windows PowerShell desde dentro de un módulo importado en PowerShell 7, ejecutando powershell.exe. Puede revisar un módulo de ejemplo en el que se usa esta técnica en el repositorio de Azure-Policy, donde se usa para auditar el estado de la configuración DSC de Windows.

En el ejemplo también se ilustra una pequeña prueba de concepto:

# example function that could be loaded from module
function New-TaskResolvedInPWSH7 {
    # runs the fictitious command 'Get-myNotCompatibleCommand' in Windows PowerShell
    $compatObject = & powershell.exe -NoProfile -NonInteractive -Command {
        Get-myNotCompatibleCommand
    }
    # resulting object can be used in PowerShell 7
    return $compatObject
}

¿Tengo que agregar la propiedad Reasons a Get-TargetResource en todos los módulos que migre?

La implementación de la propiedad Reasons proporciona una mejor experiencia al ver los resultados de una asignación de configuración desde Azure Portal. Si el método Get de un módulo no incluye Reasons, se devuelve una salida genérica con detalles de las propiedades devueltas por el método Get. Por lo tanto, es opcional para la migración.

Machines

Cuando haya terminado de probar el contenido de Azure Automation State Configuration en la configuración de máquina, desarrolle un plan para migrar las máquinas.

Azure Automation State Configuration está disponible para máquinas virtuales ubicadas tanto dentro como fuera de Azure. Debe planear cada uno de estos escenarios aplicando distintos pasos.

Máquinas virtuales de Azure

Las máquinas virtuales de Azure ya tienen un recurso en Azure, por lo que están listas para asignaciones de configuración de máquina que las asocien a una configuración. Las tareas de nivel superior para migrar máquinas virtuales de Azure las eliminan de Azure Automation State Configuration y, a continuación, asignan configuraciones usando la de máquina.

Para eliminar una máquina de Azure Automation State Configuration, siga los pasos de la página Eliminación de una configuración y un nodo de Automation State Configuration.

Para asignar configuraciones usando la de máquina, siga los pasos de los inicios rápidos de Azure Policy, como Inicio rápido: Creación de una asignación de directiva para identificar recursos no compatibles. En el paso 6, al seleccionar una definición de directiva, elija la que aplique una configuración que haya migrado desde Azure Automation State Configuration.

Máquinas híbridas

Las máquinas situadas fuera de Azure se pueden registrar en Azure Automation State Configuration, pero no tienen un recurso de máquina en Azure. El servicio Configuration Manager local (LCM) dentro de la máquina controla la conexión a Azure Automation. El registro del nodo se administra como recurso del tipo de proveedor de Azure Automation.

Antes de eliminar una máquina de Azure Automation State Configuration, incorpore cada nodo como servidor habilitado para Azure Arc. Al incorporarse a Azure Arc, se crea un recurso de máquina en Azure para que Azure Policy pueda administrar la máquina. Aunque la máquina se puede incorporar a Azure Arc en cualquier momento, puede usar State Configuration de Azure Automation para automatizar el proceso.

Solución de problemas al exportar contenido

A continuación se proporcionan detalles sobre problemas conocidos en esta sección.

La exportación de configuraciones hace que aparezca el carácter "\" en el nombre de archivo

Al usar PowerShell en macOS y Linux, podría tener problemas relacionados con los nombres de archivo que genera Export-AzAutomationDSCConfiguration.

Como solución alternativa, se ha publicado en la Galería de PowerShell un módulo denominado AADSCConfigContent. El módulo tiene un solo comando, que exporta el contenido de una configuración almacenada en Azure Automation realizando una solicitud REST al servicio.

Pasos siguientes