Le mostraré varias operaciones que un administrador puede realizar en un sistema windows remoto utilizando ansible-playbook.

Ansible es una de las herramientas DevOps más utilizadas actualmente en el mercado. Proporciona un montón de módulos de Windows que se utilizan para configurar y administrar el servidor Windows. Asumo que ya tiene Ansible instalado en Windows desde donde quiere gestionar los servidores Windows.

Las siguientes son algunas de las tareas más comunes que realizan los administradores de Windows a diario. Se sorprenderá al ver lo fácil que es administrar Windows utilizando Ansible.

La dirección IP de mi máquina controladora de Windows con Ansible es 192.168.0.106, y la dirección IP de mi sistema Windows remoto es 192.168.0.102. Antes de empezar, asegúrese de ejecutar un módulo win_ping para comprobar si puede conectarse al servidor remoto Windows o no.

Geekflare@MSEDGEWIN10 ~
ansible win -m win_ping
192.168.0.102 | ÉXITO => {
    "cambiado": false
    "ping": "pong"
}

Mi conexión a un host remoto tiene éxito.

Así que, empecemos con Ansible Playbooks…

Copiando archivos

win_copy es un módulo ansible que copia un archivo del servidor local a un host Windows remoto. Utilizaré este módulo para copiar un único PDF.

Utilice el siguiente código YAML, indique las rutas de origen y destino.

Geekflare@MSEDGEWIN10 ~
vi copy.yml
---

- hosts: win

  tareas:

  - nombre: Copiar archivo

    win_copy:

      src: C:\output.pdf

      dest: C:\ansible_examples\
     
      remote_src: yes

Ejecute el ansible-playbook para win_copy.

Geekflare@MSEDGEWIN10 ~
ansible-playbook copia.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> ***********************************************************************************************************************************

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

TASK [Copy File] *****************************************************************************************************************************
cambiado: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
omitido=0 rescatado=0 ignorado=0

El archivo se ha copiado correctamente en la ubicación de destino en un sistema Windows remoto.

ansible windows copy

Instalar/Desinstalar MSI

Para instalar una aplicación utilizando el archivo MSI, debe utilizar win_get_url para mencionar la ruta del archivo MSI a descargar y, a continuación, utilizar el módulo win_package para instalarlo. El estado presente significa que el MSI se instalará en la máquina y que la aplicación se encuentra en el estado presente.

Aquí estoy instalando Apache.

Código YAML a utilizar:

Geekflare@MSEDGEWIN10 ~
$ vi msi.yml
---
- nombre: Instalando Apache MSI 
  hosts: win 
 
  tareas:
    - nombre: Descargar el instalador de Apache
      win_get_url
        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi
        dest: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi

    - nombre: Instalar MSI
      win_paquete 
        ruta: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi
        estado: presente

Ejecute el ansible-playbook para instalar mediante MSI.

Geekflare@MSEDGEWIN10 ~
ansible-playbook msi.yml

PLAY [Installing Apache MSI] *****************************************************************************************************************

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

TAREA [Descargar el instalador de Apache] *********************************************************************************************************
cambiado: [192.168.0.102]

TASK [Install MSI] ***************************************************************************************************************************
cambiado: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescatado=0 ignorado=0

Ahora, vaya al sistema windows y compruebe si la aplicación apache se ha instalado correctamente.

C:\Users\geekflare>cd C:\Archivos de Programa (x86)\Apache Software Foundation\Apache2.2\bin
C:\Archivos de programa (x86)\Apache Software Foundation\Apache2.2\bin>httpd -v
Versión del servidor: Apache/2.2.25 (Win32)
Servidor construido: Jul 10 2013 01:52:12

También puede instalar aplicaciones utilizando MSI con argumentos. A continuación se muestra el mismo ejemplo anterior, pero en lugar de un estado, estamos utilizando un argumento install para instalar apache.

Código YAML a utilizar:

---

- nombre: Instalar Apache MSI 

  hosts: win 

  tareas:

    - nombre: Descargar el instalador de Apache

      win_get_url:

        url: https://archive.apache.org/dist/httpd/binaries/win32/httpd-2.2.25-win32-x86-no_ssl.msi

        dest: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi


    - nombre: Instalar MSI

      win_package: 

        ruta: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi

        argumentos:

          - /instalar

          - /pasivo

          - /norestart

