El Administrador de Configuración Local (LCM) es un componente integral de la Configuración de Estado Deseado de PowerShell (DSC). En pocas palabras, el LCM es donde la goma se encuentra con la carretera (o, en términos de DSC, donde la configuración se aplica finalmente a un nodo). Y aunque el LCM y el DSC funcionan muy bien, primero deben ser configurados para que funcionen en su entorno. Si tu entorno consiste en una sola máquina, la tarea no será difícil; simplemente establece unos pocos valores de configuración y listo. Pero la mayoría de nosotros no tenemos ese lujo, así que debemos tomar un enfoque diferente y enfocarnos en configurar el LCM a escala.
¿Qué quiero decir exactamente con «a escala»? En este contexto, hablo de cómo aplicar la configuración inicial y cambiar rápidamente la configuración del LCM para cientos o miles de nodos. En este post, nos centraremos en el despliegue de una configuración inicial LCM para unos pocos nodos y en el cambio de esa configuración. Mientras que nuestra demostración incluirá sólo unos pocos nodos, esta técnica podría fácilmente escalar hasta cientos o miles de nodos.
Creando y aplicando una configuración LCM
Veamos primero lo que se necesita para aplicar una configuración LCM a un solo nodo. Para nuestra demostración, nos centraremos en aplicar una configuración LCM a un nodo llamado SERVIDOR1. Para ello, definiremos una configuración particular usando el atributo DscLocalConfigurationManager.
Nota: Todos los ejemplos serán cubiertos con PowerShell v5.
[DSCLocalConfigurationManager()]configuración LCMConfig{ Nodo SERVIDOR1 { Configuración { Modo de Configuración = $0027Sólo Aplicar$0027 } }}
Tengan en cuenta que sólo me aseguro de que el LCM esté configurado para aplicar sólo configuraciones. Para obtener una lista completa de todas las configuraciones disponibles, puede consultar el artículo de Microsoft «Configurar el administrador de configuración local».
Ahora que el bloque de configuración ha sido definido, añadiré una línea abajo para que se ejecute y lo guardaré como C:SERVER1_LCM.ps1. Una vez ejecutado, creará una carpeta LCMConfig y colocará un archivo llamado SERVER1.meta.mof, que representa el MOF que el LCM de ese SERVER1 consumirá para aplicar la configuración.
Ahora que el archivo MOF ha sido generado, puedo aplicarlo al SERVIDOR1. Pero primero, revisemos la configuración del LCM de SERVER1 para ver si esta configuración funciona.
Get-DscLocalConfigurationManager -CimSession SERVER1
Puedes ver que el Modo de Configuración está configurado como Aplicar y Monitorizar. Si tiene éxito, cuando el nuevo MOF se aplique al SERVIDOR1, éste debería ser ApplyOnly.
Apliquemos la configuración del LCM al SERVIDOR1 con el comando Set-DscLocalConfigurationManager.
Set-DscLocalConfigurationManager -Path C:\N-UsuariosAdamNLCMConfig
Puede ver arriba que el LCM ha sido cambiado a Sólo Aplicar. Esta es la esencia de aplicar y cambiar la configuración de un LCM para un nodo.
Creando y aplicando configuraciones LCM para muchos nodos
Usando los pasos anteriores para completar la tarea para un nodo, hagamos esta escala y apliquémosla a múltiples nodos. Para esta demostración, sólo aplicaré una configuración LCM en unos pocos nodos, pero es posible añadir tantos como se desee.
Para empezar, necesitaremos definir todos los nodos a los que empujaremos una nueva configuración de LCM. Haré esto usando ConfigurationData. Esta es una excelente manera de separar los atributos del nodo real de la configuración en sí, y es necesaria para la gestión de muchos nodos. En este caso, voy a sacar los nombres de los nodos de una fuente externa; aquí será un archivo de texto y luego los fusionaré en una estructura que DSC entienda.
$computadoras = Get-Content -Path C:Computadoras.txt
Luego crearé el hashtable de datos de configuración que el DSC entenderá cuando se le pase a la configuración.
$configData = @{ AllNodes = @( )}
Ahora que tenemos definido el hashtable apropiado, crearé un hashtable con una clave NodeName para cada uno de los ordenadores del archivo de texto.
@($computadoras).foreach({ $configData.AllNodes += @{NodeName = $_}})
Si miras dentro de la matriz de AllNodes, verás un hashtable definido para cada ordenador.
La construcción del hashtable de datos de configuración está hecha. Porque usaré los nombres de los nodos dentro de la tabla de datos de configuración, necesitaremos modificar la configuración LCM un poco para asegurarnos de que mira los nombres de los nodos dentro de la tabla de datos de configuración. Lo haré reemplazando el nombre del nodo estático con $Todos los nodos.Nombre del nodo como se muestra a continuación.
[DSCLocalConfigurationManager()]configuración LCMConfig{ Nodo $AllNodes.NodeName { Ajustes { ConfigurationMode = $0027ApplyOnly$0027 } }}
Esto asegurará que se cree un MOF para cada nodo en lugar de un solo nodo.
Ahora puedo ejecutar la configuración y usar el parámetro -ConfigurationData.
Puedes ver arriba que ha creado tres archivos MOF para los tres ordenadores que tenía originalmente en el archivo C:Computadoras.txt.
Nota: Cada nodo debe tener instalado PowerShell v5 para que esto funcione. Esto se debe a que he elegido usar la palabra clave DscLocalConfigurationManager que sólo está disponible en la versión 5.
Ahora desplegaré estas configuraciones de LCM en paralelo a todos mis nodos usando trabajos. Set-DscLocalConfigurationManager intenta aplicar las configuraciones en paralelo, pero he descubierto que a veces se cuelga en uno o más nodos y evita que se ejecuten todas. Para prevenir eso, usaré PowerShell jobs.
@($computadoras).foreach({ Start-Job -Name $_ -ScriptBlock {Set-DscLocalConfigurationManager -Path C:LCMConfig -ComputerName $_ -Verbose }})
Esto creará inmediatamente puestos de trabajo para cada nodo.
Ahora sólo tienes que esperar a que todos los trabajos se completen. Un bucle de tiempo logrará esto.
While (Get-Job -Name $computadoras | where {$_.State -ne $0027Completed$0027}) { Start-Sleep -Segundos 1 Write-Host $0027Aún esperando que las configuraciones del LCM terminen...$0027}
Esto esperará hasta que todos los nodos hayan terminado. Tan pronto como esté hecho, puedes sumergirte en cada trabajo y confirmar el éxito.
Hay muchas maneras diferentes de establecer la configuración del LCM para muchos nodos, aparte del ejemplo que he elegido aquí. También puedes mirar en el uso de la paralelización de foreach con flujos de trabajo, espacios de ejecución paralelos o incluso usando Invoke-Command -AsJob. Si no te gusta este método, juega con otros métodos y usa el que te funcione mejor.
COMPARTIR: