Quantcast
Channel: Blog Virtualizacion
Viewing all 681 articles
Browse latest View live

Terraform: Comandos básicos

$
0
0

Terraform: Comandos básicos

Hoy os dejo una entrada útil y básica sobre comandos, para los que estáis aprendiendo Terraform como yo.

La idea es tener claro para qué podemos utilizar los diferentes comandos de los que dispone Terraform.

Aunque los podéis extraer desde los comandos «terraform«,»terraform help» o «terraform -h comandoespecífico«, siempre viene bien explicar con detalle cada uno, y si es en castellano, eso que nos ahorramos los hispano-hablantes ;P

terraform-comandos-basicos-1

COMANDOS TERRAFORM

Los cuatro comandos más importantes en Terraform son init, plan, validate y apply. Os explicamos cómo funcionan:

«terraform init»

  • FUNCION: Sirve para inicializar la configuración en Terraform. Es el primer comando a lanzar cualquier configuración
  • PARAMETROS: terraform init [options] [SOURCE] [PATH]
    • -backend=true – Inicializa el backend para este entorno.
    • -backend-config=value – El valor puede ser una ruta a un archivo HCL o una cadena en el formato de ‘key = value’. Esto especifica la configuración adicional para combinar para el backend. Esto se puede especificar varias veces. Los indicadores especificados más adelante en la línea anulan los especificados anteriormente si entran en conflicto.
    • -get=true – Descargue cualquier módulo para esta configuración.
    • -input=true – Solicite información interactiva si es necesario. Si esto es falso y la entrada es init , init error.
    • -lock=true – Bloquea el archivo de estado cuando se admite el bloqueo.
    • -lock-timeout=0s – Duración de volver a intentar un bloqueo de estado.
    • -no-color – Si se especifica, la salida no contendrá ningún color.
    • -force-copy – Suprime las indicaciones sobre la copia de datos de estado. Esto es equivalente a proporcionar un “sí” a todos los mensajes de confirmación.

«terraform plan»

  • FUNCION: Sirve para para crear un plan de ejecución. Es importante validar todo lo que va a suceder una vez apliquemos.
  • PARAMETROS: terraform plan [options] [dir-or-plan]
    • -destroy – Si se establece, genera un plan para destruir todos los recursos conocidos.
    • -detailed-exitcode – Devuelve un código de salida -detailed-exitcode cuando sale el comando. Cuando se proporciona, este argumento cambia los códigos de salida y sus significados para proporcionar información más granular sobre lo que el plan resultante contiene:
      0 = Sin cambios 1 = Error 2 = Cambios presentes
    • -input=true – Solicitar entrada para variables si no se establece directamente.
    • -lock=true – Bloquea el archivo de estado cuando se admite el bloqueo.
    • -lock-timeout=0s – Duración de volver a intentar un bloqueo de estado.
    • -module-depth=n – Especifica la profundidad de los módulos a mostrar en la salida. Esto no afecta al plan en sí, sólo la salida mostrada. De forma predeterminada, esto es -1, lo que ampliará todo.
    • -no-color – Desactiva la salida con color.
    • -out=path – La ruta para guardar el plan de ejecución generado. Este plan se puede utilizar con terraform apply para terraform apply de que solo se aplican los cambios que se muestran en este plan. Lea la advertencia sobre los planes guardados a continuación.
    • -parallelism=n – Limita el número de operaciones concurrentes cuando Terraform recorre el gráfico .
    • -refresh=true – Actualiza el estado antes de verificar las diferencias.
    • -state=path – Ruta al archivo de estado. El valor predeterminado es “terraform.tfstate”. Se ignora cuando se utiliza el estado remoto .
    • -target=resource – Una -target=resource al destino. La operación se limitará a este recurso ya sus dependencias. Este indicador se puede utilizar varias veces.
    • -var ‘foo=bar’ – Establece una variable en la configuración de Terraform. Este indicador se puede establecer varias veces. Los valores de las variables se interpretan como HCL , por lo que los valores de lista y mapa se pueden especificar mediante este indicador.
    • -var-file=foo – Establece variables en la configuración de Terraform desde un archivo de variable . Si “terraform.tfvars” está presente, se cargará automáticamente primero. Cualquier archivo especificado por -var-file valor en un “terraform.tfvars”. Este indicador se puede utilizar varias veces.

«terraform validate»

  • FUNCION: Sirve para validar la sintaxis de los ficheros con extensión “.tf” de terraform
  • PARAMETROS: terraform validate [dir]

«terraform apply»

  • FUNCION: Sirve para aplicar las configuraciones definidas en los ficheros TF, o el conjunto predefinido de acciones generado por un plan ejecución.
  • PARAMETROS: terraform apply [options] [dir-or-plan]
    • -backup=path – Ruta de acceso al archivo de copia de -backup=path que suelen tener extensión .backup
    • -lock=true – Bloquea el archivo de estado cuando se admite el bloqueo.
    • -lock-timeout=0s – Duración de volver a intentar un bloqueo de estado.
    • -input=true – Solicita entrada para variables si no se establece directamente.
    • -no-color – Desactiva la salida con color.
    • -parallelism=n – Limita el número de operaciones concurrentes cuando Terraform recorre el gráfico .
    • -refresh=true – Actualiza el estado de cada recurso antes de planificar y aplicar. Esto no tiene efecto si un archivo del plan se da directamente para aplicar.
    • -state=path – Ruta al archivo de estado. El valor predeterminado es “terraform.tfstate”. Se ignora cuando se utiliza el estado remoto .
    • -state-out=path – Ruta para escribir el archivo de estado actualizado. Por defecto
    • -state usará la ruta. Se ignora cuando se utiliza el estado remoto .
    • -target=resource – Una dirección de recursos para el destino. La operación se limitará a este recurso y a sus dependencias. Este indicador se puede utilizar varias veces.
    • -var ‘foo=bar’ – Establece una variable en la configuración de Terraform. Este indicador se puede establecer varias veces. Los valores de las variables se interpretan como Lenguaje de Configuración HashiCorp (HCL) , por lo que los valores de lista y mapa se pueden especificar mediante este indicador.
    • -var-file=foo – Establece variables en la configuración de Terraform desde un archivo de variable . Si “terraform.tfvars” está presente, se cargará automáticamente primero. Cualquier archivo especificado por -var-file reemplaza cualquier valor en un “terraform.tfvars”. Este indicador se puede utilizar varias veces.

A continuación, el resto de comandos, que usarás conforme profundices en Terraform:

«terraform console»

  • FUNCION: Sirve para crear una consola interactiva. De forma que se puedan probar las configuraciones antes de aplicarlas
  • PARAMETROS: terraform console [options] [dir]
    • -state=path – Ruta al archivo de estado. De forma terraform.tfstate a terraform.tfstate . No es necesario que exista un archivo de estado. Puede cerrar la consola con el comando exit o mediante Control-C o Control-D.

«terraform destroy»

  • FUNCION: Sirve para eliminar las configuraciones aplicadas con Terraform, se podría utilizar como una especie de rollback. Utiliza los mismos argumentos que apply. Normalmente, nos pedirá confirmación antes de borrar cualquier configuración, salvo que coloquemos un force.
  • PARAMETROS: terraform destroy [options] [dir]
    • Mismos parámetros que apply, menos plan
    • -force – No nos pedirá confirmación
    • Si usamos «terraform plan destroy» podemos ver lo que se va a hacer antes de borrar cualquier configuración

«terraform env»

  • FUNCION: Sirve para administrar entornos, es un subcomando, que se utiliza con otros anidados
  • PARAMETROS: terraform env [nombre]
    • list: El comando mostrará todos los entornos creados.
    • select: El comando terraform env select se utiliza para seleccionar un entorno diferente ya creado.
    • new: El comando terraform env new se utiliza para crear un nuevo entorno de estado.
    • delete: El comando terraform env delete se utiliza para eliminar un entorno existente.

«terraform fmt»

  • FUNCION: Sirve para reescribir los archivos de configuración de Terraform a un formato y estilo normalizado.
  • PARAMETROS: terraform fmt [options] [dir]
    • -list=true – Lista de archivos cuyo formato difiere (desactivado si se utiliza STDIN).
    • -write=true – Escribe el resultado en el archivo fuente en lugar de STDOUT (deshabilitado si utiliza STDIN).
    • -diff=false – Mostrar diferencias de cambios de formato.

«terraform force-unlock»

  • FUNCION: Sirve para desbloquear el estado de la configuración, sin modificación de la infraestructura.
  • PARAMETROS: terraform force-unlock [dir]
    • -force – Fuerza la eliminación del bloqueo del estado para la configuración actual.

«terraform get»

  • FUNCION: Sirve para actualizar o descargar módulos a la carpeta .terraform local.
  • PARAMETROS: terraform get [options] [dir]
    • -update – Con la opción update a los módulos descargados comprueba si tienen actualizaciones y se las descarga si esta disponible.

«terraform graph»

  • FUNCION: Sirve para mostrar visualmente un plan de ejecución o configuración
  • PARAMETROS: terraform graph [options] [dir]
    • -draw-cycles – Destaque cualquier ciclo en el gráfico con bordes coloreados. Esto ayuda al diagnosticar errores de ciclo.
    • -no-color – Si se especifica, la salida no contendrá ningún color.
    • -type=plan – Tipo de gráfico de salida. Puede ser: plan, plan-destroy, apply, legacy.

«terraform import»

  • FUNCION: Sirve para importar recursos a Terraform
  • PARAMETROS: terraform import [options] ADDRESS ID
    • -backup=path – Ruta de acceso al archivo de estado -backup=path . La opción predeterminada es la ruta -state-out con la extensión ”.backup”. Establecer en “-” para deshabilitar las copias de seguridad.
    • -config=path – Ruta al directorio de archivos de configuración de Terraform que configuran el proveedor para la importación. El valor predeterminado es su directorio de trabajo. Si este directorio no contiene archivos de configuración de Terraform, el proveedor debe configurarse a través de entradas manuales o variables.
    • -input=true – Si desea solicitar información para la configuración del proveedor.
    • -lock=true – Bloquea el archivo de estado cuando se admite el bloqueo.
    • -lock-timeout=0s – Duración de volver a intentar un bloqueo de estado.
    • -no-color – Si se especifica, la salida no contendrá ningún color.
    • -provider=provider – Proveedor especificado para usar para la importación. Se utiliza para especificar alias de proveedor, como “aws.eu”. Por defecto, el proveedor normal se basa en el prefijo del recurso que se está importando. Por lo general, no es necesario especificar esto.
    • -state=path – La ruta de acceso para leer y guardar archivos de estado (a menos que se especifique estado-out).
    • -state-out=path – Ruta para escribir el archivo de estado final. De forma predeterminada, esta es la ruta de estado.
    • -var ‘foo=bar’ – Establece una variable en la configuración de Terraform. Este indicador se puede establecer varias veces. Los valores de las variables se interpretan como HCL , por lo que los valores de lista y mapa se pueden especificar mediante este indicador.
    • -var-file=foo – Establece variables en la configuración de Terraform desde un archivo de variable . Si “terraform.tfvars” está presente, se cargará automáticamente primero. Cualquier archivo especificado por -var-file valor en un “terraform.tfvars”.

«terraform output»

  • FUNCION: Sirve para extraer el valor de una variable de salida de un fichero de estado.
  • PARAMETROS: terraform output [options] [name]
    • -json – Si se especifica, las salidas se formatean como un objeto JSON, con una clave por salida. Si se especifica [name] , sólo se devolverá la salida especificada. Esto se puede canalizar en herramientas tales como jq para el procesamiento adicional.
    • -state=path – Ruta al archivo de estado. El valor predeterminado es “terraform.tfstate”. Se ignora cuando se utiliza el estado remoto .
    • -module=module_name – La ruta del módulo que ha -module=module_name salida. Por defecto es la ruta raíz. Otros módulos se pueden especificar mediante una lista separada por períodos. Ejemplo: “foo” haría referencia al módulo “foo” pero “foo.bar” haría referencia al módulo “bar” en el módulo “foo”.