Para desinstalar una aplicación utilizando el archivo MSI, es necesario utilizar el módulo win_package. El estado ausente significa que la aplicación se desinstalará utilizando el archivo MSI.

Aquí estoy desinstalando Apache.

Geekflare@MSEDGEWIN10 ~
vi desinstalar_msi.yml

---

- nombre: Desinstalar Apache MSI 

  hosts: win 

  tareas:

    - nombre: Desinstalar MSI

      win_package: 

        ruta: C:\ansible_examples\httpd-2.2.25-win32-x86-no_ssl.msi

        estado: ausente

Ejecute el ansible-playbook para desinstalar mediante MSI.

Geekflare@MSEDGEWIN10 ~
ansible-playbook uninstall_msi.yml

PLAY [UnInstalling Apache MSI] *****************************************************************************************************************

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

TASK [UnInstall MSI] *************************************************************************************************************************
cambiado: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescatado=0 ignorado=0

Ahora, si compruebo la versión de apache, obtendré la siguiente salida ya que la aplicación se ha desinstalado.

C:\Archivos de programa (x86)\Apache Software Foundation\Apache2.2\bin>httpd -v 'httpd' no se reconoce como un comando interno o externo,
programa operable o archivo por lotes.

Desinstalar software (.EXE)

También puede desinstalar software con archivo .exe utilizando el id de producto de dicho software.

Geekflare@MSEDGEWIN10 ~
vi uninstall.yml 
---

- hosts: win 

  tareas:

   - nombre: Desinstalar 7-Zip del exe

     win_package:

       ruta: C:\Archivos de programa\7-Zip\Uninstall.exe

       product_id: 7-Zip

       argumentos: /S

       estado: ausente

Ejecute el ansible-playbook para desinstalar 7-Zip.

Geekflare@MSEDGEWIN10 ~
ansible-playbook uninstall.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> *************************************************************************************************************************************************************************************

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

TASK [Uninstall 7-Zip from the exe] ***********************************************************************************************************************************************************
cambiado: [192.168.0.102]

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

Detener/Iniciar/Reiniciar los servicios de Windows

el módulo ansiblewin_service se utiliza para iniciar, detener o reiniciar un servicio. Aquí le mostraré cómo detener el servicio tomcat.

ansible windows tomcat

Debe mencionar el nombre del servicio en el archivo YAML y establecer el estado en stop.

Geekflare@MSEDGEWIN10 ~
vi service.yml
---
- hosts: win 

  tareas: 

   - nombre: Detener servicio Tomcat

     win_service:

       nombre: Tomcat8

       estado: detenido

Ejecute el ansible-playbook para detener el servicio tomcat.

Geekflare@MSEDGEWIN10 ~
$ ansible-playbook service.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> ***********************************************************************************************************************************

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

TASK [Stop service Tomcat] ****************************************************************************************************************
cambiado: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
skipped=0 rescatado=0 ignorado=0

Si comprueba el servicio tomcat en el sistema windows, ahora está en estado detenido.

ansible windows tomcat stop

Puede definir el estado a iniciado o reiniciado o pausado para cambiar el estado del servicio.

Recopilación de datos

Utilizando el módulo ansible win_disk_facts, puede recuperar toda la información del disco del host de destino.

Geekflare@MSEDGEWIN10 ~
vi disk.yml
---
- hosts: win 
  tareas: 
  - nombre: Obtener datos del disco
    win_disk_facts:

  - name: Obtener primer tamaño de disco
    depurar:
      var: ansible_facts.discos<x>[0]</x>.tamaño

  - name: Convierte el primer disco del sistema en varios formatos
    depurar:
      msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}'
    vars:
      # Obtener el primer disco del sistema
      disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}'

      # Mostrar el tamaño del disco en Gibibytes
      disksize_gib_human: '{{ disk.size|filesizeformat(true) }}' 
      disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'

Ejecute el ansible-playbook para obtener la información del disco.

