Uso de DSC de PowerShell para lograr un estado deseado

Completado

Puede usar DSC de PowerShell para especificar el estado deseado de una máquina virtual. En esta unidad, obtendrá más información sobre DSC de PowerShell y su uso para controlar el estado de las máquinas virtuales. En el escenario de ejemplo, usará DSC de PowerShell para asegurarse de que IIS para Windows Server esté instalado y configurado de forma coherente en todos los servidores web.

Objetivo de esta unidad:

  • Descripción de los bloques de nodo y de configuración.
  • Descripción de los recursos de credenciales.
  • Escritura de código DSC de PowerShell para instalar Microsoft IIS de forma idempotente.

Recursos de DSC

Ha visto que DSC de PowerShell es un lenguaje de scripting declarativo. La programación declarativa se centra en el resultado, no en el recorrido. Cuando tenga que configurar e implementar un recurso de Azure de forma coherente en un conjunto de máquinas virtuales, DSC de PowerShell puede ayudarle. Puede usar DSC de PowerShell aunque no esté familiarizado con los pasos técnicos necesarios para instalar y configurar el software y los servicios.

Windows Server tiene un conjunto de recursos de DSC de PowerShell integrados. Puede ver estos recursos si ejecuta el cmdlet Get-DSCResource de PowerShell.

Get-DscResource | select Name,Module,Properties

En la tabla siguiente se enumeran algunos de los recursos de DSC de PowerShell integrados.

Recurso Descripción
Archivo Administra archivos y carpetas en un nodo
Archivo Descomprime un archivo en formato .zip
Entorno Administra las variables de entorno del sistema
Registro Escribe un mensaje en el registro de eventos de DSC
Paquete Instala o quita un paquete
Registro Administra la clave del Registro de un nodo (excepto HKEY Users)
Script Ejecuta comandos de PowerShell en un nodo
Servicio Administra servicios de Windows
Usuario Administra usuarios locales en un nodo
WindowsFeature Agrega o quita un rol o una característica de un nodo
WindowsOptionalFeature Agrega o quita un rol o una característica opcional de un nodo
WindowsProcess Administra un proceso de Windows

En el caso de recursos más complejos, como la integración con Active Directory, se usa el kit de recursos de DSC, que se actualiza mensualmente. Puede encontrar un vínculo al kit de recursos de DSC en la unidad Resumen al final de este módulo.

El recurso que vaya a configurar ya debe formar parte de la máquina virtual o de la imagen de máquina virtual. De lo contrario, se produce un error en la compilación y ejecución del trabajo.

Anatomía de un bloque de código de DSC

Un bloque de código DSC contiene cuatro secciones. Use el ejemplo siguiente para obtener una visión más detallada. En el ejemplo, los números no forman parte de la sintaxis. Se indican como comentarios y hacen referencia a secciones de la explicación siguiente.

Configuration MyDscConfiguration {              ##1
    Node "localhost" {                          ##2
        WindowsFeature MyFeatureInstance {      ##3
            Ensure = 'Present'
            Name = 'Web-Server'
        }
    }
}
MyDscConfiguration -OutputPath C:\temp\         ##4

