Escribir es un arte, pero leer debe ser un gusto…

Hoy es martes, en la capital ha venido lloviendo a diario, asi que los dias han estado frios ultimamente, no provoca levantarse temprano, ni empezar la jornada sin tomarse una buena taza de cafe.

La niña no se quiere levantar, no la culpo, han sido noches duras, con temperaturas que ni con tres cobijas encima logramos superar, mi esposa a mi lado hace pereza, esta despierta desde las 4:30 am, seguramente a causa del frio, es posible que sea tambien producto de su inquieta mente que revolotea entre multiples pensamientos simultaneos, en la mañana nos gusta refrendar nuestros votos, darle gracias a Dios por la posibilidad de un nuevo dia juntos, sellamos este momento diariamente con un beso, nos decimos cuanto nos amamos y continuamos siendo novios como nuestra primera vez…

El sol se deja entrever por la cortina, los gatos estan durmiendo en nuestros pies, sobre las cobijas, buscando calentarse con nosotros, hacen cara de “no te levantes aun, por favor…” pero la mañana ya empieza, y hay que hacer que la maquinaria arranque, asi que siendo aun las 6:00 am, me dirijo hacia el baño, hago pis, y descargo, luego me dirijo hasta nuestra cocina, y junto a ella queda el tendedero de ropas, donde estan nuestras toallas colgadas en ganchos, recojo las tres toallas, y me devuelvo afanoso hacia el baño, haciendo una breve parada en el cuarto de la niña, para pedirle que se levante, gentilmente le muevo sus rulos de la cara, es hermosa, asi dormida parece un angel, aunque ya esta grande y casi no cabe en la cama, aun chupa dedo como cuando era una bebe, asi que le saco el dedo de la boca, y le doy un suave beso en su mejilla rosadita, le abro la persiana y dejo entrar los primeros rayitos de sol, afuera se escuchan los pajaritos que en la mañana trinan y cantan, como una suave melodia.-

En vista de que se gira y no me hace caso, continuo mi recorrido hacia el baño, me empiezo a desvestir de camino, de modo que llego ya desnudo al baño, y me empiezo a regar con esa agua helada. Me baño presuroso, jabono mi cuerpo, y me aplico shampoo de Old Spice, para oler a rico y combatir la caspa. Salgo y me seco, me cepillo los dientes, me peino y salgo del baño, me aplico desodorante, perfume, y me aplico crema lubriderm. Me visto sobre la marcha, de acuerdo a mi estado de animo, con colores oscuros o energicos de acuerdo a mi nivel de emocion, si me antoja me pongo de azul o rojo. No acostumbro vestirme de acuerdo a ideologias politicas, ni equipos de futbol nacional o extranjero, de modo que mis camisetas regularmente son tipo polo, y son de un solo tono. me gusta usar un mismo pantalon, un mismo Jean durante dos o tres dias para aprovecharlo mejor, tanto lavarlos se desgastan y se rompen…

Tanto el pintor con su pincel y sus trazos trata de expresar un sentimiento, o representar un momento, el lograr hacer una narrativa enganchadora, divertida, que transmita un mensaje debe ser tambien una cuestion de gusto, de placer, artistico, en un mundo digital donde abundan los articulos donde pasar el tiempo, y los articulos de opinion sobre politica, analisis futbolisticos y economicos, o los mas recientes avances cientificos, lograr cautivar a un lector para que conecte con una idea, debe ser mas que simplemente una cuestion de simpatia, o de devocion profesional, debemos ser concientes de la responsabilidad que conlleva transmitir conocimiento, de compartir pensamientos, de mostrar una posicion o apoyo a una compañia, o a una marca. Pero el escritor tiene en la pluma su pincel, la palabra escrita le permite dibujar paisajes, describir olores, colores o matices, describir sentimientos y emociones, y salpicar de emocion toda una escena. La palabra escrita debe ser impulsada en los escolares, en las universidades, las bibliotecas han entrado en uso de buen retiro, ya que el buen google ha permitido resumir las busquedas de contenidos y ha truncado los procesos investigativos llegando a suprimir partes importantes de las investigaciones y los descubrimientos que hacia tiempo atras llegabamos a aprender mientras buscabamos resolver algun ejercicio en la biblioteca.- lograr conectar con autores y lecturas es un deber para las nuevas generaciones, pero mas que poder leer y entender al autor, la invitacion y el motivo de este articulo es hacer una invitacion abierta a mis colegas, a mis estudiantes y a todos mis lectores, a hacer buen uso de la lecto escritura, como medio o mecanismo para tracender, para promulgar ideas, conceptos o pensamientos. He sido un avido lector porque he encontrado mucha informacion no solamente tecnica, o de referencias informaticas, sino que me ha gustado leer sobre peliculas, series, comics, fantasia, como Dungeons and dragons, leo sobre temas que no son de mi dominio, como temas economicos, de inversion, o sobre politica, noticias, y todo el tiempo me encuentro inmerso en lecturas, no siempre las mas amables, pero todo el dia estoy absorto entre reuniones y miles de paginas, emails, y foros. No soy muy de Facebook, porque prefiero el reddit o el twitter por ejemplo.

Soy conciente que despues de haber sido empleado o colaborador de Rentabyte, Arquimedex, Manpower Profesional, Alfa ingenieros, Unisys, Hewlett-Packard, Compuredes, Soft-tek, Vision Software, ComWare, IXO, Controles Empresariales, Synapsis, DB-Systems, IBM, GLUP Management, Upwork inc, Adecco, Microsoft Colombia, y hoy dia Halliburton, y que despues de haber dictado cursos para Intelligent Training, IT Talent, Global Knowledge o Netec, LinkedIn Learning o Skilling como Microsoft Certified Trainer, que ninguna de estas firmas se ven beneficiadas o publicitadas en ninguna medida con mis pensamientos y opiniones, y que SOY yo el unico responsable de lograr mantener la dinamica curiosa, la divertida conversacion por este medio con mis lectores, y la constante reflexion o transferencia de conocimiento para con ellos. Mas alla de una inferencia o recomendacion a nombre de una compañia, mi compromiso y pasion por lo que hago no tiene una compensacion mas que la mera satisfaccion de mantener el contacto, de que sigan disfrutando de este espacio, un espacio para compartir, para conectar, y para sentirnos cerca de pensamiento aun en la distancia.-

Buena actitud y la capacidad de servir

Hola de nuevo, esta semana me encontré una de esas frases de sabiduría popular que dice, “No importa tu Titulo, ni el Cargo que desempeñas, lo que cuenta es como puedes SERVIR desde ese cargo, y con ese título…” bueno, esto me ha hecho reflexionar sobre como en alguna medida, gracias a diferentes compañías, proyectos, solicitudes y requerimientos he aportado alguna clase de valor, he generado satisfacción, o porque no, el prometido retorno de la inversión.

Una de mis prioridades como Trainer de Microsoft consiste en verificar la calidad del conocimiento transferido, en verdad si no lo hiciese bien, tiempo después podría resultar seriamente afectado, porque con el tiempo he aprendido que quienes han sido alumnos míos, pueden llegar después a trabajar conmigo, o porque no, podrían ser mis clientes o jefes en un futuro. Lo que sí puedo garantizar es que siempre recordaran con cierta nostalgia las clases, los compañeros de clase, son como compañeros en un viaje, y al finalizar no se vuelven a ver entre sí. Pero la relación con el mentor, siempre genera un grado de afecto, odio o aprecio según sea el grado de compatibilidad con el tutor.

Ahora bien, puede que, aunque uno como instructor tenga toda la voluntad de cambiarle el chip a sus estudiantes, impartirles un par de líneas de PowerShell que les cambien la forma de ver la Matrix, pero la verdad es que mucho debe venir como un auto-aprendizaje por parte del alumno, y mientras se imparte un curso, la orientación atender debes pequeño padawan. Porque la senda de la luz muy estrecha es, y a la oscuridad del abismo fácil caer resulta.