«terraform push»

  • FUNCION: Sirve para cargar configuraciones de Terraform por Terraform Enterprise, lo que permite ejecutar configuraciones por un equipo de usuarios.
  • PARAMETROS: terraform push [options] [path]
    • -atlas-address= – Una dirección alternativa a una instancia.
    • -upload-modules=true – Si es true ( -upload-modules=true ), entonces los módulos que se usan están bloqueados en su comprobación actual y cargados completamente.
    • -name= – Nombre de la configuración de la infraestructura en Terraform Enterprise. El formato de este es: “nombre de usuario / nombre” para que pueda cargar configuraciones no sólo a su cuenta, sino a otras cuentas y organizaciones.
    • -no-color – Desactiva la salida con color
    • -overwrite=foo – Marca una variable -overwrite=foo . Normalmente, si ya está definida una variable, Terraform no enviará el valor local (aunque sea diferente). Esto obliga a enviar el valor local a Terraform Enterprise.
    • -token= – El token de API de Terraform Enterprise que se utiliza para autorizar la subida. Si está en blanco o no especificado, se utilizará la variable de ATLAS_TOKEN ATLAS_TOKEN.
    • -var=’foo=bar’ – -var=’foo=bar’ el valor de una variable para la configuración de Terraform.
    • -var-file=foo – Establece el valor de las variables usando un archivo de variable. Este indicador se puede utilizar varias veces.
    • -vcs=true – Si es true (por defecto), entonces Terraform detectará si un VCS está en uso, como Git, y sólo subirá archivos que estén comprometidos con el control de versiones. Si no se detecta ningún sistema de control de versiones, Terraform cargará todos los archivos en path (parámetro al comando).

«terraform refresh»

  • FUNCION: Sirve para detectar diferencias desde el último estado conocido
  • PARAMETROS: terraform refresh [options] [dir]
    • -backup=path – Ruta de acceso al archivo de copia de -backup=path . El valor predeterminado es -state-out con la extensión ”.backup”. Deshabilitado ajustando a “-”.
    • -no-color – Desactiva la salida con color
    • -input=true – Solicitar entrada para variables si no se establece directamente.
    • -lock=true – Bloquea el archivo de estado cuando se admite el bloqueo.
    • -lock-timeout=0s – Duración de volver a intentar un bloqueo de estado.
    • -no-color – Si se especifica, la salida no contendrá ningún color.
    • -state=path – Ruta de acceso para leer y escribir el archivo de estado en. El valor predeterminado es “terraform.tfstate”. Se ignora cuando se utiliza el estado remoto .
    • -state-out=path – Ruta para escribir el archivo de estado actualizado. De forma -state , se -state ruta -state . Se ignora cuando se utiliza el estado remoto .
    • -target=resource – Una -target=resource al destino. La operación se limitará a este recurso ya sus dependencias. Este indicador se puede utilizar varias veces.
    • -var ‘foo=bar’ – Establece una variable en la configuración de Terraform. Este indicador se puede establecer varias veces. Los valores de las variables se interpretan como HCL ,
    • por lo que los valores de lista y mapa se pueden especificar mediante este indicador.
    • -var-file=foo – Establece variables en la configuración de Terraform desde un archivo de variable . Si “terraform.tfvars” está presente, se cargará automáticamente primero. Cualquier archivo especificado por -var-file valor en un “terraform.tfvars”. Este indicador se puede utilizar varias veces.

«terraform show»

  • FUNCION: Sirve para mostrar por pantalla datos legibles
  • PARAMETROS: terraform show [options] [path]
    • -module-depth=n – Especifica la profundidad de los módulos a mostrar en la salida. De forma predeterminada, esto es -1, lo que ampliará todo.
    • -no-color – Desactiva la salida con color.

«terraform state»

  • FUNCION: Sirve para la administración avanzada del estado
  • PARAMETROS: terraform state [options] [args]
    • list: Enumera los recursos dentro de un estado de Terraform.
    • mv: Mueve elementos en un estado de Terraform .
    • pull: El comando terraform state pull se utiliza para descargar y enviar manualmente el estado desde el estado remoto.
    • push: Carga manualmente un archivo de estado local en estado remoto.
    • rm: Elimina elementos del estado Terraform.
    • show: Muestra los atributos de un solo recurso en el estado Terraform.

«terraform taint»

  • FUNCION: Sirve para marcar manualmente un recurso gestionado por Terraform como corrupto, forzándolo a ser destruido y recreado en la siguiente aplicación.
  • PARAMETROS: terraform taint [options] name
    • -allow-missing – Si se especifica, el comando tendrá éxito (código de salida 0) aunque falte el recurso.
    • -backup=path – Ruta de acceso al archivo de copia de -backup=path . El valor predeterminado es -state-out con la extensión ”.backup”.
    • -lock=true – Bloquea el archivo de estado cuando se admite el bloqueo.
    • -lock-timeout=0s – Duración para volver a intentar un bloqueo de estado.
    • -module=path – La ruta del módulo donde existe el recurso corrupto. Por defecto es la ruta raíz.
    • -no-color – Desactiva la salida con color
    • -state=path – Ruta de acceso para leer y escribir el archivo de estado. El valor predeterminado es “terraform.tfstate”.
    • -state-out=path – Ruta para escribir el archivo de estado actualizado. De forma -state , se -state ruta -state .

«terraform untaint»

  • FUNCION: Sirve para desmarcar manualmente un recurso gestionado por Terraform como corrupto, restaurándolo como la instancia primaria en el estado.
  • PARAMETROS: terraform untaint [options] name
    • -allow-missing – Si se especifica, el comando tendrá éxito (código de salida 0) aunque falte el recurso.
    • -backup=path – Ruta de acceso al archivo de copia de -backup=path . El valor predeterminado es -state-out con la extensión ”.backup”.
    • -index=n – Selecciona una única instancia corrupta cuando hay más de una instancia corrompida presente en el estado de un recurso dado. Este indicador es necesario cuando hay varias instancias infectadas.
    • -lock=true – Bloquea el archivo de estado cuando se admite el bloqueo.
    • -lock-timeout=0s – Duración para volver a intentar un bloqueo de estado.
    • -module=path – La ruta del módulo donde existe el recurso corrupto. Por defecto es la ruta raíz.
    • -no-color – Desactiva la salida con color
    • -state=path – Ruta de acceso para leer y escribir el archivo de estado. El valor predeterminado es “terraform.tfstate”.
    • -state-out=path – Ruta para escribir el archivo de estado actualizado. De forma -state , se -state ruta -state .

«terraform workspace»

  • FUNCION: Sirve para para reescribir los archivos de configuración de Terraform a un formato y estilo normalizado.
  • PARAMETROS: terraform fmt [options] [dir]

Basado en: https://terraform-infraestructura.readthedocs.io/es/latest/comandos/index.html

Espero os parezca interesante…ya que es gratis, comparte ;P

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Terraform: Comandos básicos se publicó primero en Blog Virtualizacion.


Powershell: Verificar si existe una carpeta

$
0
0

Powershell: Verificar si existe una carpeta

Hoy entrada rápida…

Os explico cómo verificar si existe una carpeta o ruta mediante Powershell.

Esto es muy útil si estás desarrollando un script que tiene varias opciones. Os pongo un ejemplo, imaginaros que tenéis que lanzar un programa que según donde se lance puede estar en 64 o en 32 bits. Esto implicaría que nos daría algún error, en alguna de las opciones.

Lo voy a enseñar con Office. En un sistema Windows, implicaría que esté instalado en las siguientes rutas (es un ejemplo):

En 32 bits: "C:\Program Files (x86)\Microsoft Office\Office16\"
En 64 bits: "C:\Program Files\Microsoft Office\Office16\"

La forma rápida de testear que existe es con:

Test-Path "C:\Program Files (x86)\Microsoft Office\Office16\"
Test-Path "C:\Program Files\Microsoft Office\Office16\"

Cuando lanzáis estos comandos, os devuelven True si existe y False si no existe:

powershell-verificar-si-existe-una-carpeta-1

Esto ya os permite trabajar con esos valores, o hacer un if directamente para un valor concreto. Por ejemplo:

if (-not (Test-Path "C:\Program Files\Microsoft Office\Office16\"))
{
"No existe la carpeta"
}

powershell-verificar-si-existe-una-carpeta-2

Si lo que queremos es validar varias opciones, podemos pasar los valores a variables y trabajar los resultados:

##################################
# COMPROBAR SI EXISTE RUTA OFFICE
##################################
$existe32= Test-Path "C:\Program Files (x86)\Microsoft Office\Office16\"
$existe64= Test-Path "C:\Program Files\Microsoft Office\Office16\"

if ($existe64 -eq $True)
{
	#PUNTO DE CONTROL
	 Write-Output "La ruta x64 existe"
}
Else 
{
	If ($existe32 -eq $True)
	{
	#PUNTO DE CONTROL
	Write-Output "La ruta x32 existe"
	}
	Else
	{
	#PUNTO DE CONTROL
	Write-Output "Office16 no se encuentra en el sistema"
	}
}

 

E iríamos probando y modificando el script artificialmente, para validar todas las opciones:

powershell-verificar-si-existe-una-carpeta-3

powershell-verificar-si-existe-una-carpeta-5

powershell-verificar-si-existe-una-carpeta-4

Espero os parezca interesante…ya que es gratis, comparte ;P

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Verificar si existe una carpeta se publicó primero en Blog Virtualizacion.

Terraform: crear Docker

$
0
0

Terraform: crear Docker

Hoy entrada rápida de Terraform…

Os explico cómo generaríamos un container en Docker a través de Terraform. Lo haremos con Nginx como ejemplo.

Tendréis que tener instalado Docker y Terraform.

Una buena práctica es generar un directorio para el proyecto o implementación:

mkdir terraform-docker && cd $_

Creamos un fichero TF con el siguiente contenido:

terraform {
  required_providers {
    docker = {
      source = "terraform-providers/docker"
    }
  }
}

provider "docker" {}

resource "docker_image" "nginx" {
  name         = "nginx:latest"
  keep_locally = false
}

resource "docker_container" "nginx" {
  image = docker_image.nginx.latest
  name  = "elblogdenegu"
  ports {
    internal = 80
    external = 8000
  }
}

Iniciamos terraform:

terraform init

Y lanzamos la ejecución del fichero TF:

terraform apply

Comprobamos que el docker está arrancado:

docker ps
CONTAINER ID        IMAGE                     COMMAND                  CREATED             STATUS              PORTS                    NAMES
325d5ee66619        e791444790a6              "nginx -g 'daemon of…"   50 seconds ago      Up 45 seconds       0.0.0.0:8000->80/tcp     elblogdenegu

Ahora si vamos al navegador en el puerto localhost:8080 veremos la página de ejemplo:

terraform-docker-nginx-1

Ahora simplemente para eliminar el docker desde Terraform:

terraform destroy

Espero os parezca interesante…ya que es gratis, comparte ;P

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Terraform: crear Docker se publicó primero en Blog Virtualizacion.

Powershell: script lanzadera con otras credenciales

$
0
0

Powershell: script lanzadera con otras credenciales

Hoy vamos a explicar como lanzar un script de powershell PS1, mediante otro script PS1, que actuará de lanzadera.

Este script lanzadera, abrirá una nueva sesión, con un usuario diferente, normalmente con permisos mas elevados.

Esto es interesante si necesitas realizar ciertas acciones con diferentes usuarios y no quieres elevar los permisos a tus usuarios en los sistemas.

Script: https://gist.github.com/raulunzue/382bd5532c9dfeb1cb1322b5ce428dc9

# PASAMOS CREDENCIALES EN BASE64 - USUARIO
$Usuario = 'ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA';
$otroUsuario = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($Usuario))
# PASAMOS CREDENCIALES EN BASE64 - CONTRASEÑA
$Pw = 'ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA'
$otroUsuarioClave = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($Pw))
# NOMBRE DE SERVER
$hostname = c:\windows\system32\hostname.exe
# CONEXION CON CREDENCIALES ELEVADAS
$otroUsuarioClaveSS = $otroUsuarioClave | ConvertTo-SecureString -Force -AsPlainText
$myCredencial = New-Object System.Management.Automation.PsCredential("$env:userdomain\$otroUsuario", $otroUsuarioClaveSS)
$otroUsuarioSesion = New-PSSession -ComputerName $hostname -Credential $myCredencial
# PUNTO DE CONTROL
Write-Host "Ejecutando bajo el contexto de: $env:userdomain\$env:username"
# EJECUCION SCRIPT
Invoke-Command -Session $otroUsuarioSesion -FilePath "C:\script-prueba.ps1"
# PUNTO DE CONTROL
Write-Host "Ejecutando bajo el contexto de: $env:userdomain\$env:username"
# CIERRE SESION
Get-PSSession | Remove-PSSession

Espero os parezca interesante…ya que es gratis, comparte ;P

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: script lanzadera con otras credenciales se publicó primero en Blog Virtualizacion.

Ansible: Comandos básicos

$
0
0

Ansible: Comandos básicos

En otras entradas ya os hemos explicado como configurar o instalar Ansible, hoy vamos a mostrar los comandos básicos para manejaros si estáis empezando desde cero.

Lo que tenéis que tener claro, como ya hemos explicado otras veces, que necesitáis tener definidos los hosts a «atacar» en el fichero host de Ansible (/etc/ansible/hosts).

Una vez definidos, podemos lanzar comandos tipo:

ansible -m ping all

  • Con este comando verificamos que todos los hosts responden al ping
[root@TERRAFORM ~]# ansible -m ping all
[WARNING]: Platform linux on host pve2 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve2 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[WARNING]: Platform linux on host pve1 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
[WARNING]: Platform linux on host pve3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve3 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "ping": "pong"
}
Podemos usar, por ejemplo, el siguiente comando:

ansible all -a "COMANDO A LANZAR" -f 1

  • Con este comando lanzaremos en todos los hosts definidos el comando que coloquemos entre las comillas
  • El valor «-f», permite definir a cuantos hosts a la vez vamos a lanzarlo a la vez. Imaginaros que tenéis 3 como yo, ese valor no es significativo, pero cuando tienes 2000, que es donde tienen sentido las automatizaciones, podemos saturar nuestra red, o la de nuestros clientes.

Os dejo algún ejemplo:

ansible all -a "df -h" -f 1

  • Con este comando revisamos el espacio en disco de todos los hosts, y lo haremos de uno en uno, con el parámetro «-f 1»
[root@TERRAFORM playbooks]# ansible all -a "df -h" -f 1
[WARNING]: Platform linux on host pve1 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve1 | CHANGED | rc=0 >>
Filesystem                      Size  Used Avail Use% Mounted on
udev                             32G     0   32G   0% /dev
tmpfs                           6.3G   98M  6.2G   2% /run
/dev/mapper/pve-root             55G  5.6G   47G  11% /
tmpfs                            32G   63M   32G   1% /dev/shm
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                            32G     0   32G   0% /sys/fs/cgroup
tmpfs                            32G   24K   32G   1% /var/lib/ceph/osd/ceph-0
tmpfs                            32G   24K   32G   1% /var/lib/ceph/osd/ceph-2
tmpfs                            32G   24K   32G   1% /var/lib/ceph/osd/ceph-1
/dev/fuse                        30M   40K   30M   1% /etc/pve
192.168.2.109:/volume1/PROXMOX   11T  7.9T  2.7T  75% /mnt/pve/NAS
tmpfs                           6.3G     0  6.3G   0% /run/user/0
[WARNING]: Platform linux on host pve2 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve2 | CHANGED | rc=0 >>
Filesystem                      Size  Used Avail Use% Mounted on
udev                             32G     0   32G   0% /dev
tmpfs                           6.3G   50M  6.3G   1% /run
/dev/mapper/pve-root             55G  5.6G   47G  11% /
tmpfs                            32G   63M   32G   1% /dev/shm
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                            32G     0   32G   0% /sys/fs/cgroup
tmpfs                            32G   24K   32G   1% /var/lib/ceph/osd/ceph-6
tmpfs                            32G   24K   32G   1% /var/lib/ceph/osd/ceph-8
tmpfs                            32G   24K   32G   1% /var/lib/ceph/osd/ceph-7
/dev/fuse                        30M   40K   30M   1% /etc/pve
192.168.2.109:/volume1/PROXMOX   11T  7.9T  2.7T  75% /mnt/pve/NAS
tmpfs                           6.3G     0  6.3G   0% /run/user/0
[WARNING]: Platform linux on host pve3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve3 | CHANGED | rc=0 >>
Filesystem                      Size  Used Avail Use% Mounted on
udev                            7.8G     0  7.8G   0% /dev
tmpfs                           1.6G   81M  1.5G   6% /run
/dev/mapper/pve-root             28G  5.6G   21G  22% /
tmpfs                           7.8G   63M  7.7G   1% /dev/shm
tmpfs                           5.0M     0  5.0M   0% /run/lock
tmpfs                           7.8G     0  7.8G   0% /sys/fs/cgroup
/dev/fuse                        30M   40K   30M   1% /etc/pve
tmpfs                           7.8G   24K  7.8G   1% /var/lib/ceph/osd/ceph-3
tmpfs                           7.8G   24K  7.8G   1% /var/lib/ceph/osd/ceph-5
tmpfs                           7.8G   24K  7.8G   1% /var/lib/ceph/osd/ceph-4
192.168.2.109:/volume1/PROXMOX   11T  7.9T  2.7T  75% /mnt/pve/NAS
tmpfs                           1.6G     0  1.6G   0% /run/user/0
ansible all -a "df -h" -f 2
  • Con este comando revisamos el hostname de los hosts, y lo haremos de dos en dos, con el parámetro «-f 2»
[root@TERRAFORM playbooks]# ansible all -a "hostname" -f 2
[WARNING]: Platform linux on host pve2 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve2 | CHANGED | rc=0 >>
pve2
[WARNING]: Platform linux on host pve1 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve1 | CHANGED | rc=0 >>
pve1
[WARNING]: Platform linux on host pve3 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve3 | CHANGED | rc=0 >>
pve3
ansible pve1 -m setup
  • Con este comando podemos extraer toda la info de un host, donde pve1 es el nombre del host
  • Si queremos toda la información de todos los hosts:
    • ansible all -m setup -f 1
[root@TERRAFORM playbooks]# ansible pve1 -m setup -f 1 | more
[WARNING]: Platform linux on host pve1 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve1 | SUCCESS => {
    "ansible_facts": {
        "ansible_all_ipv4_addresses": [
            "10.20.0.1", 
            "192.168.2.51"
        ], 
        "ansible_all_ipv6_addresses": [
            "fe80::6eb3:11ff:fe1b:a706", 
            "fe80::82ee:73ff:fedb:4cef", 
            "fe80::6eb3:11ff:fe1b:a707"
        ], 
        "ansible_apparmor": {
            "status": "enabled"
        }, 
        "ansible_architecture": "x86_64", 
        "ansible_bios_date": "01/09/2018", 
        "ansible_bios_version": "1.09", 
        "ansible_cmdline": {
            "BOOT_IMAGE": "/boot/vmlinuz-5.4.65-1-pve", 
            "quiet": true, 
            "ro": true, 
            "root": "/dev/mapper/pve-root"
        }, 
        "ansible_date_time": {
            "date": "2020-10-10", 
            "day": "10", 
            "epoch": "1602322277", 
            "hour": "11", 
            "iso8601": "2020-10-10T09:31:17Z", 
            "iso8601_basic": "20201010T113117021279", 
            "iso8601_basic_short": "20201010T113117", 
            "iso8601_micro": "2020-10-10T09:31:17.021331Z", 
            "minute": "31", 
            "month": "10", 
--More--
Existen otros comandos interesantes, que se trabajan conjuntamente con los módulos de Ansible:
  • Módulo Ansible «cron»:
    • Se utiliza para poder programar tareas a través de cron
    • Ejemplo (DOCUMENTACION OFICIAL ANSIBLE):
      • ansible all -u root -m cron -a "name='tarea-cron' hour=5 job='/script-tarea.sh'"
  • Módulo Ansible «file»:
    • Se utiliza para crear/borrar masivamente directorios, ficheros o enlaces simbólicos. Incluso podemos gestionar permisos
    • Ejemplo (DOCUMENTACION OFICIAL ANSIBLE):
      • Crear directorio:
        • ansible all -m file -a "dest=/var/www/prueba mode=644 state=directory"
      • Crear fichero:
        • ansible all -m file -a "dest=/var/www/prueba.html mode=644 state=touch"
[root@TERRAFORM playbooks]# ansible pve1 -m file -a "dest=/etc/prueba.txt mode=644 state=touch"
[WARNING]: Platform linux on host pve1 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "dest": "/etc/prueba.txt", 
    "gid": 0, 
    "group": "root", 
    "mode": "0644", 
    "owner": "root", 
    "size": 0, 
    "state": "file", 
    "uid": 0
}
      • Borrar fichero:
        • ansible all -m file -a "dest=/var/www/prueba.html mode=644 state=absent"
[root@TERRAFORM playbooks]# ansible pve1 -m file -a "dest=/etc/prueba.txt mode=644 state=absent"
[WARNING]: Platform linux on host pve1 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve1 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": true, 
    "path": "/etc/prueba.txt", 
    "state": "absent"
}
      • Enlace simbólico:
        • ansible all -m file -a "srv=/prueba dest=/tmp mode=644 state=link"
  • Módulo Ansible «stat»:
[root@TERRAFORM playbooks]# ansible pve1 -m stat -a "path=/etc"
[WARNING]: Platform linux on host pve1 is using the discovered Python interpreter at /usr/bin/python, but future installation of another Python
interpreter could change this. See https://docs.ansible.com/ansible/2.9/reference_appendices/interpreter_discovery.html for more information.
pve1 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/bin/python"
    }, 
    "changed": false, 
    "stat": {
        "atime": 1602253762.5567355, 
        "attr_flags": "e", 
        "attributes": [
            "extents"
        ], 
        "block_size": 4096, 
        "blocks": 8, 
        "charset": "binary", 
        "ctime": 1602253683.2757099, 
        "dev": 64772, 
        "device_type": 0, 
        "executable": true, 
        "exists": true, 
        "gid": 0, 
        "gr_name": "root", 
        "inode": 3276801, 
        "isblk": false, 
        "ischr": false, 
        "isdir": true, 
        "isfifo": false, 
        "isgid": false, 
        "islnk": false, 
        "isreg": false, 
        "issock": false, 
        "isuid": false, 
        "mimetype": "inode/directory", 
        "mode": "0755", 
        "mtime": 1602253683.2757099, 
        "nlink": 93, 
        "path": "/etc", 
        "pw_name": "root", 
        "readable": true, 
        "rgrp": true, 
        "roth": true, 
        "rusr": true, 
        "size": 4096, 
        "uid": 0, 
        "version": "2230499079", 
        "wgrp": false, 
        "woth": false, 
        "writeable": true, 
        "wusr": true, 
        "xgrp": true, 
        "xoth": true, 
        "xusr": true
    }
}
  • Módulo Ansible «copy»:
    • Nos permite copiar ficheros y directorios en los servidores
    • Ejemplo:
      • ansible all -m copy -a "src=/tmp/fichero dest=/root/hosts"
  • Módulo Ansible «fetch»:
    • Nos permite copiar ficheros y directorios de los servidores a nuestro server de ejecución ansible. Hace lo contrario que Copy, al menos en el origen y destino.
    • Ejemplo:
      • ansible all -m fetch -a "src=/root/hosts dest=/tmp/fichero"
  • Módulo Ansible «apt»:
    • Nos permite instalar aplicaciones en nuestros servidores
    • Ejemplo:
      • ansible all -u root -m apt -a "name=net-tools state=installed"
  • Módulo Ansible «group»:
    • Nos permite crear grupos de usuarios en los servidores
    • Ejemplo:
      • ansible all -u root -m group -a "name=proxmoxadmins state=present"
  • Módulo Ansible «user»:
    • Nos permite crear usuarios en los servidores
    • Ejemplo:
      • ansible all -u root -m user -a "name=elblogdenegugroup=proxmoxadmins createhome=yes"

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Comandos básicos se publicó primero en Blog Virtualizacion.

