Compartir a través de


Configuración de la implementación continua con Chocolatey

Nota:

State Configuration de Azure Automation se retirará el 30 de septiembre de 2027. Realice la transición a Azure Machine Configuration para esa fecha. Para más información, vea la entrada de blog del anuncio. El servicio Azure Machine Configuration combina características de la extensión DSC, Azure Automation State Configuration y las características que más solicitan los clientes en sus comentarios. Azure Machine Configuration también incluye compatibilidad con las máquinas híbridas mediante servidores habilitados para Arc.

En el mundo de DevOps, existen muchas herramientas que ayudan en diversos puntos de la canalización de integración continua. Azure Automation State Configuration es una opción nueva, y bienvenida, que puede ser de utilidad para los equipos de DevOps.

Azure Automation es un servicio administrado de Microsoft Azure que le permite automatizar diversas tareas con runbooks, nodos y recursos compartidos, como credenciales, programaciones y variables globales. Azure Automation State Configuration amplía esta funcionalidad de automatización para incluir las herramientas Desired State Configuration (DSC) de PowerShell. Aquí hay una introducción muy buena.

En este artículo, se muestra cómo configurar la implementación continua (CD) para un equipo Windows. Puede ampliar fácilmente la técnica para incluir tantos equipos Windows como sean necesarios en el rol, por ejemplo, un sitio web y, a partir de ahí, a roles adicionales.

Implementación continua para máquinas virtuales IaaS

A nivel general

Aunque todo esto pueda parecer bastante complicado, afortunadamente puede dividirse en dos procesos principales:

  • Escribir código y probarlo, y después crear y publicar paquetes de instalación para las versiones principales y secundarias del sistema;
  • Crear y administrar las máquinas virtuales que instalen y ejecuten el código en los paquetes.

Una vez que estos dos procesos principales se hayan puesto en práctica, es fácil actualizar automáticamente el paquete en las máquinas virtuales a medida que se crean e implementan las nuevas versiones.

Información general sobre los componentes

Los administradores de paquetes como apt-get son muy conocidos en el mundo de Linux, pero no tanto en el de Windows. Chocolatey es un administrador de paquetes para Windows. La entrada de blog de Scott Hanselman sobre Chocolatey es una excelente introducción. Chocolatey le permite usar la línea de comandos para instalar paquetes desde un repositorio central en un sistema operativo Windows. Puede crear y administrar su propio repositorio y Chocolatey puede instalar paquetes desde cualquier número de repositorios que designe.

DSC de PowerShell es una herramienta de PowerShell que permite declarar la configuración que quiera para un equipo. Por ejemplo, si quiere que se instale Chocolatey, se instale IIS, se abra el puerto 80 y se instale la versión 1.0.0 de su sitio web, Local Configuration Manager (LCM) de DSC implementa esa configuración. Un servidor de extracción de DSC contiene un repositorio de configuraciones para los equipos. El LCM de cada equipo comprueba periódicamente para ver si su configuración coincide con la almacenada. Después, notifica el estado o intenta equiparar la configuración del equipo a la almacenada. Puede editar la configuración almacenada en el servidor de extracción para hacer que un equipo o un conjunto de equipos se adapten a la configuración modificada.

Un recurso de DSC es un módulo de código con capacidades específicas, como la administración de redes, Active Directory o SQL Server. El recurso DSC de Chocolatey sabe cómo acceder a un servidor NuGet descargar paquetes, instalarlos y realizar otras tareas. Existen muchos otros recursos de DSC en la Galería de PowerShell. Estos módulos se instalan en el servidor de extracción de Azure Automation State Configuration para que las configuraciones puedan utilizarlas.

Las plantillas de Resource Manager proporcionan una manera declarativa de generar recursos para la infraestructura, como los siguientes:

  • redes y subredes
  • seguridad de red
  • enrutamiento,
  • equilibradores de carga,
  • NIC, máquinas virtuales y otros

Para obtener una comparación entre el modelo de implementación de Resource Manager (declarativo) y el modelo de implementación clásico de Azure (imperativo), vea Diferencias entre Azure Resource Manager y la implementación clásica. En este artículo se incluye una explicación de los proveedores de recursos principales: proceso, almacenamiento y red.