Por eso debemos reconsiderar nuestra actitud, la finalidad del ejercicio, de nuestras actividades diarias y la forma en que estamos participando en la sociedad y el ecosistema que nos rodea. Un gran ejemplo que podemos presentar dado su enfoque Psicológico de la villanía y la maldad, lo encontramos en la cultura POP del Comic, Porque si usted lo analiza, la mayoría de los villanos que en estos pasquines nos presentan, son personas dedicadas, que se preparan, son brillantes mentes, pero corruptas, perversas y malas personas. El Dr. Malito, el Dr. Von Doom, el Dr. Octopus, El Croc de Spiderman, el mismo Lex Luthor que aduce no tener los mismos músculos que Superman, pero que si tiene cerebro… Entre muchos otros villanos son profesores universitarios, investigadores, brillantes personalidades, pero que producto de su egoísmo, de su personalidad, o megalomanía, resultan afectando a muchas, muchísimas personas de esos fantásticos mundos que nos pintan en los comics. Esta es una óptica bizarra de nuestra realidad cotidiana, pero nada más ilustrativo sobre la actitud, y las decisiones que podemos tomar, que como películas como Ralph el demoledor, donde frases como “Yo soy malo, y eso es bueno, yo jamás seré bueno, y eso no es malo…” o “StarWars el retorno del Jedi” nos muestran que somos quienes somos por nuestros pensamientos…

Voy a dejar esto por aquí, con la esperanza de que alguien se tome un momento para reflexionarlo.

“Yo soy lo que pienso, yo soy lo que digo, porque digo lo que pienso, yo soy lo que hago, porque hago lo que digo, yo soy por mis hábitos, porque mis actividades diarias conforman mis hábitos y mi personalidad.” Un feliz día, y gracias por compartir un instante con mi forma de pensar.

Ideas que cambian el mundo

Hoy quiero comentar acerca de un juego de mesa que tiene mas de 50 años, Calabozos y Dragones (dungeons and dragons) es un juego basado en dados, y personajes ficticios, que se puede jugar con miniaturas, sobre un tablero, o en linea, incluso via chat, donde TSR (Tactical Strategic Research) y en cabeza de Gary Gigax, dieron inicio a una cultura, un juego con matices de psicologia, analisis del comportamiento caotico, rebelde, o legal, y bien portado, y donde gracias a la imaginacion, se proponen retos, aventuras, ciertos riesgos como trampas o encantamientos de frio, fuego, veneno o electricidad, que los jugadores, representando aventureros, guerreros, ladrones o hechiceros debemos intentar sortear. la cosa es sencilla, las tareas tienen un grado de dificultad, y si tiras tus dados por encima de ese numero superaste la tarea. digamos que debes abrir una puerta, y como eres un ladron, tienes herramientas de ladron, la dificultad de la puerta es 12, por lo que debes lanzar un dado poliedrico de 20 caras, y sacar mas de 12 para abrir la puerta… a veces de eso dependera que tengas que quedarte y luchar contra un mounstro.

Actualmente hay una solucion basada en un webapp que esta en http://www.roll20.net donde te puedes reunir con tus panas, tener la video llamada, tienes la posibilidad de un chat para el juego, pero ademas del mapa, las hojas de personaje, y la tirada de dados que son lo maximo.. tambien muchas personas se reunen por medio de http://www.twitch.com, donde hay canales dedicados al rol, o tambien encontramos que redes sociales como pinteres o reddit tienen canales exclusivamente para esto. en Telegram por ejemplo se puede usar bots para lanzar los dados, y hacer uso del chat para llevar la narrativa de la historia.- entonces los invito a que conozcan sobre estas soluciones hay paginas como https://www.dndbeyond.com/ con montones de descripciones e informacion, o http://www.dungeon20.com, los espero en mi canal de https://discord.com/, Bravecold#9179 donde por cierto tambien se puede jugar.

El juego mundialmente conocido, ha originado miles de variaciones, y personajes. Los cuales se han desarrollado a partir de una sesion, y que se puede extender en muchos encuentros divertidos con los compañeros o amigos. en estos tiempos de cuarentena los juegos de mesa han tenido un valor inmesurable, el olvidado ajedrez con su estrategia implicita, el parchis o parqués que por medio de los dados nos ha dado tantas alegrias, y aventuras de recorrido como las escaleras, life o el monopolio, se pueden encontrar en un solo juego como D&D.

Cada participante debe contar con un personaje, imaginario, debe nombrarlo, y lanzar tres dados de 6 caras (3d6) siete veces. de los resultados obtenidos vamos a escoger el peor resultado, y lo vamos a descartar. el conjunto de valores resultantes entre 3 y 18 se deberan asignar a los atributos de nuestro personaje, como son Constitucion, Destreza, Inteligencia, Carisma, Sabiduria y Fuerza. Lo que nos interese y segun consideremos, pues si escogemos un personaje de raza humana, podemos ejercer como caballero o paladin, Barbaro, mago o hechicero, bardo o musico/poeta/bailarin/actor, o ladron. Podemos tambien escoger una raza semi-humana como los halflings o medianos, enanos, elfos, u Ogros (dependiendo de la version de juego que usemos podemos usar otras razas como los draconianos, los warforged, los tabaxi que son tipo gatos pero como tipo thundercats, vampiros u otras mas…) cada una de las razas semi tienen habilidades de raza, pero tambien dependiendo del oficio o clase, tenemos potenciadores de clase, mas inteligencia, mas fuerza, o mas velocidad/agilidad.

Imaginense por un instante la escena de la pelicula del señor de los anillos, la comunidad del anillo, donde las diferentes razas estan reunidas decidiendo que van a hacer con el anillo de Sauron.- alli realmente es donde comienza esa aventura.- no digo que Frodo se dejara pinchar por los Nazgul, ni que no hubiera estado en riesgo de morir… simplemente que desde este punto comienza el Quest para todo el equipo.-

jajaja. bueno, continuando con los temas de las peliculas, la escena donde Saruman enfrenta a Gandalf el gris, son dos hechiceros muy poderosos, pero ninguno de los dos utiliza la fuerza para pelear. son puros encantamientos, y una epica batalla magica.-

Asi hemos tenido peliculas como el caldero negro de Disney, Krull, Masters of the Universe, y muchas otras peliculas basadas en esta misma logica o mecanica, con orcos, dragones, espadas magicas tipo rey arturo, o el septimo hijo, o bueno, tantas otras aventuras donde no sabemos que hay tras la puerta, puede haber un peligro mortal o un tesoro invaluable.

Dungeons & dragons (la nueva pelicula, porque hay otra del 2000, con Jeremy Irons) esta en produccion de una y se esperara con ansias para el segundo semestre de 2023, protagonizada por Chris Pine (el piloto que enamoro a la wonder woman), y Daisy Head, asi que estaremos muy atentos a esta version, donde veremos nuevamente aventuras medievales, en ambientaciones muy al estilo de Game of Thrones. donde el exceso de vino y cervezas artesanales, la escaces de medicinas (y las enfermedades horribles), la falta de electricidad y de otras comodidades, hacian que los hombres se divirtieran peleando, en batallas sin sentido o incluso por el amor de una mujer se dieran justas y competencias muy sangrientas.-