Powershell: Reporte HTML de Ordenadores / Servidores

$
0
0

Powershell: Reporte HTML de Ordenadores / Servidores

Hoy os dejo otro script interesante…

Imaginaros que vuestra empresa no tiene dinero para una CMDB, un sistema de monitorización o el inventario actual es muy precario. Para poder controlar los datos más importantes de los activos de una empresa, como son los servidores o los pcs, os dejo una pequeña solución que os puede ser muy útil.

La idea del script es traernos en formato HTML mediante Powershell, los datos ordenados de ciertos PCs u Ordenadores. ¿Qué vamos a necesitar?:

  • Powershell
  • Usuario y contraseña para envío de correos

Opcionalmente:

El script:

https://gist.github.com/raulunzue/652d4686a3bcf87910961faa38ced7f2

###########################################
## Raúl Unzué - El Blog de Negu
## https://www.maquinasvirtuales.eu/
## Reporte HTML de Ordenadores / Servidores
###########################################

#Definimos los códigos de estilos CSS
$header = @"
<style>
    h1 {

        font-family: Arial, Helvetica, sans-serif;
        color: #44A1FE;
        font-size: 28px;

    }
    
    h2 {

        font-family: Arial, Helvetica, sans-serif;
        color: #000099;
        font-size: 16px;

    }
    
   table {
       font-family:"Trebuchet MS", Arial, Helvetica, sans-serif;
       border-collapse:collapse;
       overflow:scroll;
	} 
	
    td {
	   font-size:1em;
       border:1px solid #2087db;
       padding:5px 5px 5px 5px;
       text-align: center;
	}
	
    th {
       font-size:1.1em;
       text-align:center;
       padding-top:5px;
       padding-bottom:5px;
       padding-right:7px;
       padding-left:7px;
       background-color:#2087db;
       color:#ffffff;
       text-align: center; 
	}

    tbody tr:nth-child(even) {
        background: #f0f0f2;
    }
    
    #CreationDate {

        font-family: Arial, Helvetica, sans-serif;
        color: #ff3300;
        font-size: 12px;

    }

    .StopStatus {

        color: #ff0000;
    }
  
    .RunningStatus {

        color: #008000;
    }

</style>
"@

#Obtenemos el nombre del ordenador o servidor
$ComputerName = "<h1>Nombre PC / Server: $env:computername</h1>"

#El siguiente comando obtendrá la información del sistema operativo, convertirá el resultado a código HTML como una tabla y lo almacenará en una variable
$OSinfo = Get-CimInstance -Class Win32_OperatingSystem | ConvertTo-Html -As List -Property Version,Caption,BuildNumber,Manufacturer -Fragment -PreContent "<h2>Información Sistema Operativo</h2>"

#El siguiente comando obtendrá la información del procesador, convertirá el resultado a código HTML como una tabla y lo almacenará en una variable
$ProcessInfo = Get-CimInstance -ClassName Win32_Processor | ConvertTo-Html -As List -Property DeviceID,Name,Caption,MaxClockSpeed,SocketDesignation,Manufacturer -Fragment -PreContent "<h2>Información Procesador</h2>"

#El siguiente comando obtendrá la información del BIOS, convertirá el resultado a código HTML como tabla y lo almacenará en una variable
$BiosInfo = Get-CimInstance -ClassName Win32_BIOS | ConvertTo-Html -As List -Property SMBIOSBIOSVersion,Manufacturer,Name,SerialNumber -Fragment -PreContent "<h2>Información BIOS</h2>"

#El siguiente comando obtendrá los detalles de Disk, convertirá el resultado a código HTML como tabla y lo almacenará en una variable
$DiscInfo = Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" | Select-Object DeviceID,DriveType,VolumeName, @{N="DiskSizeGB";e={[math]::Round($($_.Size) / 1073741824,0)}}, @{N="FreeSpaceGB";e={[math]::Round($($_.FreeSpace) / 1073741824,0)}}, @{N="FreePorcentaje";e={[math]::Round($($_.FreeSpace) / $_.Size * 100,1)}} | ConvertTo-Html -As List -Property DeviceID,DriveType,VolumeName,DiskSizeGB,FreeSpaceGB,FreePorcentaje -Fragment -PreContent "<h2>Disk Information</h2>"

#El siguiente comando obtendrá la información de los primeros 10 servicios, convertirá el resultado a código HTML como una tabla y lo almacenará en una variable
$ServicesInfo = Get-CimInstance -ClassName Win32_Service | Select-Object -First 10  | ConvertTo-Html -Property Name,DisplayName,State -Fragment -PreContent "<h2>Información Servicios</h2>"
#$ServicesInfo = Get-CimInstance -ClassName Win32_Service  | ConvertTo-Html -Property Name,DisplayName,State -Fragment -PreContent "<h2>Información Servicios</h2>"
$ServicesInfo = $ServicesInfo -replace '<td>Running</td>','<td class="RunningStatus">Running</td>'
$ServicesInfo = $ServicesInfo -replace '<td>Stopped</td>','<td class="StopStatus">Stopped</td>'

  
#El siguiente comando combinará toda la información recopilada en un solo informe HTML
$Report = ConvertTo-HTML -Body "$ComputerName $OSinfo $ProcessInfo $BiosInfo $DiscInfo $ServicesInfo" -Head $header -Title "Computer Information Report" -PostContent "<p id='CreationDate'>Creado el día: $(Get-Date)</p>"

#El siguiente comando generará el informe en un archivo HTML
$Report | Out-File  C:\Users\runzue\Desktop\UniversalDashboard\Basic-Computer-Information-Report-$env:computername.html

#Envío de resultados
###############
# ENVIO CORREO
###############
# ENCRIPTAMOS USUARIO Y CONTRASEÑA
$EncodedTextMAIL = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA”
$DecodedTextMAIL = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextMAIL))
$EncodedTextPW = “ZQBsAGIAbABvAGcAZABlAG4AZQBnAHUA”
$DecodedTextPW = [System.Text.Encoding]::Unicode.GetString([System.Convert]::FromBase64String($EncodedTextPW))

$emailSmtpServer = "smtp.tuserver.es"
$emailSmtpServerPort = "587"
$emailSmtpUser = "$DecodedTextMAIL"
$emailSmtpPass = "$DecodedTextPW"

$emailFrom = "cuentacorreo@tudominio.es"
$emailTo = "cuentaadmin@tudominio.es"
$emailcc="otrousuario@tudominio.es"

$emailMessage = New-Object System.Net.Mail.MailMessage( $emailFrom , $emailTo )
$emailMessage.cc.add($emailcc)
$emailMessage.Subject = "Datos de PC/Server: $env:computername" 
$emailMessage.IsBodyHtml = $true #true or false depends
$emailMessage.Body = $body
$SMTPClient = New-Object System.Net.Mail.SmtpClient( $emailSmtpServer , $emailSmtpServerPort )
$SMTPClient.EnableSsl = $False
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential( $emailSmtpUser , $emailSmtpPass );
$SMTPClient.Send( $emailMessage )

El resultado será algo así:

powershell-reporte-html-de-ordenadores-servidores

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Reporte HTML de Ordenadores / Servidores se publicó primero en Blog Virtualizacion.

Ansible: Conceptos básicos

$
0
0

Ansible: Conceptos básicos

Hoy os voy a dar unas pequeñas pautas sobre Ansible.

Los conceptos que hoy os voy a dar son comunes a todos los usos en automatización que le podáis dar a Ansible. Esta introducción básica proporciona las premisas básicas para comenzar con Ansible desde cero.

Estos los términos básicos que deberemos tener claros si queremos trabajar con Ansible:

Antes de nada, me gustaría dejar una pequeña recopilación de conceptos y definiciones que vamos a encontrarnos continuamente al trabajar con Ansible:

ANSIBLE – NODO DE CONTROL

  • El «nodo de control», es la máquina que tiene instalado Ansible. Desde ella administraremos el resto de nodos. Esta máquina puede gestionar diferentes sistemas operativos, pero no puede ser un Windows. Los comandos que se utilizan en este nodo de control, como lanzadera, son «ansible» y «ansible-playbook».

ANSIBLE – NODO ADMINISTRADO

  • Un «Nodo administrado» es todo objeto, como su nombre indica, administrado con Ansible.  Puede ser un servidor, ordenadores o dispositivos de red, entre otros. Estos nodos no tienen Ansible instalado.

ANSIBLE – FACTS

  • Los «Facts» nos dan información útil de los nodos.

ANSIBLE – INVENTARIO

  • El «Inventario» es el archivo host para Ansible. En él se incluye información, estática o dinámica, de los nodos administrados y su información. Datos como IP o nombre. También se pueden unir objetos cuando conforman un clúster o una función específica.

ANSIBLE – MODULOS

  • Los «Módulos», como en otros lenguajes, serían las librerías que ejecuta Ansible. En las últimas versiones, los módulos se unen en colecciones. Los módulos se pueden usar para realizar una tarea, o enlazar varios módulos que realicen varias acciones. Se copian al nodo cliente para que ejecute la tarea indicada.

ANSIBLE – COLECCIONES

  • Las «Colecciones», que se instalan desde Ansible Galaxy, son un formato de distribución que puede estar compuesto de Playbooks, Módulos, Roles o Plugins.

ANSIBLE – PLAYBOOK

  • Los «Playbooks» se encargan de definir todas las tareas que debemos realizar sobre un conjunto de nodos administrador. Los «Playbooks» pueden incluir tanto variables como tareas. Están escritos en YAML y son fáciles de leer, escribir, compartir y comprender.

ANSIBLE – ROLES

  • Los «Roles» es una agrupación de ficheros, tareas y plantillas. Los podemos reutilizar.

ANSIBLE- TASKS

  • Una «Task» se podría definir como una acción a realizar.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Conceptos básicos se publicó primero en Blog Virtualizacion.

Sorteo: Libro impreso Cloud por vExperts

$
0
0

Sorteo: Libro impreso Cloud por vExperts

Hoy tenemos una entrada diferente, voy a sortear algo en el blog…

He impreso varios libros de CLOUD POR VEXPERTS, y voy a regalar uno. Va a ser un sorteo global no sólo de España (pago el envío a cualquier parte del mundo), y sin grandes condiciones.

Lo detallo, porque va ser por TWITTER íntegramente:

  • Seguir la cuenta del blog: https://twitter.com/elblogdeNegu
  • Seguir la cuenta del libro https://twitter.com/vmwarevexperts
  • Y darle «Me gusta y Retweet» a la entrada fijada en el perfil @elblogdeNegu sobre éste post
  • Empezamos el 16/10/2020 y termina en dos semanas 01/11/2020 a las 23:59:59 hora española
    • A partir de esa fecha, realizaré un sorteo con todos los que cumplan las condiciones. Y le pediré por privado los datos para enviarlo durante la semana del día 2 de Noviembre

Animaros!

sorteo-libro-impreso-cloud-por-vexperts

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Sorteo: Libro impreso Cloud por vExperts se publicó primero en Blog Virtualizacion.


Ansible: Gestión básica máquinas virtuales Proxmox

$
0
0

Ansible: Gestión básica máquinas virtuales Proxmox

Seguiremos jugando con Ansible bajo linux. Hace ya unos días os expliqué como instalar Ansible en Centos 7.

También hablamos un poco sobre gestionar nuestra infraestructura Proxmox a través de Terraform.

Una vez que vamos entre todos aprendiendo conceptos nuevos, seguimos con las herramientas para automatizar acciones como Ansible. Nos ponemos manos a la obra…partimos que ya tenemos una máquina con Ansible instalado.

Ansible dispone de varios módulos principales para gestionar Proxmox. Estos módulos, de momento, sólo permiten crear, arrancar y detener contenedores LXC.

Así que nos ponemos manos a la obra…

Requerimientos Ansible para Proxmox

A continuación, explicamos los requerimientos en los nodos de Proxmox, en cuanto a paquetes. Deberemos hacerlo en el nodo donde nos interesa lanzar los comandos de Ansible, yo en mi LAB (versión actual 6.2-12) lo hago en todos para no tener nodos con software diferente:

apt install -y python-pip python-dev build-essential
pip update pip
pip install virtualenv
pip install proxmoxer requests

Por recordar, por si empezáis de cero, necesitaremos generar nuestra pareja de claves con SSH-KEYGEN y una vez generadas, habrá que copiarlas a todos los servidores que queremos controlar con Ansible. Recuerdo los comandos:

[root@TERRAFORM ansible]# ssh-keygen

[root@TERRAFORM ansible]# ssh-copy-id -i /root/.ssh/id_rsa SERVER-PROXMOX

Sería así:

[root@TERRAFORM ansible]# ssh-copy-id -i /root/.ssh/id_rsa 192.168.2.51
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys
root@192.168.2.51's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.2.51'"
and check to make sure that only the key(s) you wanted were added.

Por otra parte, deberemos definir en el fichero /etc/ansible/hosts los servidores a controlar:

[proxmox1]
pve1 ansible_ssh_host=192.168.2.51

[proxmox2]
pve2 ansible_ssh_host=192.168.2.50

[proxmox3]
pve3 ansible_ssh_host=192.168.2.187

[proxmoxs:children]
proxmox1
proxmox2
proxmox3

Comprobamos, por ejemplo, que funciona con el siguiente comando:

ansible-gestion-basica-maquinas-virtuales-proxmox-0

SI el proyecto es grande, es mejor definir los inventarios, roles,…en sus diferentes secciones.

[root@TERRAFORM ansible]# ls   
ansible.cfg  hosts  inventory  playbooks  requirements.yml  roles

Utilizando un fichero con el anterior contenido, pero definido en la carpeta inventario, al que nos vamos a referenciar de la siguiente forma:

[root@TERRAFORM ansible]# ansible -m ping -i inventory/proxmox all

Requerimientos máquina Ansible

Necesitaremos instalar en nuestra máquina, donde lanzamos los comandos, el siguiente módulo:

https://galaxy.ansible.com/search?deprecated=false&keywords=proxmox&order_by=-relevance&page=1

[root@TERRAFORM ansible]# ansible-galaxy collection install community.general
Process install dependency map
Starting collection install process
Installing 'ansible.netcommon:1.3.0' to '/root/.ansible/collections/ansible_collections/ansible/netcommon'
Installing 'ansible.posix:1.1.1' to '/root/.ansible/collections/ansible_collections/ansible/posix'
Installing 'google.cloud:1.0.1' to '/root/.ansible/collections/ansible_collections/google/cloud'
Installing 'community.general:1.2.0' to '/root/.ansible/collections/ansible_collections/community/general'
Installing 'community.kubernetes:1.1.1' to '/root/.ansible/collections/ansible_collections/community/kubernetes'

ansible-gestion-basica-maquinas-virtuales-proxmox-2

Podéis también hacerlo mediante un fichero requirements.yml con el siguiente contenido:

collections:
- name: community.general

Y el comando:

[root@TERRAFORM ansible]# ansible-galaxy collection install -r requirements.yml
Process install dependency map
Starting collection install process
Skipping 'community.general' as it is already installed

Comprobar acceso host Proxmox desde Ansible

Para validar el acceso, podemos usar CURL de la siguiente forma:

[root@TERRAFORM ansible]# curl -k -d "username=root@pam&password=introducirpasswd" https://192.168.2.51:8006/api2/json/access/ticket

Si todo va bien, os soltará información sobre la infraestructura:

ansible-gestion-basica-maquinas-virtuales-proxmox-1

Parámetros que podemos usar con name

Os dejo las settings que admite el módulo para proxmox:

Supported parameters include: 
api_host
api_password
api_user
cores
cpus
cpuunits
disk
force
hostname
ip_address
memory
mounts
nameserver
netif
node
onboot
ostemplate
password
pool
pubkey
searchdomain
state
storage
swap
timeout
unprivileged
validate_certs
vmid
A continuación, os dejo unos pocos ejemplos básicos:

Parar LXC con Ansible en Proxmox

Genero un otro fichero para hacer la parada:

[root@TERRAFORM ansible]# nano playbooks/stopvm-proxmox-prueba.yml

Con el siguiente contenido:

---
- hosts: proxmoxs
  tasks:
    - name: 'Stop VM'
      proxmox:
       api_user: ansible@pve
       api_password: Prueba1234!
       api_host: 192.168.2.51
       vmid: 105
       node: pve1
       state: stopped

Lo lanzamos con:

[root@TERRAFORM ansible]# ansible-playbook playbooks/stopvm-proxmox-prueba.yml -i inventory/proxmox

ansible-gestion-basica-maquinas-virtuales-proxmox-3

Arrancar un container LXC en Proxmox

Os dejo el ejemplo para arrancar el container:

---
- hosts: proxmoxs
  tasks:
    - name: 'Start VM'
      proxmox:
       api_user: ansible@pve
       api_password: Prueba1234!
       api_host: 192.168.2.51
       vmid: 105
       node: pve1
       state: started

ansible-gestion-basica-maquinas-virtuales-proxmox-4

Borra un container LXC en Proxmox

Borrar un container LXC de Proxmox:

---
- hosts: proxmoxs
  tasks:
    - name: 'Borrar container LXC'
      proxmox:
        vmid: 105
        api_user: ansible@pve
        api_password: Prueba1234!
        api_host: pve1
        state: absent

Reiniciar un container LXC en Proxmox

Para reiniciar un container:

---
- hosts: proxmoxs
  tasks:
    - name: 'Reiniciar container LXC'
      proxmox:
        vmid: 105
        api_user: ansible@pve
        api_password: Prueba1234!
        api_host: pve1
        state: restarted

Crear un container LXC básico en Proxmox

Para crear un container:

- hosts: proxmoxs
  tasks:
    - name: 'Crear container LXC'
      proxmox:
       api_user: ansible@pve
       api_password: Prueba1234!
       api_host: 192.168.2.51
       vmid: 131
       node: pve3
       hostname: pruebalxc
       ostemplate: 'NAS:vztmpl/ubuntu-20.04-standard_20.04-1_amd64.tar.gz'

Si no sabéis como configurar vuestro storage revisar con este comando:

root@pve1:~# pvesm status
Name             Type     Status           Total            Used       Available        %
HDD               rbd     active      2779909937       171591729      2608318208    6.17%
NAS               nfs     active     11233707136      8431687936      2802019200   75.06%
SSD               rbd     active       653366690       189614722       463751968   29.02%
local             dir     active        57278576         5855900        48483388   10.22%
local-lvm     lvmthin     active       147279872               0       147279872    0.00%

root@pve1:~# pvesm list NAS -content vztmpl
Volid                                                 Format  Type           Size VMID
NAS:vztmpl/debian-10.0-standard_10.0-1_amd64.tar.gz   tgz     vztmpl    230629816
NAS:vztmpl/ubuntu-20.04-standard_20.04-1_amd64.tar.gz tgz     vztmpl    214203058
NAS:vztmpl/centos-7-default_20190926_amd64.tar.xz     txz     vztmpl     68649456
NAS:vztmpl/centos-8-default_20191016_amd64.tar.xz     txz     vztmpl    106244064

Seguiremos haciendo cosas más complejas…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Gestión básica máquinas virtuales Proxmox se publicó primero en Blog Virtualizacion.

Powershell: Crear EXE con PS1

$
0
0

Powershell: Crear EXE con PS1

Hoy vamos a hablar de cómo poder ejecutar un script de Powershell PS1, cuando disponemos de restricciones en nuestros sistemas operativos, que es mi caso de uso.

Cuando diseño sistemas o infraestructuras virtualizadas, intento evitar que mis usuarios puedan «hacer el mal», bloqueando cosas como Powershell, ejecución de extensiones tipo PS1, CMD, BAT,…Esto es útil cuando quieras conseguir una plataforma segura.

Pero hace, que en la práctica, cuando quieres realizar ejecuciones de scripts a los usuarios, te encuentres bloqueos por falta de permisos.

Os dejo una forma de convertir esos PS1 en ficheros EXE, ya que ese EXE, salvo que vuestro antivirus lo detecto como algo extraño (y habrá que hacer excepciones), podrá ser ejecutable.

Para ello usaré de ejemplo el script que os presenté el otro día que miraba la caducidad de Outlook. Y el siguiente programa, que lo podéis usar para GUI o comando:

https://gallery.technet.microsoft.com/scriptcenter/PS2EXE-GUI-Convert-e7cb69d5

powershell-crear-exe-con-ps1-1

Descomprimís, y ejecutáis el programa:

powershell-crear-exe-con-ps1-2

Y vais rellenando los datos. Yo le pongo un nombre gracioso, porque realmente esto lo podemos usar para administrar nuestros sistemas o «hacer el mal»:

powershell-crear-exe-con-ps1-3

Una vez que se compila, simplemente lo ponéis en una GPO para que se lance en el arranque. Si monitorizáis un poco el sistema, veis que el proceso tiene nuestro nombre:

powershell-crear-exe-con-ps1-4

Y nos valida el script para poder lanzarlo en nuestros sistemas sin restricciones:

powershell-crear-exe-con-ps1-5

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Crear EXE con PS1 se publicó primero en Blog Virtualizacion.

Powershell: Extraer enlaces imágenes de Web

$
0
0

Powershell: Extraer enlaces imágenes de Web

Entrada rápida, os enseño como podéis extrar todas las imágenes de una página web con Powershell, de una forma rápida.

El comando a utilizar sería:

$url = "https://www.maquinasvirtuales.eu"
$result = Invoke-WebRequest $url
$result.Images.src

El resultado sería algo así:

PS C:\WINDOWS\system32> $url = "https://www.maquinasvirtuales.eu"
$result = Invoke-WebRequest $url
$result.Images.src
https://www.maquinasvirtuales.eu/wp-content/uploads/2018/11/maquinas-virtuales-logo1.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/ansible-conceptos-basicos-1-310x165.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/powershell-reporte-html-de-ordenadores-servidores-310x165.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/comandos-basicos-ansible-310x165.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/powershell-script-lanzadera-con-otras-credenciales-310x165.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/terraform-docker-nginx-0-310x165.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/preportadaebookcloud-310x165.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/04/Powershell-Eliminar-texto-de-variable-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/06/programa-vmware-vexpert-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/05/citrix-configurar-visualizador-de-imagenes-en-windows-server-2016-6-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/05/terraform-crear-maquina-virtual-desde-template-1-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/powershell-script-para-comprimir-perfiles-vhdx-fslogix-en-citrix-0-310x165.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/powershell-script-para-comprobar-perfiles-vhdx-fslogix-en-citrix-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/08/powershell-citrix-liberar-licencias-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/07/citrix-powershell-extraer-licencias-mediante-wmi-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/07/citrix-chrome-no-ejecuta-audio-videos-youtube-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/ansible-conceptos-basicos-1-310x165.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/comandos-basicos-ansible-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/terraform-docker-nginx-0-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/terraform-crear-kubernetes-deployment-0-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/proxmox-importar-imagen-qcow2-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/proxmox-importar-imagen-qcow2-310x165.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/proxmox-instalar-qemu-agent-en-windows-2-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/07/proxmox-sustituir-disco-en-almacenamiento-cephfs-1-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/05/proxmox-ceph-crear-pools-diferentes-con-hdd-y-ssd-3-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/05/proxmox-daemons-have-recently-crashed-2-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/terraform-docker-nginx-0-310x165.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/terraform-crear-kubernetes-deployment-0-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/powershell-gestion-de-docker-desde-linux-4-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/preportadaebookcloud-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/Polaris-best-practice-buenas-practicas-kubernetes-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/04/manual-videollamada-whatsapp-para-personas-mayores-1-310x165.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/04/que-es-devops-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/10/actualizar-idrac-servidor-dell-9-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/02/Review-ThinMan-Gateway-323-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2018/11/upgrade-hp-switch-ps1810-8g-18-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/04/vexpert-2020-raulunzue.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/04/vexpert-2020-7-raulunzue.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/04/vexpert-pro-raulunzue.jpeg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/07/Un-Podcast-para-TI-Raul-Unzue-Kubernetes-Contenedores.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/02/raul-unzue-ebook-vmware-por-vexperts-1.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/09/ebook-libro-CloudPorvExperts-raul-unzue.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/01/maquinas-virtuales-sponsor-controlup-elblogdenegu-2.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/01/maquinas-virtuales-sponsor-controlup-elblogdenegu-1.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/01/maquinas-virtuales-blog-elblogdenegu-sponsor-praim.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/04/el-blog-de-negu-maquinas-virtuales.gif
https://www.maquinasvirtuales.eu/wp-content/uploads/2018/11/raul.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2019/01/exportar-gpo-windows-por-powershell-a-fichero-xml-o-htm-1-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2014/02/radiofmz30-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2012/08/tecla-cmd-teclados-apple-en-teclado-windows-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2016/11/error-1907-no-se-puede-registrar-la-fuente-office-2010-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2013/07/curso-basico-de-powershell-ejecucion-de-scripts-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/ansible-conceptos-basicos-1-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/powershell-reporte-html-de-ordenadores-servidores-110x75.png
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/comandos-basicos-ansible-110x75.jpg
https://www.maquinasvirtuales.eu/wp-content/uploads/2020/10/powershell-script-lanzadera-con-otras-credenciales-110x75.jpg

 

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Extraer enlaces imágenes de Web se publicó primero en Blog Virtualizacion.