Geekflare@MSEDGEWIN10 ~
$ ansible-playbook disco.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> ***********************************************************************************************************************************

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

TASK [Get disk facts] ************************************************************************************************************************
ok: [192.168.0.102]

TAREA [Obtener primer tamaño de disco] ****************************************************************************************************************
ok: [192.168.0.102] => {

"ansible_facts.disks<x>[0]</x>.size": "1000204886016"
}

TAREA [Convertir el primer disco del sistema en varios formatos] ****************************************************************************************
ok: [192.168.0.102] => {
"msg": "932 GiB vs 931.5 GiB"
}

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=4 changed=0 unreachable=0 failed=0
skipped=0 rescatado=0 ignorado=0

Utilizando el módulo ansible win_command, puede ejecutar comandos en el host remoto y obtener información de la CPU, detalles del dispositivo y mucho más.

Geekflare@MSEDGEWIN10 ~
vi check.yml
---
- hosts: win 
  tasks:
   - nombre: Obtener datos del disco
     win_command: wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status
     registro: uso

   - debug: msg="{{ usage.stdout }}"

Ejecute el ansible-playbook para obtener información del sistema remoto.

Geekflare@MSEDGEWIN10 ~
ansible-playbook check.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> ***********************************************************************************************************************************

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

TASK [Get facts] ************************************************************************************************************************
cambiado: [192.168.0.102]

TASK [debug] *********************************************************************************************************************************
ok: [192.168.0.102] => {
"msg": "Caption DeviceID MaxClockSpeed
Nombre
NumberOfCores Status \r\r\nIntel64 Family 6 Model 142 Stepping 9 CPU0 2712 Intel(R) Core(TM) i5-7200U CPU @ 2.50GHz 2 OK \r\r\n\r\n"
}

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=1 unreachable=0 failed=0
omitido=0 rescatado=0
ignorado=0

Comandos en ejecución

Sean cuales sean los comandos que ejecute en una ventana, pueden ejecutarse a través del módulo win_command de ansible. Sólo tiene que especificar el comando en su archivo YAML. Aquí, sólo estoy creando un directorio.

Geekflare@MSEDGEWIN10 ~
$ vi comandos.yml
---

- hosts: win 

  tareas:

   - nombre: ejecutar un ejecutable utilizando win_command

     win_command: whoami.exe


   - nombre: ejecutar un comando cmd

      win_command: cmd.exe /c mkdir C:\test

Ejecute el ansible-playbook para realizar la operación win_command.

Geekflare@MSEDGEWIN10 ~
$ ansible-playbook comandos.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> ***********************************************************************************************************************************

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

TAREA [ejecutar un ejecutable usando win_command] ***************************************************************************************************
cambiado: [192.168.0.102]

TAREA [ejecutar un comando cmd] *********************************************************************************************************************
cambiado: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
skipped=0 rescatado=0 ignorado=0

Variables de entorno

Un sistema windows tiene múltiples variables de entorno, por ejemplo, JAVA_HOME. Utilizando el módulo ansible win_environment, puede añadir o modificar variables de entorno en un sistema windows. En este ejemplo, estoy añadiendo una nueva variable a la lista de variables de entorno de windows.

Geekflare@MSEDGEWIN10 ~
$ vi env.yml
---
- hosts: win 
  tareas:
   - name: Establecer una variable de entorno para todos los usuarios
     win_environment:
       estado: presente
       nombre: NuevaVariable
       valor: NuevoValor
       nivel: máquina

Ejecute el ansible-playbook para añadir la variable de entorno en una máquina windows remota.

Geekflare@MSEDGEWIN10 ~
$ ansible-playbook env.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> ***********************************************************************************************************************************

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

TAREA [Establecer una variable de entorno para todos los usuarios] *********************************************************************************************
cambiado: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=2 changed=1 unreachable=0 failed=0
omitido=0 rescatado=0 ignorado=0

Vaya a la ventana de variables de entorno; verá que la nueva variable que acaba de añadir está presente aquí.

ansible windows variables

Añadir/Editar Registro