En conclusion, espero que se animen a buscar un poco sobre estos territorios, yo se que suena super ñoñesco, mucha lectura, mejor los videojuegos, pero incluso, juegos de video como la famosa saga de Blizzard, Diablo, WarCraft o los juegos de Rol tipo Grand theft auto, se derivaron desde D&D.- pero en estos dias donde todo esta inventado, es bonito poner a volar la imaginacion, y tratar de elaborar tu propia historia a partir de un personaje totalmente inventado. para los que me conocen ya sabran que mi personaje es un Tabaxi, me encanta la idea de un thundercat tipo Panthro, que es ingenioso, y todo un techie, pero tambien puede combatir como un tanque-

Bienestar digital

A los que somos de la generación de los 80’s, que no criamos jugando con balones, amigos, calle arriba y calle abajo, entrar al computador era un escape, hacia una realidad virtual, y veíamos una diversión sana en los video juegos como los que en los comienzos Atari o Nintendo llegaron a proponer en los primeros video juegos que eran muy sanos, inocentes y que desarrollaban alguna habilidad cognitiva,  al tiempo que eran diversión.  Hoy en día y agravado por las condiciones de covid, la cuarentena, el encierro, las posibilidades para quedarse pegado a la pantalla son infinitas,  leemos, interactuamos, opinamos, participamos, hacemos reuniones y video llamadas, tenemos más identidades digitales entre tantas aplicaciones que cuando acabamos de ponernos al día con Facebook,  siempre habrá tarea con Twitter, YouTube, twitch, discord, el correo, reddit, y muchas más…


La intención de estar informados, o al menos enterados, por aquello de las fake news, nos está llevando a un estado de hiperconectividad insalubre, es necesario hacer una terapia como si se tratara de una nueva adicción pues no somos capaces de soltar el celular ni por medio día. Cada quince o menos minutos estamos validando cuantos post, memes, correos, o mensajes de telegram o WhatsApp hemos tenido… ya no más,  alcemos la mirada al frente, miremos nuestro entorno,  saludamos al vecino, y comencemos una desintoxicación de tanta radiación y radiofrecuencia.  


Seguramente tu no eres demasiado de actividades al aire libre, porque seamos sinceros,  estas leyendo un blog, y a esto llegamos solamente aquellos que nos gusta la lectura, para compartir opiniones esta Twitter y para envidiar las vacaciones y alegrarse de los triunfos ajenos están Facebook e Instagram.. pero este post es un llamado al autocuidado,  a revisar cuanto tiempo yo o mi familia estamos pasando frente a la pantalla y cuanto tiempo de calidad estamos pasando realmente,  es un llamado al diálogo, a la meditación a tomarse un respiro a disfrutar una caminata al rededor del barrio


Colombia tiene que permitir a la ciudadanía el vivir a plenitud,  el poder salir sin esperar de que lo roben, salir a caminar,  a saludar a los vecinos, a hacer amistades,  y estrechar lazos con la comunidad,  si comenzamos a trabajar en hacer algo por mis propios familiares,  tener un detalle o una buena acción para con los vecinos,  seguramente estaremos construyendo comunidad. No se trata de un cambio que venga de un partidos político o de izquierda o derecha, es una llamada a que tengamos una mejor actitud, y una empatia o solidaridad para con nuestros vecinos. Solo si el cambio viene de cada uno de nosotros y dejamos de estar tan encerrados en nuestros propios pensamientos podemos tejer, ese tejido social, es en estos momentos lo único que nos queda de lección. 


#menosRedesMasDialogo


Google ha lanzado productos para el bienestar digital, que ayudan a mejorar o modificar tus hábitos digitales,  A mi hija la supervisamos con Google family que es lo máximo (muchas gracias). Y en los teléfonos con Android el sistema operativo ahora incorpora estas herramientas de tiempos de concentración y monitoreo a la salud. Es necesario sacar la basura, incluso de la cabeza, y despejar la mente realizando otras actividades. La televisión no es la mejor manera de desconectarse. Escuche música, haga 10 abdominales,  hable con sus hijos, dedíquese a su gato, cocine algo rico, en fin, hasta en doblar ropa puede haber un mórbido placer. Disfrutemos hacer otras cosas.

Configurar un servidor SMTP en linux

Para realizar la configuracion de correo en Windows uno tiene que hacer analisis y diseño de la infraestructura, evaluar cuantos clientes vas a soportar, si son poquitos con el servicio de SMTP de IIS se puede valer, pero si son mas de 20 usuarios entras a ver cuantas licencias de Exchange vas a necesitar, donde vas a montar las bases de datos, mientras que por otro lado una simple estacion linux me resulta sirviendo como servidor de correo SMTP, sin mayores complicaciones, y dependiendo de la version o distribucion, pues uno ejecuta un

apt-get install postfix, o un yum -y install postfix

y luego edita en el archivo de configuraciones usando vi /etc/postfix/main.cf buscamos en el parametro, “hostname”, y “domain”, y los completamos con los nombres de la estacion y del dominio.

Listo!, ahora bien, el equipo debe tener conectividad a internet, para que pueda enrutar el correo hacia afuera.

Se reinicia el servicio con service postfix restart y ya puedes probar enviar usando un mail fcampo@campohenriquez.com paso seguido te pide el asunto, y le das enviar con CTRL+D

un saludo especial a todos.

Nuevo Windows Server 2022

En el MSIgnite que se termina hoy, nos acaban de anunciar la publicacion del Windows Server 2022, el cual habian anunciado en preview hace unos dias, pero hoy ya la encontramos disponible para desplegar en Azure, https://cloudblogs.microsoft.com/windowsserver/2021/03/02/announcing-windows-server-2022-now-in-preview/, segun indica el sitio web, soporta ahora hasta 48TB de memoria RAM, y hasta 2.048 cores logicos corriendo en 64 sockets fisicos.

Asi que poder darle un vistazo de cerca a todas las novedades que anuncian, vamos a desplegarlo para empezar a probar y vamos viendo sus bondades…

WS2022 en Azure

La primera impresion es que es mas de lo mismo, no hay mucha diferencia en la interfaz, mismo papel tapiz azul, misma distribucion de botones, barras de tareas, el mismo server manager, anuncia la descarga del Windows Admin Center igual que su version predecesora la 20H2, sin embargo leyendo un poco mas, la version mas reciente es https://techcommunity.microsoft.com/t5/windows-admin-center-blog/windows-admin-center-version-2103-is-now-generally-available/ba-p/2176438, viene con powershell 5.1.20295.1 es decir no incluye el nuevo Windows Terminal, ni esta actualizado a powershell 7.1.2.

la pantalla de bienvenida no aporta nada novedoso, ni siquiera otros colores.

La experiencia de uso es similar a Windows 2019, trae MS Edge como navegador,

El boton inicio viene con lo mismo, busqueda, iconos engarzados o lozas (tiles), y esa barrita para perfil, configuraciones y apagar…
Las actualizaciones son la misma experiencia… no cambio nada.

Por aqui vamos a ir revisando por ahora la parte de administracion de Windows Admin Center.

Anuncian mejoras en sus capacidades para ambientes hibridos, orientado a Azure ARC, Azure Monitor, Azure Defender, y Azure Policy- finalmente aqui dejo un enlace al video de la sesion, https://aka.ms/Ignite21-WS-SQL-session espero sus opiniones, aqui abajo en los comentarios.-

Certificaciones Microsoft, El nuevo horizonte

Cuándo nos animamos a presentar un examen de certificación era porque habiamos realizado el curso de preparación, teníamos cierta experiencia con el producto, y buscábamos garantizar por medio de un prueba, que cumpliamos con los requisitos, habilidades técnicas y capacidades profesionales de suficiencia en esa materia.

Microsoft nos permitió certificaciones MCP o Microsoft Certified Profesional, que podíamos preparar en seis meses y un año, entre curso, laboratorios, y seguramente algo de experiencia, que luego al acumular tres de la misma linea se convertían en MCSA o cinco exámenes llegabas a MCSE (Microsoft Certified Solutions Asociate, o Microsoft Certified Solutions Expert). Tras Lograr estas certificaciones ya tenias varios años de experiencia.