Una característica clave de una plantilla de Resource Manager es su capacidad para instalar una extensión de máquina virtual durante el aprovisionamiento de la máquina virtual. Una extensión de máquina virtual posee capacidades específicas, como ejecutar un script personalizado, instalar software antivirus y ejecutar un script de configuración de DSC. Existen muchos otros tipos de extensiones de máquina virtual.

Vista rápida al diagrama

Empezando desde arriba, se escribe el código, se compila, se prueba y después se crea un paquete de instalación. Chocolatey admite diversos tipos de paquetes de instalación, como MSI, MSU o ZIP. Además, cuenta con toda la funcionalidad de PowerShell para realizar la instalación en sí si las capacidades nativas de Chocolatey no son suficientes. Coloque el paquete en un lugar accesible: un repositorio de paquetes. En este ejemplo de uso se emplea una carpeta pública en una cuenta de almacenamiento de blobs de Azure, pero vale cualquier lugar. Chocolatey funciona de forma nativa con los servidores NuGet y otros para administrar los metadatos de los paquetes. este artículo se describen las opciones. En este ejemplo de uso se utiliza NuGet. Nuspec son los metadatos de los paquetes. La información de Nuspec se compila en un NuPkg y se almacena en un servidor NuGet. Cuando la configuración solicita un paquete por su nombre y hace referencia a un servidor NuGet, el recurso de DSC de Chocolatey en la máquina virtual toma el paquete y lo instala. También se puede solicitar una versión específica de un paquete.

En la parte inferior izquierda de la imagen, se ve una plantilla de Azure Resource Manager. En este ejemplo de uso, la extensión de máquina virtual registra la máquina virtual con el servidor de extracción de Azure Automation State Configuration como nodo. La configuración se almacena en el servidor de extracción dos veces: una vez como texto sin formato y una vez compilada como un archivo MOF. En Azure Portal, MOF representa una configuración de nodo, en lugar de una configuración simple.

Es relativamente sencillo crear Nuspec, compilarlo y almacenarlo en un servidor NuGet. Para el siguiente paso de la implementación continua se necesitan las siguientes tareas únicas:

  • Configurar el servidor de extracción
  • Registrar los nodos con el servidor
  • Crear la configuración inicial en el servidor

Solo tiene que actualizar la configuración y la configuración de nodos en el servidor de extracción al actualizar e implementar paquetes en el repositorio.

Si no empieza con una plantilla de Resource Manager, hay comandos de PowerShell que le ayudarán a registrar las máquinas virtuales con el servidor de extracción. Para más información, consulte Incorporación de máquinas para administrarlas con State Configuration de Azure Automation.

Acerca del ejemplo de uso

En este ejemplo de uso de este artículo se comienza con una máquina virtual de una imagen genérica de Windows Server 2012 R2 procedente de Azure Gallery. Puede iniciarla desde cualquier imagen almacenada y después ajustarla con la configuración de DSC. Sin embargo, cambiar la configuración que se incluye en una imagen es mucho más difícil que actualizar dinámicamente la configuración con DSC.

No es necesario usar una plantilla de Resource Manager ni la extensión de máquina virtual para emplear esta técnica con sus máquinas virtuales. Además, sus máquinas virtuales tampoco tienen que estar en Azure para administrarlas mediante CD. Solo tiene que instalar Chocolatey y configurar el LCM en la máquina virtual para que sepa dónde está el servidor de extracción.

Cuando se actualiza un paquete en una máquina virtual que se encuentra en producción, debe sacar esa máquina virtual de la rotación mientras se instala la actualización. Existen métodos muy diversos de hacerlo. Por ejemplo, con una máquina virtual tras un equilibrador de carga de Azure, puede agregar un sondeo personalizado. Al actualizar la máquina virtual, haga que el extremo de sondeo devuelva 400. El ajuste necesario para ocasionar este cambio puede estar dentro de la configuración, al igual que el ajuste para devolver de nuevo 200 una vez completada la actualización.

