Abr 04 2021

Desinstalar Microsoft Exchange 2010

Published by under Exchange,Mensajería

El desinstalador de Exchange 2010 devuelve errores a menos que siga los diversos puntos a continuación.
Advertencia: ¡esto eliminará sus buzones de correo, contactos, etc … alojados en Exchange! ¡No hay vuelta atrás!
Suponemos que este es el último servidor de Exchange. De lo contrario, sea más específico sobre los buzones de correo que desea eliminar, especificando -Database por ejemplo, o -server para los conectores.

¡Eliminación de buzones de correo de usuario pero no de cuentas de AD!

Get-mailbox | disable-mailbox


Eliminación de buzones de correo de arbitraje

Get-Mailbox -Arbitration | Disable-Mailbox -Arbitration -DisableLastArbitrationMailboxAllowed


Eliminar el directorio sin conexión

Get-OfflineAddressBook | Remove-OfflineAddressBook


Eliminar conectores

Get-SendConnector | Remove-SendConnector


Y finalmente la carpeta pública. Esto requiere un poco más de esfuerzo ya que Exchange debe tener al menos una base de carpetas públicas.
Se puede eliminar con ADSIEdit

Eliminación de carpetas públicas de Exchange con ADSIEdit


Ejecute ADSIedit
Haga clic derecho en Conexión…
En «Seleccione un contexto de nomenclatura conocido:» Seleccione «Configuración»

Luego navega a:

CN=Configuration,DC=DOMAIN,DC=LOCAL
CN=Services
CN=Microsoft Exchange
CN=EXCHANGE_ORG
CN=Administrative Groups
CN=Exchange Administrative Group (FYDIBOHF23SPDLT)
CN=Databases
CN=PUBLIC_FOLDER_DATABASE


Ahora puede eliminar la base de datos de carpetas públicas y desinstalar Exchange 2010.

 

No responses yet

Abr 01 2021

Inventario dinámico Ansible de Servidores IBM Cloud

Published by under Ansible,Python

IBM Cloud se basa en la API Softlayer – también conocida como IBM Classic Infrastructure – para automatizar acciones. La API está disponible en diferentes lenguajes como Python, Go, Java o PHP.
Voy a generar un inventario dinámico de los servidores recuperados de mi cuenta de IBM Cloud directamente utilizables por Ansible.


Generaré grupos correspondientes a los datacenters. También le gustaría agrupar servidores en todo tipo de categorías como bases de datos, Mysql, Linux, Web, etc… No se preocupe, también podemos hacer esto de una forma muy sencilla.
Esto se puede lograr agregando etiquetas a los hosts en IBM Cloud portal y obviamente, un host puede tener varias etiquetas y pertenecer a los grupos de Ansible correspondientes a estas etiquetas / tags.

Una vez que estos grupos han sido declarados en el archivo inventory, puede ejecutar playbooks de Ansible como instalar paquetes de Apache en servidores que pertenecen al grupo «Web» por ejemplo.


Primero debe agregar su API key en un archivo de shell para ejecutar antes del script. Podría ser parte del script, pero permite que cada usuario use su propia clave.

export SL_USERNAME=nombre_usuario
export SL_API_KEY=a1b2c3[...]3456


Ejecute . ./IBM_SL_env.sh primero para agregar el nombre de usuario y la clave de API en las variables de entorno que leerá el script de Python a continuación.

#!/usr/bin/env python3  
import os
import SoftLayer
 
HOST_VARS_DIR  = "host_vars"
INVENTORY_FILE = "inventory"
 
class Inventory:
   def __init__(self):
      # Variables
      self.categories = {}
      self.datacenter = {}
      self.servers = {}
 
      # Create Softlayer connection
      self.client = SoftLayer.create_client_from_env()
 
      # Init Methods
      self.get_server_list()
      self.write_inventory()
 

   def short_host_name(self, host):
      return host['fullyQualifiedDomainName'][:host['fullyQualifiedDomainName'].find('.mydomain.')]
 

   def add_host_to_cat(self, host, cat):
      if cat == "ibm-kubernetes-service": cat = "kube"
      if cat not in self.categories:
         self.categories[cat] = [host]
      else:
         self.categories[cat].append(host)
 

   def add_server_to_list(self, host):
      try:
         host["primaryBackendIpAddress"]
      except KeyError:
         pass
      else:
         host["ShortHostname"] = self.short_host_name(host)
             
         # Build server Categories list
         if host["tagReferences"] != []:
            for tagRef in host["tagReferences"]:
               self.add_host_to_cat(host["ShortHostname"], tagRef["tag"]["name"].strip())
             
         # Build datacenter lists
         if host["datacenter"]["name"] not in self.datacenter:
            self.datacenter[host["datacenter"]["name"]] = [host["ShortHostname"]]
         else:
            self.datacenter[host["datacenter"]["name"]].append(host["ShortHostname"])
             
         # Build server attribute list
         serverAttributes = {}
         serverAttributes['IP'] = host["primaryBackendIpAddress"]
         self.servers[host["ShortHostname"]] = serverAttributes
     

   def get_server_list(self):
      object_mask = "mask[id,fullyQualifiedDomainName," \
                    "primaryBackendIpAddress," \
                    "tagReferences[tag[name]]," \
                    "datacenter]"
 
      # Get virtual server list
      mgr = SoftLayer.VSManager(self.client)
      for vs in mgr.list_instances(mask=object_mask):
         self.add_server_to_list(vs)
 
      # Get bare metal servers
      hsl = SoftLayer.HardwareManager(self.client)
      for hs in hsl.list_hardware(mask=object_mask):
         self.add_server_to_list(hs)
 

   def write_inventory(self):
      # host_vars structure
      if not os.path.exists(HOST_VARS_DIR):
         os.makedirs(HOST_VARS_DIR)
 
      inventoryFile = open(INVENTORY_FILE,"w")
 
      for cat in self.categories.keys():
         if cat != "kube":
            inventoryFile.write("[" + cat + "]\n")
            for host in self.categories[cat]:
               # write host vars
               inventoryFile.write(host + "\n")
               file = open(HOST_VARS_DIR+"/"+host,"w")
               file.write("ansible_host: " + self.servers[host]['IP'] + "\n")
               file.close()        
            inventoryFile.write("\n")
      for dc in self.datacenter.keys():
         inventoryFile.write("[" + dc + "]\n")
         for host in self.datacenter[dc]:
            if not host.startswith("kube"):
               inventoryFile.write(host + "\n")
         inventoryFile.write("\n")
      inventoryFile.close()

if __name__ == "__main__":
   exit(Inventory())


Algunas notas:

Los nodos de Kubernetes administrado son visibles en la infraestructura clásica de IBM Cloud como cualquier VM (VSI en terminología de IBM) pero no puede conectarse a ellos. Por lo tanto, se agregan a la categoría «Kube» antes de ser ignorados.


Se crea un archivo separado en hosts_var para cada servidor, que contiene su dirección IP. Puede agregar otras variables como parámetros iSCSI, etc…


El script recupera máquinas virtuales en el inventario Ansible, así como máquinas físicas (bare metal). Es posible comentar cualquiera de estas secciones si no es necesario, guardando una llamada a IBM.

 

No responses yet

Mar 27 2021

Diagramas de Gantt por Horas

Published by under Diverso

Quería mostrar los tiempos de ejecución de tareas de un plan de recuperación en un desastre en un diagrama de Gantt para que se vea mejor que una aburrida lista de horas de inicio y finalización, pero no encontré ninguna herramienta que gestione las horas de un día / 24 horas.

Los softs de Gantt ofrecen demasiadas funciones que no necesito para un informe simple. Así que opté por la función Sparkline en Google Sheets: es gratis y sigue siendo bastante fácil incluso si tienes que trabajar un poco para que funcione con horas. También está disponible en Excel, por supuesto.

¿Qué es Sparkline? En resumen, Sparkline es un gráfico en una celda de Excel (o equivalente como Google Sheets) destinado a dar una tendencia. Los gráficos de barras son excelentes para los diagramas de Gantt.

Diagrama de Gantt por Horas en Google Sheets


No hay mínimo, y el máximo solo funciona para números en gráficos de barras, es por eso que creé 2 columnas Start Delay y Duration en minutos. Fórmulas básicas sobre las horas de inicio y finalización del proyecto y las tareas permiten completarlas automáticamente.

=HORA(D5-$D$3)*60+MINUTO(D5-$D$3); Start delay
=HORA(E5-D5)*60+MINUTO(E5-D5); Duration


Las celdas Sparkline se crean a partir de estos 2 valores; La primera barra es blanca para colocar la barra de color en el lugar correcto. El valor máximo es simplemente la duración del proyecto..

=SPARKLINE(F5:G5,{"charttype","bar"\"color1","white"\"color2","#199698"\"max",$G$3})
 

2 responses so far

Mar 23 2021

Impresión AS400 a la Impresora de Red Windows

Published by under AS400

IBM i puede comunicarse con impresoras de red Windows usando el protocolo LDP. Es una solución mucho mejor que la sesión de impresora de client access, ya que se basa en una impresora de red simple y un servicio de Windows. No es necesario iniciar una sesión manualmente.


En Windows

En el servidor Windows, abre el administrador de la computadora, agregue la función del servidor de impresión y seleccione el servicio LPD. Esto debería estar activo después del reinicio.

Servicio LPD en Windows


Después del reinicio, agregue una impresora, instale los controladores correctos y comparte la impresora en las Propiedades. Asegúrese de que la página de prueba se imprima correctamente.


En AS400

IBM recomienda crear una OUTQ remota pero no es ideal para algunas aplicaciones que necesitan imprimir en un device. Por lo tanto, optaré por una impresora virtual acoplada a una OUTQ remota. Esto se hace en 2 pasos.

Creando una impresora virtual:

CRTDEVPRT DEVD(MYPRINTER) DEVCLS(*VRT) TYPE(3812) MODEL(1) ONLINE(*NO) FONT(11)


Ajuste de los parámetros de la OUTQ correspondiente:

CHGOUTQ OUTQ(QUSRSYS/MYPRINTER) RMTSYS(*INTNETADR) RMTPRTQ('share')
AUTOSTRWTR(1) CNNTYPE(*IP) DESTTYPE(*OTHER) TRANSFORM(*YES) 
MFRTYPMDL(*WSCST) WSCST(QSYS/QWPDEFAULT) INTNETADR('XXX.XXX.XXX.XXX')


El uso compartido de impresoras de Windows puede ser una solución si su impresora no es compatible con AS400 / IBM i y tiene controladores de Windows.

 

No responses yet

Mar 22 2021

Migrar Perfiles RDS a Otro Disco / Volumen

Published by under Windows

Acaba de recuperar un servidor donde está instalada la función de Servicios de escritorio remoto (RDS) y desafortunadamente, disco C: comienza a quedarse sin espacio, los perfiles RDS se creando en este mismo volumen.
Se cae bien, se queda un gran espacio en la unidad D: ¿Pero cómo lo hacemos?

Configurar la ruta para nuevos perfiles

Podemos hacer un GPO que crea los nuevos perfiles en D: así:

-> Computer Configuration
-> Administrative Templates
-> Windows Components
-> Remote Desktop Services
-> Remote Desktop Session Host
-> Profiles
-> Set path for Remote Desktop Services Roaming Profiles

Ruta de los perfiles RDS


Funciona para perfiles nuevos pero tienes que migrar los antiguos.

Migrar perfiles RDS existentes


– Migrar la carpeta de usuario de C: a la nueva unidad y otorgarle los derechos correctos

– Eliminar la entrada
-> Panel de control
-> Cuentas de usuario
-> Configurar propiedades avanzadas de perfiles de usuario.

Si los perfiles antiguos se conectan con un perfil temporal, también debe:
– Eliminar la entrada en el registro HKLM\Software\Microsoft\Windows NT\CurrentVerison\ProfileList\S-1-5-21… con una clave ProfileImagePath correspondiente a la ruta del perfil del usuario
Ventaja: todos los perfiles nuevos estarán en esta nueva ubicación

o

Cambiar la ruta en la clave de registro anterior, mover el directorio y otorgar los derechos al usuario.
Los nuevos perfiles siempre se crearán en C: pero puede migrar los antiguos a D: como desee y distribuir los datos entre los 2 volúmenes.

Lo mejor es, obviamente, definir un GPO desde el principio en un volumen dedicado que no sea C:, de lo contrario, tendrá que migrar los perfiles RDS.

 

No responses yet

« Prev - Next »