Microsoft quiere cambiar el modelo, dinamizando el proceso de aprendizaje en lecturas interactivas que permitan meter mano en sandboxs y máquinas virtuales, mientras aprendes los conceptos, eso es Microsoft Learn, la evolución de la extinta Microsoft Academy, donde gracias a Github, los contenidos son mas dinámicos, son mejorados y corregidos constantemente esto permite la actualización de contenidos con la misma rapidez que los productos cambian, ya que productos “evergreen” como azure y office 365, cambian de semana en semana en cada uno de sus componentes y esto lleva a que los cursos oficiales se desactualizaran muy rápido.

Como instructor MCT (Microsoft Certified Trainer) por mas de 13 años, se de primera mano como esto empezó a suceder cuando implementaron los cambios en la liberación semianual de versiones de windows 10 y windows server, que incorporaban cambios significativos a las distros. Y gracias a la adaptación al modelo de open source, Microsoft a tenido grandes resultados en productos como Powershell que se ha vuelto una piedra angular para la gestión de plataformas.

Las certificaciones se consiguen hoy día con gran esfuerzo, pero el próximo 30 de junio de 2021, cambian los términos, quien se certifique en lo que queda de este año fiscal 2021, que finaliza el 30 de junio, mantendrá su certificaciones por dos años más. Aquel que se certifique después deberá renovarla anualmente, tomando cursos de actualización en la plataforma de http://www.microsoft.com/learn donde se encuentra un modelo que por capitulo va evaluando los conocimientos adquiridos, e incluye laboratorio durante la lección. La evolución de la actividad académica orientada al autoestudio.

Mi recomendación es, no dejen de aprender y maravillarse cada dia, mantengan esa curiosidad de un niño, y aprendan, de cada persona, de cada momento, ya que todo se vuelve experiencia. Y si esperan a estar listos, probablemente pierdan tiempo, pues nunca se sabe cuan listos estamos, hasta que nos vemos en medio del incendio, combatiendo con todo la situación.

Siganme en Twitter como @fcampo

Visual Studio Code y Azure

En este articulo exploraremos Visual studio Code, desde una perspectiva dinamica y divertida…

Es como todas las historias de aventuras de D&D, o del señor de los anillos, estamos todos reunidos en la mayor comodidad, tranquilos disfrutando de la tarde, y el destino nos va a llegar nuevo un “Quest”, una busqueda o reto, en este caso vamos a acompañar a este valiente explorador, de abultado vientre, y corta vista, en un terreno poco explorado, como lo es el uso de las diferentes plataformas de administracion de la nube como las lineas de comando y particularmente el vscode para gestionar plantillas ARM.

Instalacion de prerequisitos

Si usted no tiene una suscripcion de Azure haga clic aqui, necesitara un equipo con Windows 10 preferiblemente, y lo invito a que preparemos los pre-requisitos:

  • Primero que todo una enorme taza del café de su preferencia
  • El modulo de Azure para powershell, aunque se puede administrar Azure desde el portal web cual seria la gracia, este modulo AZ se puede instalar iniciando el PowerShell en modo administrador (es decir dando clic derecho sobre el icono de PowerShell), y usando los siguientes comandos:
$PSVersionTable.PSVersion #para verificar que version de Powershell se tiene con version 5.0 o superior podemos hacer uso de

Install-Module -Name Az #Esto tomara un rato, porque son varios modulos, tambien es posible que te solicite confirmacion de que confias en el repositorio de PSGallery antes de continuar.

Para mas informacion consulte aqui

  • El Azure CLI tambien vale la pena tenerlo, vamos a instalarlo desde aqui esta es otra manera de interactuar con Azure desde PowerShell como administrador ejecutaremos
Invoke-WebRequest -Uri https://aka.ms/installazurecliwindows -OutFile .\AzureCLI.msi; Start-Process msiexec.exe -Wait -ArgumentList '/I AzureCLI.msi /quiet'; rm .\AzureCLI.msi
  • Es posible ingresar a la tienda de Microsoft Store, y descargar el Windows Terminal
  • Tambien puedes querer descargar el WSL (Windows Subsystem for Linux) que permite la ejecucion de un linux Ubuntu dentro de tu sistema operativo, para tener acceso por BASH y poder ejecutar herramientas propias de linux, para instalar el WSL
  • Descargue el Visual Studio Code desde aqui el instalador es muy liviano, pesa menos de 100MB. la instalacion es super simple, y vamos a ir complementandola con las extensiones para Azure a lo largo de este workshop
$VSCode = "https://code.visualstudio.com/docs/?dv=win"
New-FileDownload -SourceFile $VSCode

Guia de laboratorio

Visual Studio Code

Empecemos reconociendo el terreno,