El código fuente completo de este ejemplo de uso se encuentra en este proyecto de Visual Studio en GitHub.

Paso 1: Configurar la cuenta de Automation y el servidor de extracción

Ejecute los comandos siguientes En una sesión de PowerShell (Connect-AzAccount) con privilegios elevados:

New-AzResourceGroup -Name MY-AUTOMATION-RG -Location MY-RG-LOCATION-IN-QUOTES
$newAzAutomationAccountSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    Location = 'MY-RG-LOCATION-IN-QUOTES'
    Name = 'MY-AUTOMATION-ACCOUNT'
}
New-AzAutomationAccount @newAzAutomationAccountSplat

Este paso tarda unos minutos mientras se configura el servidor de extracción.

Puede crear la cuenta de Automation en cualquiera de las siguientes regiones de Azure:

  • Este de EE. UU. 2
  • Centro-sur de EE. UU.
  • US Gov - Virginia
  • Oeste de Europa
  • Sudeste de Asia
  • Japón Oriental
  • Centro de la India
  • Sudeste de Australia
  • Centro de Canadá
  • Norte de Europa

Paso 2: Realizar ajustes de la extensión de máquina virtual en la plantilla de Resource Manager

Se proporcionan detalles sobre el registro de máquina virtual (con la extensión de máquina virtual de DSC de PowerShell) en esta plantilla de inicio rápido de Azure. En este paso, se registra la nueva máquina virtual con el servidor de extracción en la lista de nodos de State Configuration. Parte de este registro es especificar la configuración del nodo que se aplica al nodo. No es necesario que esta configuración de nodos exista todavía en el servidor de extracción, pero debe elegir el nombre del nodo y el nombre de la configuración. En este ejemplo, el nodo es isvbox y el nombre de la configuración es ISVBoxConfig. El nombre de configuración del nodo que especifique en DeploymentTemplate.json es ISVBoxConfig.isvbox.

Paso 3: Agregar recursos de DSC necesarios al servidor de extracción

La Galería de PowerShell puede instalar recursos de DSC en la cuenta de Azure Automation. Navegue hasta el recurso que quiera y seleccione Implementar en Azure Automation.

Ejemplo de la Galería de PowerShell

Otra técnica agregada hace poco a Azure Portal permite extraer módulos nuevos o actualizar los existentes. Después, seleccione el icono Examinar galería para ver la lista de módulos de la galería, profundizar en los detalles e importarlos a la cuenta de Automation. Puede usar este proceso para mantener actualizados los módulos. Además, la característica de importación comprueba las dependencias con otros módulos para asegurarse de que nada se queda sin sincronizar.

También hay un enfoque manual, que se usa solo una vez por recurso, a menos que desee actualizarlo más adelante. Para más información sobre la creación de módulos de integración de PowerShell, consulte Creación de módulos de integración para Azure Automation.

Nota:

La estructura de carpetas de un módulo de integración de PowerShell para un equipo Windows es algo diferente de la estructura de carpetas que espera Azure Automation.

  1. Instale Windows Management Framework v5 (no es necesario para Windows 10).

  2. Instale el módulo de integración.

    Install-Module -Name MODULE-NAME`    <—grabs the module from the PowerShell Gallery
    
  3. Copie la carpeta del módulo de C:\Program Files\WindowsPowerShell\Modules\MODULE-NAME a una carpeta temporal.

  4. Elimine los ejemplos y la documentación de la carpeta principal.

  5. Comprima la carpeta principal y asigne al archivo comprimido el nombre de la carpeta.

  6. Coloque el archivo comprimido en una ubicación HTTP accesible, como un almacenamiento de blobs en una cuenta de Azure Storage.

  7. Ejecute el siguiente comando:

    $newAzAutomationModuleSplat = @{
        ResourceGroupName = 'MY-AUTOMATION-RG'
        AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
        Name = 'MODULE-NAME'
        ContentLinkUri = 'https://STORAGE-URI/CONTAINERNAME/MODULE-NAME.zip'
    }
    New-AzAutomationModule @newAzAutomationModuleSplat
    

El ejemplo incluido implementa estos pasos para cChoco y xNetworking.

Paso 4: Agregar la configuración de nodo al servidor de extracción

No hay nada especial que mencionar acerca de la primera vez que se importa la configuración al servidor de extracción y se compila. Todas las importaciones o compilaciones posteriores de la misma configuración tendrán exactamente el mismo aspecto. Cada vez que actualice el paquete y deba enviarlo a producción, realice este paso después de asegurarse de que el archivo de configuración sea correcto, incluida la nueva versión del paquete. Este es el archivo de configuración ISVBoxConfig.ps1:

Configuration ISVBoxConfig
{
    Import-DscResource -ModuleName cChoco
    Import-DscResource -ModuleName xNetworking

    Node 'isvbox' {

        cChocoInstaller installChoco
        {
            InstallDir = 'C:\choco'
        }

        WindowsFeature installIIS
        {
            Ensure = 'Present'
            Name   = 'Web-Server'
        }

        xFirewall WebFirewallRule
        {
            Direction    = 'Inbound'
            Name         = 'Web-Server-TCP-In'
            DisplayName  = 'Web Server (TCP-In)'
            Description  = 'IIS allow incoming web site traffic.'
            Enabled       = 'True'
            Action       = 'Allow'
            Protocol     = 'TCP'
            LocalPort    = '80'
            Ensure       = 'Present'
        }

        cChocoPackageInstaller trivialWeb
        {
            Name      = 'trivialweb'
            Version   = '1.0.0'
            Source    = 'MY-NUGET-V2-SERVER-ADDRESS'
            DependsOn = '[cChocoInstaller]installChoco','[WindowsFeature]installIIS'
        }
    }
}

El siguiente script de New-ConfigurationScript.ps1 se ha modificado para usar el módulo Az PowerShell:

$importAzAutomationDscConfigurationSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    SourcePath = 'C:\temp\AzureAutomationDsc\ISVBoxConfig.ps1'
    Published = -Published
    Force = -Force
}
Import-AzAutomationDscConfiguration @importAzAutomationDscConfigurationSplat

$startAzAutomationDscCompilationJobSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    ConfigurationName = 'ISVBoxConfig'
}
$jobData = Start-AzAutomationDscCompilationJob @startAzAutomationDscCompilationJobSplat

$compilationJobId = $jobData.Id

$getAzAutomationDscCompilationJobSplat = @{
    ResourceGroupName = 'MY-AUTOMATION-RG'
    AutomationAccountName = 'MY-AUTOMATION-ACCOUNT'
    Id = $compilationJobId
}
Get-AzAutomationDscCompilationJob @getAzAutomationDscCompilationJobSplat

Paso 5: Crear y mantener los metadatos de paquetes

Cada paquete que incluya en el repositorio de paquetes necesita un nuspec que lo describa. Se debe compilar y almacenar en el servidor NuGet. Para más información, vea [Creación de un paquete NuGet mediante la CLI de nuget.exe].

Puede usar MyGet.org como servidor NuGet. Puede comprar este servicio, pero existe una SKU de inicio gratuita. Para obtener instrucciones sobre cómo instalar un servidor NuGet propio para paquetes privados, vea la documentación en Nuget.org.

Paso 6: Unirlo todo

Cada vez que una versión pasa un control de calidad y se aprueba para implementación, se crea el paquete, se actualizan nuspec y nupkg, y se implementan en el servidor NuGet. Debe actualizar la configuración (paso 4) con el nuevo número de versión. Después, envíela al servidor de extracción y compárela.

Desde ese momento, corresponderá a las máquinas virtuales que dependen de esa configuración extraer la actualización e instalarla. Cada una de estas actualizaciones es sencilla: solo una línea o dos de PowerShell. En el caso de Azure DevOps, algunas se encapsulan en tareas de compilación que se pueden encadenar de manera conjunta en una compilación. En este artículo se ofrecen más detalles. En este repositorio de GitHub se detallan las tareas de compilación disponibles.

Pasos siguientes