Ansible: Gestión de máquina Windows

$
0
0

Ansible: Gestión de máquina Windows

Os explicamos como configurar Ansible para poder automatizar procesos para Windows.

Lo que buscamos es poder utilizar la automatización de Ansible con servidores o máquinas Windows.

Necesitaremos modificar tanto nuestro server Ansible, como nuestros clientes Windows.

Os dejo URL oficial: https://docs.ansible.com/ansible/latest/user_guide/windows_setup.html

Nos ponemos manos a la masa.

Ansible: preparar server para clientes Windows

Usaremos el siguiente módulo y configuraciones que vamos a instalar de la siguiente forma. Parto de tener pip ya instalado (yum install pip):

pip install https://github.com/diyan/pywinrm/archive/master.zip#egg=pywinrm

pip install kerberos

A nivel de sistema, añadiremos si no los tenemos ya, los paquetes:

yum -y install gcc python-devel krb5-devel krb5-workstation

Ansible: preparar clientes Windows

Para poder automatizar acciones con Ansible sobre clientes Windows, usaremos WinRM. Para eso tendremos que preparar nuestros clientes, para que escuchen en el puerto de WinRM, tendrán que tener el servicio levantado y si disponen de Firewall el puerto abierto.

ansible-gestion-de-maquina-windows-2

Deberemos tener el .NET y Powershell en línea con lo que marca Ansible. Os dejo el PS1:

$url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
$file = "$env:temp\Upgrade-PowerShell.ps1"
$username = "Administrator"
$password = "Password"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force

# Version can be 3.0, 4.0 or 5.1
&$file -Version 5.1 -Username $username -Password $password -Verbose

Lanzamos el siguiente script para modificar el sistema:

$url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
$file = "$env:temp\ConfigureRemotingForAnsible.ps1"

(New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)

powershell.exe -ExecutionPolicy ByPass -File $file

Y para terminar, modificamos al terminar la política de ejecución y eliminamos el WinLogon, para dejarlo seguro:

# This isn't needed but is a good security practice to complete
Set-ExecutionPolicy -ExecutionPolicy Restricted -Force

$reg_winlogon_path = "HKLM:\Software\Microsoft\Windows NT\CurrentVersion\Winlogon"
Set-ItemProperty -Path $reg_winlogon_path -Name AutoAdminLogon -Value 0
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultUserName -ErrorAction SilentlyContinue
Remove-ItemProperty -Path $reg_winlogon_path -Name DefaultPassword -ErrorAction SilentlyContinue

Revisamos que está escuchando:

winrm enumerate winrm/config/Listener

ansible-gestion-de-maquina-windows-4

Validarlo con un telnet o curl, por ejemplo:
curl -vk -d "" -u administrator:usuariopassword http://192.168.59.138:5985/wsman

o por ejemplo:

telnet neguad01.negu.local 5985

Usaremos adicionalmente, credenciales de directorio activo para conectarnos. Generamos un fichero de INVENTARIO y otro con las VARIABLES:

El fichero de inventario:

mkdir /etc/ansible/inventory
nano windows
[windows]
192.168.59.138

Para las variables:

mkdir /etc/ansible/group_vars
nano windows

Con el siguiente contenido

---
ansible_user: Administrator
ansible_password: PasswordUsuario
ansible_port: 5986
ansible_connection: winrm
ansible_winrm_server_cert_validation: ignore

Y hacemos la prueba:

ansible windows -m win_ping -i inventory/windows -e group_vars/windows

ansible-gestion-basica-maquinas-virtuales-windows-1

Realizaremos otras entradas más adelante…

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Gestión de máquina Windows se publicó primero en Blog Virtualizacion.

Powershell: Crear grupo dinámico Active Directory

$
0
0

Powershell: Crear grupo dinámico Active Directory

Hay ciertos aplicativos que necesitan una cierta automatización. En directorio activo, también suele pasar.

Os pongo un ejemplo, con la generación de un grupo dinámico de Active Directory. Lo que hacemos es comprobar automáticamente, si una persona pertenece a un grupo o no de forma periódica.

Esto viene muy bien cuando, por ejemplo, se dan de baja usuarios o tienes herramientas gestión de contraseñas.

Os dejo el script:

Import-Module ActiveDirectory
$groupname = "GrupoDinamico"
$users = Get-ADUser -Filter * -SearchBase "ou=DINAMICO,ou=USUARIOS-TEST,ou=PRUEBAS,dc=negu,dc=local"
foreach($user in $users)
{
  Add-ADGroupMember -Identity $groupname -Member $user.samaccountname -ErrorAction SilentlyContinue
}
$members = Get-ADGroupMember -Identity $groupname
foreach($member in $members)
{
  if($member.distinguishedname -notlike "*ou=DINAMICO,ou=USUARIOS-TEST,ou=PRUEBAS,dc=negu,dc=local*")
  {
    Remove-ADGroupMember -Identity $groupname -Member $member.samaccountname
  }
}

 

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Crear grupo dinámico Active Directory se publicó primero en Blog Virtualizacion.

Gestionar URLs según con el navegador por GPO

$
0
0

Gestionar URLs según con el navegador por GPO

No sé si os ha pasado, pero en medianas y grandes empresas, donde tienen aplicaciones web que no están al día, y que fueron desarrolladas para un navegador específico, nos encontramos con el problema que nos es difícil controlar que nuestros usuarios utilicen el navegador idóneo para cada URL.

Para esto, los señores de Google, con su navegador Chrome, disponen de un complemento que se llama Legacy Browser Support. Este complemento, viene unido con unos ADMX y ADM que puedes importar en Directorio Activo, que nos permitirá gestionarlo vía GPO.

El ejemplo será una aplicación web, usaré la URL del Blog, que tiene que trabajar en Internet Explorer en vez de Chrome.

IMPLICACIONES IMPORTANTES:
– Necesario instalar Chrome Enterprise y Legacy Support Browser
– Chrome se coloca como navegador por defecto (o debería serlo para que todo funcione bien, así que hay que revisar settings, gpos,…que impidan esto), y todo lo que no esté en la lista, desde Internet Explorer se redirige a Chrome. Vamos que ningún usuario puede usar Internet Explorer, salvo para las URLs que estén en el listado de la GPO

Así que, os dejo el enlace de la descarga de Chrome Enterprise:

https://cloud.google.com/chrome-enterprise/browser/download?hl=es

gestionar-urls-segun-con-el-navegador-por-gpo-1

Cuando lo descomprimes, dispondrás de tres carpetas, Installers, Documentation y Configuration:

gestionar-urls-segun-con-el-navegador-por-gpo-2

Instalamos el navegador Chrome Enterprise y Legacy Browser:

gestionar-urls-segun-con-el-navegador-por-gpo-4

Cargamos los ADMX y ADM en los controladores de Dominio. La ruta es:

Configuración de usuario -> Plantillas Administrativas -> Plantillas administrativas clásicas (ADM) -> Google -> Google Chrome -> Legacy Browser Support:

gestionar-urls-segun-con-el-navegador-por-gpo-4

Como navegador alternativo usaremos Internet Explorer con el valor:

${ie}

gestionar-urls-segun-con-el-navegador-por-gpo-5

Ruta donde está chrome instalado, colocamos:

${chrome}

gestionar-urls-segun-con-el-navegador-por-gpo-7

Si estáis haciendo pruebas, podéis usar el retardo para abrir el navegador alternativo, y así ver si funciona:

gestionar-urls-segun-con-el-navegador-por-gpo-7

Habilitamos “Habilitar la función de compatibilidad con navegadores antiguos”

gestionar-urls-segun-con-el-navegador-por-gpo-8

Se genera una GPO con la lista de URLs que deben abrirse con Chrome:

gestionar-urls-segun-con-el-navegador-por-gpo-9

Habilitamos la política de SiteList de Internet Explorer:

gestionar-urls-segun-con-el-navegador-por-gpo-10

A nivel de GPOs de Internet Explorer modificaremos también Activar modo protegido para la zona que sean las URLs:

gestionar-urls-segun-con-el-navegador-por-gpo-11

Y cambiamos la política de Denegar complementos a menos que se permitan específicamente:

gestionar-urls-segun-con-el-navegador-por-gpo-14

Hacemos un:

gpupdate /force

Así se actualizarán las políticas.

Si queremos ver si se aplica podemos usar el menú de administración:

ADMINISTRACION LOCAL

chrome://browser-switch/internals

gestionar-urls-segun-con-el-navegador-por-gpo-14

Una vez habilitada:

gestionar-urls-segun-con-el-navegador-por-gpo-14

Es posible que en el navegador Internet Explorer nos dé el siguiente mensaje:

gestionar-urls-segun-con-el-navegador-por-gpo-16

Se ha cargado el complemento al instalarlo en el sistema:

gestionar-urls-segun-con-el-navegador-por-gpo-16

Si abrimos Google Chrome y escribimos la URL que de la lista que nos interesa, si todo va bien redirecciona:

gestionar-urls-segun-con-el-navegador-por-gpo-17

Este es el resultado, se abre Internet Explorer aunque hayamos usado Chrome:

Como veis, se genera otro Popup:

gestionar-urls-segun-con-el-navegador-por-gpo-19

Habría que habilitar el complemento de Legacy Browser Support para Internet Explorer.

El ID lo podéis sacar como os expliqué aquí:

https://www.maquinasvirtuales.eu/deshabilitar-complemento-internet-explorer-por-gpo/

{08B5789A-BD8E-4DAE-85DF-EF792C658B86}

Computer Configuration\Policies\Administrative Templates\Windows Components\Internet Explorer\Security Features\Add-on Management

User Configuration\Policies\Administrative Templates\Windows Components\Internet Explorer\Security Features\Add-on Management

0 - The add-on is disabled, and users cannot manage the add-on from the user interface.
1 - The add-on is enabled, and users cannot manage the add-on from the user interface.
2 - The add-on is enabled, and users can manage the add-on from the user interface.

gestionar-urls-segun-con-el-navegador-por-gpo-20

Es una forma interesante de arreglar problemas de incompatibilidad con aplicaciones Web obsoletas.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Gestionar URLs según con el navegador por GPO se publicó primero en Blog Virtualizacion.

Powershell: Buscar setting especifica de GPO

$
0
0

Powershell: Buscar setting especifica de GPO

Os explicamos como buscar una setting entre todas las GPOs de Directorio Activo.

Si gestionáis entornos grandes o clientes en los que no tenéis mucho control, cuando vais a revisar el Directorio Activo para aplicar algo que puede afectar a muchos usuarios, es necesario hacer una revisión detallada de todas las GPOs que componen nuestro sistema.

Esto puede ser un trabajo tedioso, y siempre puedes tener un fallo. Con lo que, cuanto más automatizadas tengamos estas tareas, será más fácil que nuestro trabajo llegue a buen puerto.