La sintaxis de configuración incluye estas secciones:

  1. Configuración: el bloque de configuración es el bloque más externo del script. Comienza con la palabra clave Configuration y usted proporcionará un nombre. Aquí, el nombre de la configuración es MyDscConfiguration.

    En el bloque de configuración se describe la configuración deseada. Imagine que un bloque de configuración es como una función, salvo que contiene las descripciones de los recursos que se van a instalar en lugar del código para instalarlos.

    Al igual que una función de PowerShell, un bloque de configuración puede tomar parámetros. Por ejemplo, podría parametrizar el nombre del nodo.

    Configuration MyDscConfiguration {
    param
    (
        [string] $ComputerName='localhost'
    )
    
    Node $ComputerName {
        ...
    }
    
  2. Nodo: puede tener uno o más bloques de nodo. El bloque de nodo determina los nombres de los archivos .mof que se generan al compilar la configuración. Por ejemplo, el nombre de nodo localhost solo genera un archivo localhost.mof, pero puede enviar ese archivo .mof a cualquier servidor. Cuando se usan varios nombres de nodo se generan varios archivos .mof.

    Use la notación de matriz en el bloque de nodo para tener como destino varios hosts. Por ejemplo:

    Node @('WEBSERVER1', 'WEBSERVER2', 'WEBSERVER3')
    
  3. Recurso: Puede usar uno o varios bloques de recursos para especificar los recursos que se van a configurar. En este caso, un único bloque de recursos hace referencia al recurso WindowsFeature. Aquí, el recurso WindowsFeature garantiza que la característica Web-Server de Windows se ha instalado.

  4. MyDscConfiguration: Esta llamada invoca el bloque MyDscConfiguration. Es como ejecutar una función. Al ejecutar un bloque de configuración, se compila en un documento de Managed Object Format (MOF). MOF es un lenguaje compilado creado por el Grupo de trabajo de administración de escritorio, que se basa en el lenguaje de definición de interfaz.

    Para cada nodo incluido en el script de DSC, se crea un archivo. mof en la carpeta que se especificó con el parámetro -OutputPath.

Datos de configuración en un script DSC

En un bloque de datos de configuración, puede proporcionar los datos que el proceso de configuración pueda necesitar. Puede aplicar estos datos a los nodos con nombre o bien globalmente en todos los nodos.

Un bloque de datos de configuración es un bloque con nombre que contiene una matriz de nodos. La matriz debe tener el nombre AllNodes. Dentro de la matriz AllNodes se especifican los datos de un nodo mediante la variable NodeName.

En el escenario anterior, supongamos que, en el servidor web que está instalado en cada nodo, quiere establecer la propiedad SiteName en distintos valores. Podría definir un bloque de datos de configuración similar al siguiente:

$datablock =
@{
    AllNodes =
    @(
        @{
            NodeName = "WEBSERVER1"
            SiteName = "WEBSERVER1-Site"
        },
        @{
            NodeName = "WEBSERVER2"
            SiteName = "WEBSERVER2-Site"
        },
        @{
            NodeName = "WEBSERVER3"
            SiteName = "WEBSERVER3-Site"
        }
    );
}

Si quiere establecer una propiedad en el mismo valor en todos los nodos, especifique NodeName = "*" en la matriz AllNodes.

Protección de credenciales en un script DSC

Es posible que un script DSC requiera información de credenciales para el proceso de configuración. Evite colocar una credencial en texto no cifrado en la herramienta de administración de código fuente. En lugar de ello, las configuraciones de DSC en Azure Automation pueden hacer referencia a las credenciales almacenadas en un objeto PSCredential. Con el tipo PSCredential puede definir un parámetro para el script DSC. Antes de ejecutar el script, obtenga las credenciales del usuario, utilícelas para crear un objeto PSCredential nuevo y pase este objeto al script como parámetro.

Las credenciales no se cifran en archivos .mof de manera predeterminada, sino que se exponen como texto no cifrado. Para cifrar las credenciales, utilice un certificado en los datos de configuración. La clave privada del certificado ha de estar presente en el nodo en el que quiera aplicar la configuración. Los certificados se configuran a través del LCM del nodo.

A partir de PowerShell 5.1, los archivos .mof del nodo se cifran en reposo. En tránsito, todas las credenciales se cifran a través de WinRM.

Inserción de la configuración en el nodo

Después de crear un archivo .mof compilado para una configuración, puede insertarlo en un nodo ejecutando el cmdlet Start-DscConfiguration. Si agrega la ruta de acceso al directorio, aplica al nodo todos los archivos .mof que encuentre en ese directorio:

Start-DscConfiguration -path D:\

Este paso se corresponde al modo de inserción descrito en la unidad anterior.

Extracción de la configuración para los nodos

Si tiene cientos de máquinas virtuales en Azure, el modo de extracción es más adecuado que el modo de inserción.

Puede configurar una cuenta de Azure Automation para que actúe como servicio de extracción; solo tiene que cargar la configuración en la cuenta de Automation y, a continuación, registrar las máquinas virtuales con esta cuenta.

Antes de compilar la configuración, importe a la cuenta de Automation los módulos de PowerShell que el proceso de DSC necesite. En estos módulos se define cómo completar la tarea para lograr el estado deseado.

Por ejemplo, en un script DSC de la unidad anterior se utilizó el módulo xSmbShare de PowerShell para indicar a DSC cómo comprobar el estado de un recurso compartido de archivos. DSC extrae automáticamente los módulos de la cuenta de Automation en el nodo.

El siguiente diagrama muestra cómo configurar State Configuration de Azure Automation. Exploraremos estos pasos más en la unidad siguiente.

Diagram that shows the steps to set up DSC.

De forma predeterminada, después de 15 minutos, el LCM de la máquina virtual sondea Azure Automation para comprobar si hay cambios en el archivo de configuración de DSC. Los cambios realizados en las máquinas virtuales se registran en Desired State Configuration. Si modifica una configuración, puede cargarla en la cuenta de Automation para reconfigurar automáticamente las máquinas virtuales.

En el diagrama siguiente se muestra el proceso del LCM para administrar el estado deseado en la máquina virtual.

Diagram that shows how the VM polls Azure Automation.

La cuenta de Automation controla las credenciales de forma nativa. Esta administración reduce la complejidad de la protección y el uso de credenciales.