el módulo ansiblewin_regedit se utiliza para añadir o editar detalles del registro en una máquina Windows remota. Necesita dar la ruta del registro y el contenido a añadir/actualizar. Aquí estoy creando una nueva entrada de registro GeekFlare dentro de la ruta HKLM:\SOFTWARE y luego agregando nombre y datos a este registro.

Geekflare@MSEDGEWIN10 ~
vi registry.yml
---

- hosts: win 

  tareas:

   - nombre: Creación de un registro

     win_regedit:

      ruta: HKLM:\SOFTWARE\GeekFlare

   - nombre: Modificar un registro, añadir nombre y datos

     win_regedit:

      ruta: HKLM:\SOFTWARE\GeekFlare

      nombre: Geek

      datos: Flare

Ejecute el ansible-playbook para añadir el registro.

Geekflare@MSEDGEWIN10 ~
ansible-playbook registro.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> ***********************************************************************************************************************************

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

TASK [Creating a registry] *******************************************************************************************************************
cambiado: [192.168.0.102]

TAREA [Modificar un registro, añadir nombre y datos] ********************************************************************************************
cambiado: [192.168.0.102]

PLAY RECAP ***********************************************************************************************************************************
192.168.0.102
: ok=3 changed=2 unreachable=0 failed=0
omitido=0 rescatado=0 ignorado=0

Si va al Editor del Registro en el sistema remoto, podrá ver que este registro se ha añadido correctamente con los parámetros Nombre y Datos.

ansible windows registry

Borrar Registro

el módulowin_eventlog ansible se utiliza para añadir, borrar o eliminar registros de eventos de windows del sistema windows.

Vaya a Windows Powershell, y liste los EventLogs presentes en la máquina windows remota.

PS C:³³Usuarios³Geekflare> Get-EventLog -List     
  Max(K) Retener Entradas OverflowAction Log
  ------ ------ -------------- ------- ---
  20.480 0 OverwriteAsNeeded 33.549 Aplicación
  20.480 0 SobrescribirComoNecesario 0 HardwareEvents
     512 7 SobrescribirComoNecesario 20 Internet Explorer
  20.480 0 SobrescribirComoNecesario 0 Servicio de gestión de claves
     128 0 SobrescribirComoNecesario 190 OAlertas
                                              Seguridad
  20.480 0 SobrescribirComoNecesario 44.828 Sistema
  15.360 0 Sobrescribir como necesario 3.662 Windows PowerShell

Ahora, voy a mostrar cómo eliminar los registros de todas las fuentes para Internet Explorer.

Geekflare@MSEDGEWIN10 ~
vi log.yml
---
- hosts: win 
  tasks:
   - name: Eliminar registros de Internet Explorer
     win_eventlog:
      nombre: Internet Explorer
      estado: ausente

Ejecute el ansible-playbook para eliminar el Internet Explorer de la máquina windows remota.

Geekflare@MSEDGEWIN10 ~
ansible-playbook log.yml

PLAY <x><x><x><x><x><x><x><x>[win]</x></x></x></x></x></x></x></x> *************************************************************************************************************************************************************************************

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

TASK [Remove Internet Explorer Logs] **********************************************************************************************************************************************
cambiado: [192.168.0.102]

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

Ahora, si vuelve a listar los EventLogs, verá que se han eliminado los registros de Internet Explorer.

PS C:³Users\Geekflare> Get-EventLog -List

  Max(K) Retener Registro de Entradas OverflowAction
  ------ ------ -------------- ------- ---
  20.480 0 OverwriteAsNeeded 33.549 Aplicación
  20.480 0 SobrescribirComoNecesario 0 HardwareEvents
  20.480 0 Sobrescribir como necesario 0 Servicio de gestión de claves
     128 0 SobrescribirComoNecesario 190 OAlertas
                                              Seguridad
  20.480 0 SobrescribirComoNecesario 44.835 Sistema
  15.360 0 Sobrescribir como necesario 56 Windows PowerShell

Así que, eso fue todo acerca de los playbooks de Ansible, que pueden ser utilizados para la administración remota de Windows. Siga adelante y pruebe estos playbooks. También puede probar otros módulos An sible Windows disponibles.