Para ello os voy a dejar un script de Powershell, que os facilitará esto.

Lo primero seleccionamos la Setting que queremos buscar. En mi caso, usaré “Enable search roaming”, que es una GPO de FSLogix:

powershell-buscar-setting-especifica-de-gpo-1

Lanzamos el script, en el DC, por ejemplo:

https://gist.github.com/raulunzue/bb5bae558f6fcf6e55af9d7ab54307e8

#################################
## Raúl Unzué - El Blog de Negu
## Script buscar Setting GPO
#################################

## NOMBRE DE LA SETTING
$Setting = "Enable search roaming"
## NOMBRE DEL DOMINIO
$Dominio = "negu.local"
## NOMBRE DEL CONTROLADOR
$NeguDC = (Get-ADDomainController -Discover -NextClosestSite).Name

# OBTENER TODA LA LISTA DE GPOS DEL DIRECTORIO ACTIVO
$GPOs = Get-GPO -All -Domain $Dominio -Server $NeguDC | sort DisplayName

# BUSCAMOS LA SETTING EN LAS GPOS LISTADAS
Foreach ($GPO in $GPOs)  {
  
  Write-Host "Revisando GPO - $($GPO.DisplayName)"
  
  # EXTRAEMOS UN REPORT
  $CurrentGPOReport = Get-GPOReport -Guid $GPO.Id -ReportType Xml -Domain $Dominio -Server $NeguDC
  
  If ($CurrentGPOReport -match $Setting)  {
	Write-Host "Setting ""$($Setting)"" detectada. Datos de la setting:" -Foregroundcolor Red
	Write-Host "-  GPO Nombre: $($GPO.DisplayName)" -Foregroundcolor Green
	Write-Host "-  GPO Id: $($GPO.Id)" -Foregroundcolor Green
	Write-Host "-  GPO Estado: $($GPO.GpoStatus)" -Foregroundcolor Green
  }
  
}

El resultado sería algo así:

powershell-buscar-setting-especifica-de-gpo-2

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Buscar setting especifica de GPO se publicó primero en Blog Virtualizacion.


CD-CI: Instalar Jenkins en Centos LXC

$
0
0

CD-CI: Instalar Jenkins en Centos LXC

Hoy os vamos a explicar como instalar Jenkins en un contenedor LXC Centos de Proxmox.

Antes de hacerlo vamos a hablar de CD/CI y de Jenkins.

¿Qué es CD/CI?

Por una parte, CD/CI, es un método que se centra en los ciclos de vida definidos para todo software, usando como base las herramientas de automatización. Permite gestionar todas las etapas de la implementación del software, desde las pruebas hasta la distribución e implementación.

  • CI se definiría como Continuos Integration o Integración Continua:
    • La “CI” en CI/CD siempre se refiere a la integración continua, que es un proceso de automatización para los desarrolladores. Si la CI tiene éxito, los cambios del código nuevo en una aplicación se diseñan, se prueban y se combinan periódicamente en un repositorio compartido. Esto soluciona el problema de que se desarrollen demasiadas versiones de una aplicación al mismo tiempo, porque podrían entrar en conflicto entre sí.
  • CD se definiría como Continuos Delivery o Entrega Continua:
    • La “CD” en CI/CD se refiere a la distribución o la implementación continua, los cuales son conceptos relacionados que suelen usarse indistintamente. Ambos conceptos se refieren a la automatización de las etapas posteriores del canal, pero a veces se usan por separado para explicar la cantidad de automatización que se está incorporando.

cd-ci-instalar-jenkins-en-centos-lxc-0

¿Qué es Jenkins?

Por otra parte, Jenkins es un servidor de automatización Open Source creado en Java. Mediante plugins, es capaz de conectar con diferentes plataformas de desarrollo como Git, Subversion,…que permite extender sus funcionalidades.

Lo que conseguimos es integrar en una máquina, un motor para automatizar las tareas en gran parte del flujo de trabajo de un proyecto, por lo que resulta especialmente útil en los equipos técnicos que quieren agilizar las tareas de desarrollo de cara a los procesos de integración continua.

Tareas que podremos hacer a través de Jenkins:

  • Tests de diferente software
  • Trabajar con métricas de calidad del software para validarlo
  • Validar y enviar modificaciones al repositorio principal
  • Automatizar la compilación o despliegue del software
  • Notificar al equipo de desarrollo ante errores en las validaciones
  • Generar o visualizar la documentación de un proyecto

Instalación Jenkins en Centos LXC

Como hemos explicado brevemente en qué consiste CD/CI y Jenkins, vamos a instalar sobre un contenedor LXC de Proxmox el motor de automatización Jenkins.

Pre-requisitos Jenkins

Mínimo hardware requerido:

  • 256 MB de RAM
  • 1 GB de disco (instalado en Docker, aunque 10GB mínimo es lo recomendado)

Recomendado para un equipo pequeño de desarrollo:

  • 1 GB+ de RAM
  • 50 GB+ de disco

Software requirimiento:

  • Java
  • Navegador web

Instalar Jenkins

Le daré 2vCPUs, 2GB RAM y 50GB de disco.

Los comandos de instalación serían:

[root@JENKINS ~]# wget -O /etc/yum.repos.d/jenkins.repo https://pkg.jenkins.io/redhat-stable/jenkins.repo
--2020-10-26 21:35:51--  https://pkg.jenkins.io/redhat-stable/jenkins.repo
Resolving pkg.jenkins.io (pkg.jenkins.io)... 151.101.2.133, 151.101.66.133, 151.101.130.133, ...
Connecting to pkg.jenkins.io (pkg.jenkins.io)|151.101.2.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 85
Saving to: '/etc/yum.repos.d/jenkins.repo'

100%[==============================================================>] 85          --.-K/s   in 0s      

2020-10-26 21:35:51 (8.84 MB/s) - '/etc/yum.repos.d/jenkins.repo' saved [85/85]

[root@JENKINS ~]# rpm --import https://pkg.jenkins.io/redhat-stable/jenkins.io.key

[root@JENKINS ~]# yum upgrade

[root@JENKINS ~]# yum install jenkins java-1.8.0-openjdk-devel

[root@JENKINS ~]# systemctl daemon-reload


cd-ci-instalar-jenkins-en-centos-lxc-1

Una vez instalado, habilitamos el servicio:

[root@JENKINS ~]# systemctl start jenkins
[root@JENKINS ~]# systemctl status jenkins
● jenkins.service - LSB: Jenkins Automation Server
   Loaded: loaded (/etc/rc.d/init.d/jenkins; bad; vendor preset: disabled)
   Active: active (running) since Mon 2020-10-26 21:47:12 UTC; 5s ago
     Docs: man:systemd-sysv-generator(8)
  Process: 2818 ExecStart=/etc/rc.d/init.d/jenkins start (code=exited, status=0/SUCCESS)
   CGroup: /system.slice/jenkins.service
           └─2840 /etc/alternatives/java -Dcom.sun.akuma.Daemon=daemonized -Djava.awt.headless=true -...

Oct 26 21:47:11 JENKINS systemd[1]: Starting LSB: Jenkins Automation Server...
Oct 26 21:47:11 JENKINS runuser[2824]: pam_unix(runuser:session): session opened for user jenkins...d=0)
Oct 26 21:47:12 JENKINS runuser[2824]: pam_unix(runuser:session): session closed for user jenkins
Oct 26 21:47:12 JENKINS jenkins[2818]: Starting Jenkins [  OK  ]
Oct 26 21:47:12 JENKINS systemd[1]: Started LSB: Jenkins Automation Server.
Hint: Some lines were ellipsized, use -l to show in full.

Habilitamos para que auto-arranque:

[root@JENKINS ~]# systemctl enable jenkins
jenkins.service is not a native service, redirecting to /sbin/chkconfig.
Executing /sbin/chkconfig jenkins on

Una vez arrancado, el puerto por defecto es el 8080. Iremos a la URL en ese puerto. Nos dice el mensaje que introduzcamos la contraseña que se encuentra en un fichero que tenemos que consultar:

cd-ci-instalar-jenkins-en-centos-lxc-2

Lo listamos:

[root@JENKINS ~]# cat /var/lib/jenkins/secrets/initialAdminPassword
46868955dee64049941876db26941080

Nos permitirá una vez introducida instalar plugins:

cd-ci-instalar-jenkins-en-centos-lxc-3

Instalo los sugeridos:

cd-ci-instalar-jenkins-en-centos-lxc-4

Y generamos un administrador para la plataforma:

cd-ci-instalar-jenkins-en-centos-lxc-5

Y ya tenemos acceso…seguiremos investigando:

cd-ci-instalar-jenkins-en-centos-lxc-6

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada CD-CI: Instalar Jenkins en Centos LXC se publicó primero en Blog Virtualizacion.

Ansible: Instalación servidores web

$
0
0

Ansible: Instalación servidores web

Hoy os vamos a enseñar como configurar un servidor web a través de Ansible. En mi caso lo voy a hacer con contenedores LXC de Proxmox. Y aunque en el ejemplo lo haremos sobre solo servidor, podéis hacerlo por un número infinito a la vez.

Lo primero de todo es copiar la clave de nuestro servidor de Ansible en los servers:

[root@TERRAFORM ansible]# ssh-copy-id -i /root/.ssh/id_rsa SERVIDORWEB

[root@TERRAFORM ansible]# ssh-copy-id -i /root/.ssh/id_rsa 192.168.2.36
/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"
The authenticity of host '192.168.2.36 (192.168.2.36)' can't be established.
ECDSA key fingerprint is SHA256:DO2qpRPr6dClF8bMuMUDXMe0sRDxYCKtCp7kTvgQRR8.
ECDSA key fingerprint is MD5:38:06:f4:17:69:ef:e2:51:5d:0d:81:0c:40:35:3c:2c.
Are you sure you want to continue connecting (yes/no)? yes
/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed
/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

root@192.168.2.36's password: 

Number of key(s) added: 1

Now try logging into the machine, with:   "ssh '192.168.2.36'"
and check to make sure that only the key(s) you wanted were added.

Crearemos un inventario con nuestros servidores:

[root@TERRAFORM ansible]# cd /etc/ansible/inventory/
[root@TERRAFORM inventory]# vi web
[web]
nginx ansible_ssh_host=192.168.2.36

Crearemos un Playbook:

[root@TERRAFORM ansible]# cd /etc/ansible/playbooks/
[root@TERRAFORM playbooks]# vi nginx.yml 
---
- name: Este Playbook instala nginx
  hosts: web
  tasks:
    - name: Esta tarea instala nginx
      yum:
        name: nginx
        state: latest

Y lanzamos la ejecución:

[root@TERRAFORM ansible]# ansible-playbook playbooks/nginx.yml -i inventory/web 

PLAY [Este Playbook instala nginx] ***********************************************************************

TASK [Gathering Facts] ***********************************************************************************
ok: [nginx]

TASK [Esta tarea instala nginx] **************************************************************************
changed: [nginx]

PLAY RECAP ***********************************************************************************************
nginx                      : ok=2    changed=1    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

Podemos comprobar si existe el paquete de la forma tradicional:

ansible-instalacion-servidores-web-2

Si vamos a la URL:

ansible-instalacion-servidores-web-3

Si volvemos a lanzarlo, nos validará que lo hemos instalado y no es necesario instalar nginx:

ansible-instalacion-servidores-web-4

Configurar página estática personalizada Nginx con Ansible

Ahora os voy a mostrar un ejemplo más avanzado. Generamos un fichero index.html:

<header>
 <h1>Hello World. Probando una app nginx con Ansible. ¡ElBlogDeNegu!</h1>
</header>

Personalizamos nuestro Playbook:

[root@TERRAFORM ansible]# vi playbooks/nginx-avanzado.yml

#nginx-avanzado.yml
---
 - hosts: web
   user: root
   tasks:
    - name: Añadir epel-repo
      yum:
       name: epel-release
       state: present

    - name: Instalar Nginx
      yum:
       name: nginx
       state: present

    - name: Añadir fichero index.html
      template:
       src: /etc/ansible/index.html
       dest: /usr/share/nginx/html/index.html
    #SI CONFIGURAIS FWs
    #- name: Acceso a través del puerto TCP 80
    #  firewalld:
    #   port: 80/tcp
    #   zone: public
    #   state: enabled

    - name: Arrancar Nginx
      service:
       name: nginx
       state: started