“VS Code viene con un diseño simple e intuitivo que maximiza el espacio provisto para el editor mientras deja un amplio espacio para navegar y acceder al contexto completo de su carpeta o proyecto. La IU se divide en cinco áreas:

  • Editor: el área principal para editar sus archivos. Puede abrir tantos editores como desee, uno al lado del otro, vertical y horizontalmente.
  • Barra lateral: contiene diferentes vistas como el Explorador para ayudarlo mientras trabaja en su proyecto.
  • Barra de estado: información sobre el proyecto abierto y los archivos que edita.
  • Barra de actividad: ubicada en el extremo izquierdo, le permite cambiar de vista y le brinda indicadores adicionales específicos del contexto, como la cantidad de cambios salientes cuando Git está habilitado.
  • Paneles: puede mostrar diferentes paneles debajo de la región del editor para obtener información de salida o depuración, errores y advertencias, o un terminal integrado. El panel también se puede mover hacia la derecha para obtener más espacio vertical.” tomado de:(https://code.visualstudio.com/docs/getstarted/userinterface#_basic-layout)

ahora el Tiki-tiki

Para empezar a probar que todo nos este funcionando, usaremos la barra lateral, para crear un nuevo archivo. Quiero que lo llamemos test.ps1, esta extension hara que el Visual Studio Code identifique que estas intentando crear un Script de PowerShell, por lo que en el modulo de Extensiones te solicitara la instalacion de la extension de PowerShell, en mi escenario utilice la de “PowerShell preview”-

vamos a abrir la consola de PowerShell dentro del vscode, en la seccion inferior aparecen cuatro pestañas, “Problemas”, “Salidas”, “Consola de Depuracion”, y “Terminal” esta ultima es la que me interesa, y vamos a validar que en la parte de la derecha aparece indicando que esta en modo PowerShell, porque tambien puede que esta consola nos funcione para bash.-

Connect-AzAccount #Aqui te pedira iniciar sesion sobre el portal de https://microsoft.com/devicelogin 
get-azresource |ft

PowerShell en 5 minutos

Write-Host #"Powershell tiene una estructura sencilla, es una composicion de un verbo en infinitivo, un guion al medio y un sustantivo singular" -ForegroundColor Yellow
Write-Host #"Por ejemplo podemos encontrar un Get-Command, un Get-Help, o un Get-Service en mas de 800 cmd-lets" -ForegroundColor Yellow
Get-Command
Write-host #"Si queremos saber que esta haciendo nuestro equipo, hacemos un get-process" -ForegroundColor Yellow
Get-process
Write-Host #"Si la informacion es muy extensa, como en este caso, podemos ordenarla" -ForegroundColor Yellow
Update-Help
get-help Get-Process
get-help Get-Process -full
get-help Get-Process -detailed
get-help Get-Process -examples
get-help Get-Process -Online
Get-Service
Get-Service -Name Spooler |Stop-Service
Get-Service M* |Format-List

Command-lets y Parametros

Get-Service M* |Format-Custom
Get-Service M* |Where-Object {$_.Status -eq "Running"}
Get-Service M* |Where-Object {$_.Status -eq "Stopped"}
Get-Service | Sort-Object Status
Get-Service | Sort-Object Status |Format-Table -GroupBy Status Name, DisplayName
Get-Service |Get-Member
Get-Process |Get-Member
Get-Service Spooler |Select-Object ServicesDependedOn
Show-Command Get-Service
Stop-Service M* -WhatIf
Stop-Service M* -Confirm

Pasando resultados con el Pipe o Piping

Get-Process |sort CPU -Descending
Get-EventLog -LogName System -EntryType Error -Newest 10
Get-EventLog -LogName System -EntryType Error -Newest 10 |fl
Get-EventLog -LogName System -EntryType Error -Newest 10 |ogv

Variables y Scripts

$var = "Hola DevOps2020"
$var
Write-host "$var" -ForegroundColor Yellow
Get-Variable 
#podemos manejar strings
$num = 123
$num
#Podemos contener listas o arrays tambien
$num = 1,2,3
$num
$var.GetType().FullName
$var.Length
$var[1]
[int[]] $var = (1,2,3)
$var[2] = "1234"
$var[2]
$v1 = "Hello "
$v2 = "world"
$v1+$v2
($var1+$var2).Length
#Comparar con -eq -ne -gt -lt -ge -le
"Juan Perez" -eq "Ramon Valdez"
#formatos
"{0:f2}" -f 12.4
"|{0,10:C}|" -f 12.4
"{0:hh:mm}" -f (get-date)
#Scripting
Get-ExecutionPolicy
Set-ExecutionPolicy Unrestricted
Get-ExecutionPolicy
runas /user:username PowerShell
##Mas info sobre seguridad en PoSh http://technet.microsoft.com/en-us/magazine/2007.09.powershell.aspx
#------------------------
#test.ps1
#Show Hello and time
"" #Blank line
"Hello"+$Env:USERNAME +"!"
"Time is" + "{0:HH}:{0:mm}" -f (get-Date)
"" #blank line
#------------------------
#Funciones
function get-soup (
    [switch] $please,
    [String] $soup = "chicken noodle"
    )
{
    if ($please){
        "Here's your $soup soup"
    }
    else {
        "No soup for you!"
    }
}
#------------------------

Entornos y modulos

#---------
$User = "fabian.campo@MiDominio.com"
$Pass = ConvertTo-SecureString "AzurePa55w.rd" -AsPlainText -Force
$Cred = New-Object -TypeName System.Management.Automation.PSCredential -ArgumentList $User, $Pass
Import-Module MSOnline
Connect-msolservice -Credential $Cred
$Session = New-PSSession -ConfigurationName Microsoft.Exchange -ConnectionUri https://ps.outlook.com/powershell/ -Credential $Cred -Authentication Basic -AllowRedirection
Import-PSSession $Session
Import-Module LyncOnlineConnector
import-module microsoft.online.sharepoint.powershell
$Session = New-CsOnlinesession -Credential $Cred
Import-PSSession $Session
[string]$tenant = get-msoldomain | where {$_.name -like "*.onmicrosoft.com" -and -not($_.name -like "*mail.onmicrosoft.com")} | select name
$tenant
$tenant3 = $tenant -split("=")
[string]$tenant4 = $tenant3[1]
$tenant4
$tenant5 = $tenant4 -split(".on")
[string]$tenant6 = $tenant5[0]
$url = "https://" + $tenant6 + "-admin.sharepoint.com"
Connect-SPOService -Url $url -credential $Cred  
#---------

Registro, Certificados y otros almacenes

Get-psprovider
Get-psDrive
New-PsDrive -Name HKCS -PSProvider Registry -Root "HKEY_CLASSES_ROOT"
cd HKCS:
dir .ht*
$process = Get-WmiObject -Class win32_Process
$item.name
foreach ($item in $process)
{
    $item.name
}

Creando Maquinas virtuales en Azure

Connect-AzAccount
Get-AZSubscription | Sort SubscriptionName | Select SubscriptionName
$subscrName="Plataformas de MSDN"
Select-AzSubscription -SubscriptionName $subscrName
$rgName="Devops2020_rg"
$locName="eastus"
New-AZResourceGroup -Name $rgName -Location $locName
Get-AZStorageAccountNameAvailability "campoh1473"
$rgName="Devops2020_rg"
$saName="campoh1473"
$locName=(Get-AZResourceGroup -Name $rgName).Location
New-AZStorageAccount -Name $saName -ResourceGroupName $rgName -Type Standard_LRS -Location $locName
$rgName="Devops2020_rg"
$locName=(Get-AZResourceGroup -Name $rgName).Location
$vnetName="Vnet01"
$SubnetName="Subnet01"
$Subnet=New-AZVirtualNetworkSubnetConfig -Name $SubnetName -AddressPrefix 10.0.0.0/27
New-AZVirtualNetwork -Name $vnetName -ResourceGroupName $rgName -Location $locName -AddressPrefix 10.0.0.0/24 -Subnet $Subnet -DNSServer 10.0.0.4
$rule1 = New-AZNetworkSecurityRuleConfig -Name "RDPTraffic" -Description "Allow RDP to all VMs on the subnet" -Access Allow -Protocol Tcp -Direction Inbound -Priority 100 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix * -DestinationPortRange 3389
$rule2 = New-AZNetworkSecurityRuleConfig -Name "ExchangeSecureWebTraffic" -Description "Allow HTTPS to the Exchange server" -Access Allow -Protocol Tcp -Direction Inbound -Priority 101 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix "10.0.0.5/32" -DestinationPortRange 443
$rule3 = New-AZNetworkSecurityRuleConfig -Name "SharePointSecureWebTraffic" -Description "Allow HTTPS to the SharePoint server" -Access Allow -Protocol Tcp -Direction Inbound -Priority 102 -SourceAddressPrefix Internet -SourcePortRange * -DestinationAddressPrefix "10.0.0.7/32" -DestinationPortRange 80
New-AZNetworkSecurityGroup -Name $SubnetName -ResourceGroupName $rgName -Location $locName -SecurityRules $rule1, $rule2, $rule3
$vnet=Get-AZVirtualNetwork -ResourceGroupName $rgName -Name $vnetName
$nsg=Get-AZNetworkSecurityGroup -Name $SubnetName -ResourceGroupName $rgName
Set-AZVirtualNetworkSubnetConfig -VirtualNetwork $vnet -Name $SubnetName -AddressPrefix "10.0.0.0/27" -NetworkSecurityGroup $nsg
$vnet | Set-AzVirtualNetwork
$rgName="Devops2020_rg"
# Create an availability set for domain controller virtual machines
New-AZAvailabilitySet -ResourceGroupName $rgName -Name dcAvailabilitySet -Location $locName -Sku Aligned  -PlatformUpdateDomainCount 5 -PlatformFaultDomainCount 2
# Create the domain controller virtual machine
$vmName="adVM"
$vmSize="Standard_D1_v2"
$vnet=Get-AZVirtualNetwork -Name $vnetName -ResourceGroupName $rgName
$pip = New-AZPublicIpAddress -Name ($vmName + "-PIP") -ResourceGroupName $rgName -Location $locName -AllocationMethod Dynamic
$nic = New-AZNetworkInterface -Name ($vmName + "-NIC") -ResourceGroupName $rgName -Location $locName -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -PrivateIpAddress 10.0.0.4
$avSet=Get-AZAvailabilitySet -Name dcAvailabilitySet -ResourceGroupName $rgName
$vm=New-AZVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $avSet.Id
$vm=Set-AZVMOSDisk -VM $vm -Name ($vmName +"-OS") -DiskSizeInGB 128 -CreateOption FromImage -StorageAccountType "Standard_LRS"
$diskConfig=New-AZDiskConfig -AccountType "Standard_LRS" -Location $locName -CreateOption Empty -DiskSizeGB 20
$dataDisk1=New-AZDisk -DiskName ($vmName + "-DataDisk1") -Disk $diskConfig -ResourceGroupName $rgName
$vm=Add-AZVMDataDisk -VM $vm -Name ($vmName + "-DataDisk1") -CreateOption Attach -ManagedDiskId $dataDisk1.Id -Lun 1
$cred=Get-Credential -Message "Type the name and password of the local administrator account for adVM."
$vm=Set-AZVMOperatingSystem -VM $vm -Windows -ComputerName adVM -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm=Set-AZVMSourceImage -VM $vm -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2012-R2-Datacenter -Version "latest"
$vm=Add-AZVMNetworkInterface -VM $vm -Id $nic.Id
New-AZVM -ResourceGroupName $rgName -Location $locName -VM $vm
## conecte al adVM y ejecute
$disk=Get-Disk | where {$_.PartitionStyle -eq "RAW"}
$diskNumber=$disk.Number
Initialize-Disk -Number $diskNumber
New-Partition -DiskNumber $diskNumber -UseMaximumSize -AssignDriveLetter
Format-Volume -DriveLetter F
Install-WindowsFeature AD-Domain-Services -IncludeManagementTools
Install-ADDSForest -DomainName campoh.lab -DatabasePath "F:\NTDS" -SysvolPath "F:\SYSVOL" -LogPath "F:\Logs"
Add-WindowsFeature RSAT-ADDS-Tools
New-ADUser -SamAccountName sp_farm_db -AccountPassword (read-host "Set user password" -assecurestring) -name "sp_farm_db" -enabled $true -PasswordNeverExpires $true -ChangePasswordAtLogon $false
New-ADUser -Name EXCHSVC -GivenName EXCHSVC -UserPrincipalName EXCHSVC -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name SYSADMIN -GivenName EXCHADMIN -UserPrincipalName EXCHADMIN -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name EFlores -GivenName "Maria Elena" -surname "Flores" -UserPrincipalName EFlores -EmailAddress EFlores@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name Vgarcia -GivenName "Victor" -surname "Garcia" -UserPrincipalName Vgarcia -EmailAddress Vgarcia@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name LRodriguez -GivenName "Lourdes" -surname "Rodriguez" -UserPrincipalName LRodriguez -EmailAddress LRodriguez@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name JLSanchez -GivenName "Jorge Luis" -surname "Sanchez" -UserPrincipalName JLSanchez -EmailAddress JLSanchez@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name CZambrano -GivenName "Cecilia" -surname "Zambrano" -UserPrincipalName CZambrano -EmailAddress CZambrano@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name MSalazar -GivenName "Mariana " -surname "Salazar" -UserPrincipalName MSalazar -EmailAddress MSalazar@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name JCTorres -GivenName "Juan Carlos" -surname "Torres" -UserPrincipalName JCTorres -EmailAddress JCTorres@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name ALAndrade -GivenName "Ana Lucia" -surname "Andrade" -UserPrincipalName ALAndrade -EmailAddress ALAndrade@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
New-ADUser -Name MVera -GivenName "Miguel Angel" -surname "Vera" -UserPrincipalName MVera -EmailAddress MVera@campoh.lab -ChangePasswordAtLogon $false -AccountPassword (ConvertTo-SecureString -AsPlainText "p@ssw0rd" -Force) -Enabled $true
## Fase 2- Creamos ahora la maquina de Exchange
$vmDNSName="mail2393"
$rgName="Devops2020_rg"
$locName=(Get-AZResourceGroup -Name $rgName).Location
Test-AZDnsAvailability -DomainQualifiedName $vmDNSName -Location $locName
# Set up key variables
$subscrName="Plataformas de MSDN"
$rgName="Devops2020_rg"
$vmDNSName="mail2393"
# Set the Azure subscription
Select-AzSubscription -SubscriptionName $subscrName
# Get the Azure location and storage account names
$locName=(Get-AZResourceGroup -Name $rgName).Location
$saName=(Get-AZStorageaccount | Where {$_.ResourceGroupName -eq $rgName}).StorageAccountName
# Create an availability set for Exchange virtual machines
New-AZAvailabilitySet -ResourceGroupName $rgName -Name exAvailabilitySet -Location $locName -Sku Aligned  -PlatformUpdateDomainCount 5 -PlatformFaultDomainCount 2
# Specify the virtual machine name and size
$vmName="exVM"
$vmSize="Standard_D3_v2"
$vnet=Get-AZVirtualNetwork -Name $vnetName -ResourceGroupName $rgName
$avSet=Get-AZAvailabilitySet -Name exAvailabilitySet -ResourceGroupName $rgName
$vm=New-AZVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $avSet.Id
# Create the NIC for the virtual machine
$nicName=$vmName + "-NIC"
$pipName=$vmName + "-PublicIP"
$pip=New-AZPublicIpAddress -Name $pipName -ResourceGroupName $rgName -DomainNameLabel $vmDNSName -Location $locName -AllocationMethod Dynamic
$nic=New-AZNetworkInterface -Name $nicName -ResourceGroupName $rgName -Location $locName -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -PrivateIpAddress "10.0.0.5"
# Create and configure the virtual machine
$cred=Get-Credential -Message "Type the name and password of the local administrator account for exVM."
$vm=Set-AZVMOSDisk -VM $vm -Name ($vmName +"-OS") -DiskSizeInGB 128 -CreateOption FromImage -StorageAccountType "Standard_LRS"
$vm=Set-AZVMOperatingSystem -VM $vm -Windows -ComputerName $vmName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm=Set-AZVMSourceImage -VM $vm -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2012-R2-Datacenter -Version "latest"
$vm=Add-AZVMNetworkInterface -VM $vm -Id $nic.Id
New-AZVM -ResourceGroupName $rgName -Location $locName -VM $vm
## Conectese a exVM y ejecute
Add-Computer -DomainName "campoh.lab"
Install-WindowsFeature AS-HTTP-Activation, Server-Media-Foundation, NET-Framework-45-Features, RPC-over-HTTP-proxy, RSAT-Clustering, RSAT-Clustering-CmdInterface, RSAT-Clustering-Mgmt, RSAT-Clustering-PowerShell, WAS-Process-Model, Web-Asp-Net45, Web-Basic-Auth, Web-Client-Auth, Web-Digest-Auth, Web-Dir-Browsing, Web-Dyn-Compression, Web-Http-Errors, Web-Http-Logging, Web-Http-Redirect, Web-Http-Tracing, Web-ISAPI-Ext, Web-ISAPI-Filter, Web-Lgcy-Mgmt-Console, Web-Metabase, Web-Mgmt-Console, Web-Mgmt-Service, Web-Net-Ext45, Web-Request-Monitor, Web-Server, Web-Stat-Compression, Web-Static-Content, Web-Windows-Auth, Web-WMI, Windows-Identity-Foundation, RSAT-ADDS
Restart-Computer
## Configurar el Exchange
Write-Host (Get-AZPublicIpaddress -Name "40.84.58.22" -ResourceGroup $rgName).DnsSettings.Fqdn
## Desde exVM
## descarga los pre-requisitos, 
## https://go.microsoft.com/fwlink/p/?linkid=863265 ".NET Framework 4.7.2 "
## https://go.microsoft.com/fwlink/?linkid=327788 "Paquete redistribuible de Visual C++ para Visual Studio 2012"
## https://go.microsoft.com/fwlink/?linkid=2002913 "Paquete redistribuible de Visual C++ para Visual Studio 2013"
## https://go.microsoft.com/fwlink/p/?linkId=258269 "API administrada de comunicaciones unificadas de Microsoft 4.0, Core Runtime (64 bits)" 
## descarga el ISO de Exchange con el ultimo CU
e:
.\setup.exe /prepareSchema /IacceptExchangeServerLicenseTerms
.\setup.exe /prepareAD /OrganizationName:LandonHotel /IacceptExchangeServerLicenseTerms
.\setup.exe /mode:Install /role:Mailbox /OrganizationName:LandonHotel /IacceptExchangeServerLicenseTerms
Restart-Computer
$dnsName="mail1473.eastus2.cloudapp.azure.com"
$user1Name="chris@" + $dnsName
$user2Name="janet@" + $dnsName
$db=Get-MailboxDatabase
$dbName=$db.Name
$password = Read-Host "Enter password" -AsSecureString
New-Mailbox -UserPrincipalName $user1Name -Alias chris -Database $dbName -Name ChrisAshton -OrganizationalUnit Users -Password $password -FirstName Chris -LastName Ashton -DisplayName "Chris Ashton"
New-Mailbox -UserPrincipalName $user2Name -Alias janet -Database $dbName -Name JanetSchorr -OrganizationalUnit Users -Password $password -FirstName Janet -LastName Schorr -DisplayName "Janet Schorr"
## Fase 3- Creamos ahora la maquina de SQL Server
# Log in to Azure
Connect-AzAccount
# Set up key variables
$subscrName="Plataformas de MSDN"
$rgName="Devops2020_rg"
# Set the Azure subscription and location
Select-AzSubscription -SubscriptionName $subscrName
$locName=(Get-AzResourceGroup -Name $rgName).Location
# Create an availability set for SQL Server virtual machines
New-AzAvailabilitySet -ResourceGroupName $rgName -Name sqlAvailabilitySet -Location $locName -Sku Aligned  -PlatformUpdateDomainCount 5 -PlatformFaultDomainCount 2
# Create the SQL Server virtual machine
$vmName="sqlVM"
$vmSize="Standard_D3_V2"
$vnetName="Vnet01"
$vnet=Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgName
$pip=New-AzPublicIpAddress -Name ($vmName + "-PIP") -ResourceGroupName $rgName -Location $locName -AllocationMethod Dynamic
$nic=New-AzNetworkInterface -Name ($vmName + "-NIC") -ResourceGroupName $rgName -Location $locName -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -PrivateIpAddress "10.0.0.6"
$avSet=Get-AzAvailabilitySet -Name sqlAvailabilitySet -ResourceGroupName $rgName 
$vm=New-AzVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $avSet.Id
$vm=Set-AzVMOSDisk -VM $vm -Name ($vmName +"-OS") -DiskSizeInGB 128 -CreateOption FromImage -StorageAccountType "Standard_LRS"
$diskSize=100
$diskConfig=New-AzDiskConfig -AccountType "Standard_LRS" -Location $locName -CreateOption Empty -DiskSizeGB $diskSize
$dataDisk1=New-AzDisk -DiskName ($vmName + "-SQLData") -Disk $diskConfig -ResourceGroupName $rgName
$vm=Add-AzVMDataDisk -VM $vm -Name ($vmName + "-SQLData") -CreateOption Attach -ManagedDiskId $dataDisk1.Id -Lun 1
$cred=Get-Credential -Message "Type the name and password of the local administrator account of the SQL Server computer." 
$vm=Set-AzVMOperatingSystem -VM $vm -Windows -ComputerName $vmName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm=Set-AzVMSourceImage -VM $vm -PublisherName MicrosoftSQLServer -Offer SQL2017-WS2016 -Skus Standard -Version "latest"
$vm=Add-AzVMNetworkInterface -VM $vm -Id $nic.Id
New-AzVM -ResourceGroupName $rgName -Location $locName -VM $vm
## Connect sqlVM 
Add-Computer -DomainName "campoh.lab"
Restart-Computer
Get-Disk | Where PartitionStyle -eq "RAW" | Initialize-Disk -PartitionStyle GPT -PassThru | New-Partition -AssignDriveLetter -UseMaximumSize | Format-Volume -FileSystem NTFS -NewFileSystemLabel "SQL Data"
md f:\Data
md f:\Log
md f:\Backup
New-NetFirewallRule -DisplayName "SQL Server ports 1433, 1434, and 5022" -Direction Inbound -Protocol TCP -LocalPort 1433,1434,5022 -Action Allow
## Fase 4- Creamos ahora la maquina de SP Server
# Set up key variables
$subscrName="Plataformas de MSDN"
$rgName="Devops2020_rg"
$dnsName="campoh1473"
# Set the Azure subscription
Select-AzSubscription -SubscriptionName $subscrName
# Get the location
$locName=(Get-AzResourceGroup -Name $rgName).Location
# Create an availability set for SharePoint virtual machines
New-AzAvailabilitySet -ResourceGroupName $rgName -Name spAvailabilitySet -Location $locName -Sku Aligned  -PlatformUpdateDomainCount 5 -PlatformFaultDomainCount 2
# Create the spVM virtual machine
$vmName="spVM"
$vmSize="Standard_D3_V2"
$vnetName="Vnet01"
$vm=New-AzVMConfig -VMName $vmName -VMSize $vmSize
$pip=New-AzPublicIpAddress -Name ($vmName + "-PIP") -ResourceGroupName $rgName -DomainNameLabel $dnsName -Location $locName -AllocationMethod Dynamic
$vnet=Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgName
$nic=New-AzNetworkInterface -Name ($vmName + "-NIC") -ResourceGroupName $rgName -Location $locName -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id -PrivateIpAddress "10.0.0.7"
$avSet=Get-AzAvailabilitySet -Name spAvailabilitySet -ResourceGroupName $rgName 
$vm=New-AzVMConfig -VMName $vmName -VMSize $vmSize -AvailabilitySetId $avSet.Id
$vm=Set-AzVMOSDisk -VM $vm -Name ($vmName +"-OS") -DiskSizeInGB 128 -CreateOption FromImage -StorageAccountType "Standard_LRS"
$cred=Get-Credential -Message "Type the name and password of the local administrator account."
$vm=Set-AzVMOperatingSystem -VM $vm -Windows -ComputerName $vmName -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm=Set-AzVMSourceImage -VM $vm -PublisherName "MicrosoftSharePoint" -Offer "MicrosoftSharePointServer" -Skus "2019" -Version "latest"
$vm=Add-AzVMNetworkInterface -VM $vm -Id $nic.Id
New-AzVM -ResourceGroupName $rgName -Location $locName -VM $vm
## Connect spVM 
Add-Computer -DomainName "campoh.lab"
Restart-Computer
New-NetFirewallRule -DisplayName "SQL Server ports 1433, 1434, and 5022" -Direction Inbound -Protocol TCP -LocalPort 1433,1434,5022 -Action Allow
Write-Host (Get-AzPublicIpaddress -Name "13.77.127.118" -ResourceGroup $rgName).DnsSettings.Fqdn
##Desplegar un cliente
$rgName="Devops2020_rg"
$locName=(Get-AzResourceGroup -Name $rgName).Location
$vnet=Get-AzVirtualNetwork -Name $vnetName -ResourceGroupName $rgName
$pip=New-AzPublicIpAddress -Name CLIENT1-PIP -ResourceGroupName $rgName -Location $locName -AllocationMethod Dynamic
$nic=New-AzNetworkInterface -Name CLIENT1-NIC -ResourceGroupName $rgName -Location $locName -SubnetId $vnet.Subnets[0].Id -PublicIpAddressId $pip.Id
$vm=New-AzVMConfig -VMName CLIENT1 -VMSize Standard_A1
$cred=Get-Credential -Message "Type the name and password of the local administrator account for CLIENT1."
$vm=Set-AzVMOperatingSystem -VM $vm -Windows -ComputerName CLIENT1 -Credential $cred -ProvisionVMAgent -EnableAutoUpdate
$vm=Set-AzVMSourceImage -VM $vm -PublisherName MicrosoftWindowsServer -Offer WindowsServer -Skus 2016-Datacenter -Version "latest"
$vm=Add-AzVMNetworkInterface -VM $vm -Id $nic.Id
$vm=Set-AzVMOSDisk -VM $vm -Name "CLIENT1-OS" -DiskSizeInGB 128 -CreateOption FromImage -StorageAccountType "Standard_LRS"
New-AzVM -ResourceGroupName $rgName -Location $locName -VM $vm
## Detener / Iniciar las maquinas virtuales
$rgName="Devops2020_rg"
Stop-AZVM -Name Client1 -ResourceGroupName $rgName -Force
Stop-AZVM -Name exVM -ResourceGroupName $rgName -Force
Stop-AzVM -Name spVM -ResourceGroupName $rgName -Force
Stop-AzVM -Name sqlVM -ResourceGroupName $rgName -Force
Stop-AZVM -Name adVM -ResourceGroupName $rgName -Force
$rgName="Devops2020_rg"
Start-AZVM -Name adVM -ResourceGroupName $rgName
Start-AZVM -Name exVM -ResourceGroupName $rgName
Start-AzVM -Name sqlVM -ResourceGroupName $rgName
Start-AzVM -Name spVM -ResourceGroupName $rgName
Start-AZVM -Name Client1 -ResourceGroupName $rgName

Plantillas ARM

$location = 'eastus'
$rgName = 'az-rg1'
New-AzResourceGroup -Name $rgName -Location $location
New-AzResourceGroupDeployment `
   -ResourceGroupName $rgName `
   -TemplateFile $HOME/az-vms-template.json `
   -TemplateParameterFile $HOME/az-vm-parameters.json `
   -AsJob

$rgName = 'az-rg2'
New-AzResourceGroup -Name $rgName -Location $location

New-AzResourceGroupDeployment `
   -ResourceGroupName $rgName `
   -TemplateFile $HOME/az-vm-template.json `
   -TemplateParameterFile $HOME/az-vm-parameters.json `
   -nameSuffix 2 `
   -AsJob

$rgName = 'az-rg3'
New-AzResourceGroup -Name $rgName -Location $location

New-AzResourceGroupDeployment `
   -ResourceGroupName $rgName `
   -TemplateFile $HOME/az-vm-template.json `
   -TemplateParameterFile $HOME/az-vm-parameters.json `
   -nameSuffix 3 `
   -AsJob

$virtualNetwork1 =az-vnet01
$virtualNetwork2 =az-vnet02
$virtualNetwork3 =az-vnet03

Add-AzVirtualNetworkPeering `
  -Name myVirtualNetwork1-myVirtualNetwork2 `
  -VirtualNetwork $virtualNetwork1 `
  -RemoteVirtualNetworkId $virtualNetwork2.Id

Add-AzVirtualNetworkPeering `
  -Name myVirtualNetwork2-myVirtualNetwork1 `
  -VirtualNetwork $virtualNetwork2 `
  -RemoteVirtualNetworkId $virtualNetwork1.Id

Get-AzVirtualNetworkPeering `
  -ResourceGroupName myResourceGroup `
  -VirtualNetworkName myVirtualNetwork1 `
  | Select PeeringState

Add-AzVirtualNetworkPeering `
  -Name myVirtualNetwork2-myVirtualNetwork3 `
  -VirtualNetwork $virtualNetwork2 `
  -RemoteVirtualNetworkId $virtualNetwork3.Id

Add-AzVirtualNetworkPeering `
  -Name myVirtualNetwork3-myVirtualNetwork2 `
  -VirtualNetwork $virtualNetwork3 `
  -RemoteVirtualNetworkId $virtualNetwork2.Id

Get-AzVirtualNetworkPeering `
  -ResourceGroupName myResourceGroup `
  -VirtualNetworkName myVirtualNetwork2 `
  | Select PeeringState

$PIP=Get-AzPublicIpAddress `
  -Name az-vm0 `
  -ResourceGroupName myResourceGroup | Select IpAddress

mstsc /v:$PIP

New-NetFirewallRule –DisplayName "Allow ICMPv4-In" –Protocol ICMPv4

mstsc /v:10.1.0.4
ping 10.0.0.4

Install-WindowsFeature RemoteAccess -IncludeManagementTools
Install-WindowsFeature -Name Routing -IncludeManagementTools -IncludeAllSubFeature
Install-WindowsFeature -Name "RSAT-RemoteAccess-Powershell"
Install-RemoteAccess -VpnType RoutingOnly
Get-NetAdapter | Set-NetIPInterface -Forwarding Enabled

Contribuciones

Las solicitudes de extracción son bienvenidas. Para cambios importantes, abra primero un problema para discutir qué le gustaría cambiar.

Asegúrese de actualizar las pruebas según corresponda.

Fabian Alberto Campo
Microsoft Most Valuable Professional 2018-2020
Microsoft Certified Trainer /LinkedIn Learning Author
Website: [www.campohenriquez.com]
LinkedIn: [https://www.linkedin.com/in/fcampo/]
Twitter: [https://twitter.com/fcampo]
Youtube: [https://www.youtube.com/channel/UC5_-RLpII-4R_xyF6R4CZ2Q?view_as=subscriber]

License

MIT

Aprender a aprender

Soy una persona supremamente curiosa, y eso me acarrea que sea descuidado, desordenado, que la curiosidad me lleve con facilidad a estar a veces en demasiadas cosas simultaneas. Para poder hacer procesos de aprendizaje, es necesario despejar la mente, enfocarse realmente en aquello que se quiere aprender, recuerdo que el maestro Yoda le pegaba al joven Skywalker (Mark Hamill) por estar con otros pensamientos durante las prácticas.

Busquemos estar en paz, relajados, sin música que nos distraiga (para cantar) puede ser instrumental o electrónica, también debemos estar cómodos, no acostados ni muy reclinados o nos quedaremos dormidos a la brevedad. Si la iluminación no es suficiente acabaremos por cansar nuestros ojos, y nos dará como mínimo, mucho sueño.

Definamos unos tiempos donde estaremos concentrados dedicados a la actividad y al cabo de 15 ó 20 minutos tomaremos agua o estiraremos las piernas para evitar fatiga de esta manera optimizaremos los tiempos en micro sesiones, no sé si les ha pasado que durar en una misma reunión por más de una hora terminan agotados mental y físicamente por eso la propuesta es hacer pequeñas sesiones tres o cuatro cada hora en donde vayamos trabajando y adelantando cada tema

adicionalmente a estas recomendaciones propongo hacer uso de las características del bienestar digital que hoy en día son lo máximo porque te permiten reducir o minimizar la cantidad de interrupciones que el celular ocasionaba permitiendo que nos concentremos con mayor facilidad y al cabo de una hora de actividad podremos darle una chequeada a la mensajería instantánea o al correo electrónico.

también recomiendo contar con unas galletitas o un maní o algo que se pueda ir picando durante la jornada sin ocasionar que tenga que levantarse a buscar una merienda fuerte.

En estos tiempos de covid, en donde todos hemos empezado a trabajar estudiar y compartir desde la casa tenemos que ser conscientes que las actividades cómo hacer aseo lavar la loza doblar la ropa fácilmente pueden distraer nuestra atención sin embargo hay que buscar mantener un equilibrio entre la vida personal y la vida laboral. y como siempre digo la tecnología tiene que facilitarnos la vida es una herramienta y debe como tal ayudarnos.

Sean felices!