Lo lanzamos:

ansible-instalacion-servidores-web-5

Y volvemos a la URL:

ansible-instalacion-servidores-web-6

Ni que decir tiene, que podéis desplegar una web entera en varios nodos con un sólo clic. Seguiremos jugando con automatizaciones.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Instalación servidores web se publicó primero en Blog Virtualizacion.

Proxmox: Habilitar SSH en LXC Centos

$
0
0

Proxmox: Habilitar SSH en LXC Centos

Hoy entrada rápida y básica..

Cuando utilizáis las imágenes de Proxmox, para generar un container LXC de Centos, el servidor SSH no viene instalado.
Para poder usar las imágenes con SSH, usaremos los siguientes comandos:

INSTALACION SERVER SSH EN LXC

[root@NGINX01 ~]# yum install openssh-server -y

ARRANCAR SERVER SSH EN LXC

[root@NGINX01 ~]# systemctl start sshd.service

HABILITAR SERVER SSH EN LXC

[root@NGINX01 ~]# systemctl enable sshd.service

ESTADO SERVER SSH EN LXC

[root@NGINX01 ~]# systemctl status sshd.service
● sshd.service - OpenSSH server daemon
   Loaded: loaded (/usr/lib/systemd/system/sshd.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2020-10-30 21:25:24 UTC; 22s ago
     Docs: man:sshd(8)
           man:sshd_config(5)
 Main PID: 470 (sshd)
   CGroup: /system.slice/sshd.service
           └─470 /usr/sbin/sshd -D

Oct 30 21:25:24 NGINX01 systemd[1]: Starting OpenSSH server daemon...
Oct 30 21:25:24 NGINX01 sshd[470]: Server listening on 0.0.0.0 port 22.
Oct 30 21:25:24 NGINX01 sshd[470]: Server listening on :: port 22.
Oct 30 21:25:24 NGINX01 systemd[1]: Started OpenSSH server daemon.
 

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Proxmox: Habilitar SSH en LXC Centos se publicó primero en Blog Virtualizacion.

Powershell: Listar consumo de aplicación

$
0
0

Powershell: Listar consumo de aplicación

Os dejo un script con los comandos para poder ver controlar lo que consume una aplicación en ciertos servidores.

Lo podemos hacer localmente o remotamente, pasando una lista de servers al script. Es necesario que WinRM esté habilitado en los servidores para conectarnos a ellos, o lanzar el script de una máquina que tenga acceso.

SCRIPT POWERSHELL CONSUMO APLICACION EN LOCAL

Si queremos realizar una prueba sobre un simple server y nos podemos conectar a él, o en nuestra propia máquina lo haríamos de la siguiente forma:

$dia=get-date -Format "dd-MM-yyyy"
$hora=Get-Date -Format "HH:mm:ss"
$processname= 'lync'
$r = get-process -Name $processname -IncludeUserName | Select-Object Name,Username,CPU,WorkingSet,PrivateMemorySize
$resultado = $r | Format-Table Name,Username,@{l="CPU)"; e={$_.cpu / 1024}},@{l="Private Memory (MB)"; e={$_.privatememorysize / 1mb}},@{l="Working Set (MB)"; e={$_.WorkingSet / 1mb}} -AutoSize
$resultado >> C:\Users\runzue\Documents\SCRIPTS\lync.txt
$s = Get-WmiObject Win32_PerfRawData_PerfProc_Process -filter "Name <> '_Total' and Name <> 'Idle'" | Sort PercentProcessorTime -descending | Select -first 5 Name,@{Name="PercentProcessorTime";Expression={($_.PercentProcessorTime/100000/100)/60}},IDProcess,PSComputername | Where-Object { $processname -contains $_.Name}
$resultado2 = $s | Format-Table Name, @{n='Mem (MB)';e={'{0:N0}' -f (($_.Group|Measure-Object WorkingSet -Sum).Sum / 1MB)};a='right'} -AutoSize
$resultado2 >> C:\Users\runzue\Documents\SCRIPTS\lync.txt
Get-Content -Path C:\Users\runzue\Documents\SCRIPTS\lync.txt

powershell-listar-consumo-de-aplicacion-1

SCRIPT POWERSHELL CONSUMO APLICACION EN REMOTO

Si por el contrario, lo tenemos que hacer sobre una lista de servidores:

GITHUB: https://gist.github.com/raulunzue/b385090313a6bc19d1b36e8eaa2ed751

#########################
## RAUL UNZUE - 31102020
## CONSUMO APP - ELBLOGDENEGU
#########################
## LISTA DE SERVIDORES
    $listaservers= (Get-Content C:\Users\runzue\Documents\SCRIPTS\servers.txt)
## CREDENCIALES DE CONEXION
    $passwd = convertto-securestring -AsPlainText -Force -String "NUESTRAPASSWORD"
    $cred = new-object -typename System.Management.Automation.PSCredential -argumentlist ('DOMINIO\USUARIO',$passwd)
## CONEXION A SERVIDORES
foreach ($servidor in $listaservers) {
    $dia=get-date -Format "dd-MM-yyyy"
    $hora=Get-Date -Format "HH:mm:ss"
    $processname= 'lync'
    $r = Invoke-Command -ComputerName $servidor -Credential $cred -ScriptBlock {get-process -Name $processname -IncludeUserName | Select-Object Name,Username,CPU,WorkingSet,PrivateMemorySize}
    $s = Invoke-Command -ComputerName $servidor -Credential $cred -ScriptBlock {Get-WmiObject Win32_PerfRawData_PerfProc_Process -filter "Name <> '_Total' and Name <> 'Idle'" | Sort PercentProcessorTime -descending | Select -first 5 Name,@{Name="PercentProcessorTime";Expression={($_.PercentProcessorTime/100000/100)/60}},IDProcess,PSComputername | Where-Object { $processname -contains $_.Name}}
    if ($r -eq $null)
    {
    Write-Output "$dia - $hora - $servidor - Buscando procesos APP Lync" >> C:\Users\runzue\Documents\PROYECTOS\SCRIPTS\lync.txt
    Write-Output  "No podemos conectar con $servidor" >> C:\Users\runzue\Documents\SCRIPTS\lync.txt
    }
    else 
    {
    Write-Output "$dia - $hora - $servidor - Buscando procesos APP Lync" >> C:\Users\runzue\Documents\SCRIPTS\lync.txt
    $resultado = $r | Format-Table Name,Username,@{l="CPU"; e={$_.cpu / 1024}},@{l="Private Memory (MB)"; e={$_.privatememorysize / 1mb}},@{l="Working Set (MB)"; e={$_.WorkingSet / 1mb}} -AutoSize
    $resultado2 = $s | Format-Table Name, @{n='Mem (MB)';e={'{0:N0}' -f (($_.Group|Measure-Object WorkingSet -Sum).Sum / 1MB)};a='right'} -AutoSize
    Write-Output "APP Lync POR USUARIO" >> C:\Users\runzue\Documents\PROYECTOS\SCRIPTS\lync.txt
    $resultado >> C:\Users\runzue\Documents\SCRIPTS\lync.txt
    Write-Output "APP Lync POR SERVIDOR" >> C:\Users\runzue\Documents\PROYECTOS\SCRIPTS\lync.txt
    $resultado2 >> C:\Users\runzue\Documents\SCRIPTS\lync.txt
    }
}
Get-Content -Path C:\Users\runzue\Documents\SCRIPTS\lync.txt

 

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Powershell: Listar consumo de aplicación se publicó primero en Blog Virtualizacion.

Ansible: Crear página web WordPress

$
0
0

Ansible: Crear página web WordPress

Hoy vamos a generar una página web con Ansible, basada en WordPress.

La idea es que tengamos el servidor de mysql y apache en el mismo servidor. Voy a preparar la máquina con los repos necesarios. Os dejo como hacerlo con Ansible:

Agregar repo: https://docs.ansible.com/ansible/latest/collections/ansible/builtin/yum_repository_module.html

Necesitaremos ciertas versiones php para WordPress trabaje:

wget https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

rpm -Uvh mysql80-community-release-el7-3.noarch.rpm

yum install https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
yum install http://rpms.remirepo.net/enterprise/remi-release-7.rpm

yum install yum-utils
yum-config-manager --enable remi-php56 

yum-config-manager --enable remi-php56

Lo primero que haremos en crear el fichero host con la máquina virtual que usaremos:

[root@TERRAFORM ansible]# nano inventory/wordpress
[wordpress]
nginx ansible_ssh_host=192.168.2.36

Fichero de instalación en Ansible:

https://gist.github.com/raulunzue/wordpress-ansible.yml

[root@TERRAFORM ansible]# nano playbooks/wordpress-ansible.yml

---
# Entrada El Blog de Negu: https://www.maquinasvirtuales.eu/ansible-crear-pagina-web-wordpress/ 
- name: Ansible Wordpress
  hosts: wordpress
  become: yes
  vars:
   wp_mysql_db: wordpress
   wp_mysql_user: wp-admin
   wp_mysql_password: elblogdenegu
   wp_mysql_host: "{{ansible_default_ipv4.address}}"
  tasks:
  - name: Instalacion LAMP Stack
    yum: name={{ item }} state=present
    with_items:
     - httpd
     - mysql-server
     - php56
     - php-mysqlnd
     - MySQL-python
  - name: Borrar pagina de bienvenida en httpd
    file:
      path: "/etc/httpd/conf.d/welcome.conf"
      state: absent
  - name: Descarga de Wordpress
    unarchive:
      src: http://www.wordpress.org/latest.tar.gz
      dest: /var/www/html/
      remote_src: yes
  - name: Renombrar fichero de configuracion de ejemplo
    command: "mv /var/www/html/wordpress/wp-config-sample.php /var/www/html/wordpress/wp-config.php"
  - name: Modificamos valores fichero wp-config.php
    lineinfile: dest=/var/www/html/wordpress/wp-config.php regexp={{ item.regexp }} line={{ item.line }}
    with_items:
      - {'regexp': "define\\( 'DB_NAME', '(database_name_here)+' \\);", 'line': "define('DB_NAME', '{{wp_mysql_db}}');"}
      - {'regexp': "define\\( 'DB_USER', '(username_here)+' \\);", 'line': "define('DB_USER', '{{wp_mysql_user}}');"}
      - {'regexp': "define\\( 'DB_PASSWORD', '(password_here)+' \\);", 'line': "define('DB_PASSWORD', '{{wp_mysql_password}}');"}
      - {'regexp': "define\\( 'DB_HOST', '(localhost)+' \\);", 'line': "define('DB_HOST', '{{wp_mysql_host}}');"}
  - name: Actualizamos configuracion Apache
    lineinfile:
     dest=/etc/httpd/conf/httpd.conf
     line="DocumentRoot /var/www/html/wordpress"
  - name: Arrancamos mysql
    service:
     name: mysqld
     state: started
  - name: Creamos la base de datos
    mysql_db:
      name: "{{wp_mysql_db}}"
      login_unix_socket: /run/mysqld/mysqld.sock
      state: present
  - name: Creamos usuario de gestión BD
    mysql_user:
      name: "{{wp_mysql_user}}"
      password: "{{wp_mysql_password}}"
      host: '%'
      priv: '*.*:ALL'
      state: present
  - name: Arrancamos httpd y mysql
    service: name={{ item }} state=restarted
    with_items:
     - httpd
     - mysqld
...

Lo ejecutamos:

[root@TERRAFORM ansible]# ansible-playbook playbooks/wordpress-ansible.yml -i inventory/wordpress

ansible-crear-pagina-web-wordpress-1

Una vez finalice tendremos acceso a nuestro WordPress.

¿Te ha gustado la entrada SÍGUENOS EN TWITTER?

La entrada Ansible: Crear página web WordPress se publicó primero en Blog Virtualizacion.

Viewing all 681 articles
Browse latest View live