Domine o Windows com Ansible: 9 Playbooks essenciais!

Apresentarei diversas operações que um administrador pode executar em um sistema Windows remotamente, utilizando o ansible-playbook.

O Ansible se destaca como uma das ferramentas de DevOps mais empregadas no mercado atualmente. Ele oferece uma variedade de módulos específicos para Windows, que são utilizados para configurar e gerenciar servidores com este sistema operacional. Presume-se que você já tenha o Ansible instalado em um ambiente Windows, a partir do qual pretende gerenciar os servidores Windows.

A seguir, serão apresentadas algumas das tarefas mais comuns realizadas por administradores de Windows no dia a dia. Você se surpreenderá com a facilidade de administrar o Windows usando o Ansible.

O endereço IP da minha máquina controladora Ansible é 192.168.0.106, e o endereço IP do meu sistema Windows remoto é 192.168.0.102. Antes de iniciar, certifique-se de executar um módulo win_ping para verificar se a conexão com o servidor Windows remoto está estabelecida.

[email protected] ~
$ ansible win -m win_ping
192.168.0.102 | SUCCESS => {
    "changed": false,
    "ping": "pong"
}

A conexão com o host remoto foi estabelecida com sucesso.

Então, vamos começar a explorar os Playbooks do Ansible…

Cópia de Arquivos

O módulo win_copy do Ansible é utilizado para transferir arquivos do servidor local para um host Windows remoto. Utilizarei este módulo para copiar um arquivo PDF específico.

Utilize o código YAML abaixo, especificando os caminhos de origem e destino do arquivo.

[email protected] ~
$ vi copy.yml
---
- hosts: win
  tasks:
    - name: Copiar Arquivo
      win_copy:
        src: C:output.pdf
        dest: C:ansible_examples
        remote_src: yes

Execute o ansible-playbook para a operação win_copy.

[email protected] ~
$ ansible-playbook copy.yml

PLAY [win] ***********************************************************************************************************************************

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

TASK [Copiar Arquivo] *****************************************************************************************************************************
changed: [192.168.0.102]

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

O arquivo foi copiado com êxito para o local de destino no sistema Windows remoto.

Instalação/Desinstalação de MSI

Para instalar um aplicativo utilizando um arquivo MSI, é necessário usar o módulo win_get_url para indicar o caminho do arquivo MSI a ser baixado, e então usar o módulo win_package para realizar a instalação. O estado “present” garante que o MSI será instalado na máquina, e que o aplicativo estará em seu estado atual.

Neste exemplo, instalarei o Apache.

O código YAML a ser utilizado é:

[email protected] ~
$ vi msi.yml
---
- name: Instalação do Apache MSI
  hosts: win
  tasks:
    - name: Baixar o Instalador do 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_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
    - name: Instalar MSI
      win_package:
        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
        state: present

Execute o ansible-playbook para realizar a instalação via MSI.

[email protected] ~
$ ansible-playbook msi.yml

PLAY [Instalação do Apache MSI] *****************************************************************************************************************

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

TASK [Baixar o Instalador do Apache] *********************************************************************************************************
changed: [192.168.0.102]

TASK [Instalar MSI] ***************************************************************************************************************************
changed: [192.168.0.102]

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

Agora, acesse o sistema Windows e verifique se o aplicativo Apache foi instalado com sucesso.

C:Usersetechpt.com>cd C:Program Files (x86)Apache Software FoundationApache2.2bin
C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v
Server version: Apache/2.2.25 (Win32)
Server built: Jul 10 2013 01:52:12

Também é possível instalar aplicativos via MSI utilizando argumentos. Abaixo, segue o mesmo exemplo anterior, mas ao invés de usar o estado “present”, estamos utilizando argumentos de instalação para instalar o Apache.

O código YAML a ser utilizado é:

---
- name: Instalação do Apache MSI
  hosts: win
  tasks:
    - name: Baixar o Instalador do 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_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
    - name: Instalar MSI
      win_package:
        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
        arguments:
          - /install
          - /passive
          - /norestart

Para desinstalar um aplicativo utilizando um arquivo MSI, é necessário utilizar o módulo win_package. O estado “absent” garante que o aplicativo será desinstalado através do arquivo MSI.

Neste exemplo, desinstalarei o Apache.

[email protected] ~
$ vi uninstall_msi.yml

---
- name: Desinstalação do Apache MSI
  hosts: win
  tasks:
    - name: Desinstalar MSI
      win_package:
        path: C:ansible_exampleshttpd-2.2.25-win32-x86-no_ssl.msi
        state: absent

Execute o ansible-playbook para desinstalar via MSI.

[email protected] ~
$ ansible-playbook uninstall_msi.yml

PLAY [Desinstalação do Apache MSI] *****************************************************************************************************************

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

TASK [Desinstalar MSI] *************************************************************************************************************************
changed: [192.168.0.102]

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

Agora, ao verificar a versão do Apache, a saída abaixo será exibida, confirmando que o aplicativo foi desinstalado.

C:Program Files (x86)Apache Software FoundationApache2.2bin>httpd -v 'httpd' is not recognized as an internal or external command,
operable program or batch file.

Desinstalação de Software (.EXE)

É possível desinstalar softwares através de arquivos .exe utilizando o ID do produto do software.

[email protected] ~
$ vi uninstall.yml
---
- hosts: win
  tasks:
   - name: Desinstalar 7-Zip do exe
     win_package:
       path: C:Program Files7-ZipUninstall.exe
       product_id: 7-Zip
       arguments: /S
       state: absent

Execute o ansible-playbook para desinstalar o 7-Zip.

[email protected] ~
$ ansible-playbook uninstall.yml

PLAY [win] *************************************************************************************************************************************************************************************

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

TASK [Desinstalar 7-Zip do exe] ***********************************************************************************************************************************************************
changed: [192.168.0.102]

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

Parar/Iniciar/Reiniciar Serviços do Windows

O módulo win_service do Ansible é utilizado para iniciar, parar ou reiniciar um serviço. Aqui, demonstrarei como parar o serviço Tomcat.

É necessário especificar o nome do serviço no arquivo YAML e definir o estado como “stopped”.

[email protected] ~
$ vi service.yml
---
- hosts: win
  tasks:
   - name: Parar serviço Tomcat
     win_service:
       name: Tomcat8
       state: stopped

Execute o ansible-playbook para interromper o serviço Tomcat.

[email protected] ~
$ ansible-playbook service.yml

PLAY [win] ***********************************************************************************************************************************

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

TASK [Parar serviço Tomcat] ****************************************************************************************************************
changed: [192.168.0.102]

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

Ao verificar o serviço Tomcat no sistema Windows, ele estará com o status de “parado”.

É possível alterar o status do serviço definindo o estado para “started”, “restarted” ou “paused”.

Obtenção de Fatos

Utilizando o módulo win_disk_facts do Ansible, é possível obter todas as informações de disco do host de destino.

[email protected] ~
$ vi disk.yml
---
- hosts: win
  tasks:
  - name: Obter fatos do disco
    win_disk_facts:
  - name: Exibir o tamanho do primeiro disco
    debug:
      var: ansible_facts.disks[0].size
  - name: Converter o primeiro disco do sistema para vários formatos
    debug:
      msg: '{{ disksize_gib }} vs {{ disksize_gib_human }}'
    vars:
      # Obter o primeiro disco do sistema
      disk: '{{ ansible_facts.disks|selectattr("system_disk")|first }}'
      # Exibir o tamanho do disco em Gibibytes
      disksize_gib_human: '{{ disk.size|filesizeformat(true) }}'
      disksize_gib: '{{ (disk.size/1024|pow(3))|round|int }} GiB'

Execute o ansible-playbook para obter informações do disco.

[email protected] ~
$ ansible-playbook disk.yml

PLAY [win] ***********************************************************************************************************************************

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

TASK [Obter fatos do disco] ************************************************************************************************************************
ok: [192.168.0.102]

TASK [Exibir o tamanho do primeiro disco] ****************************************************************************************************************
ok: [192.168.0.102] => {
    "ansible_facts.disks[0].size": "1000204886016"
}

TASK [Converter o primeiro disco do sistema para vários 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 rescued=0 ignored=0

Através do módulo win_command do Ansible, é possível executar comandos no host remoto e obter informações da CPU, detalhes do dispositivo, e muito mais.

[email protected] ~
$ vi check.yml
---
- hosts: win
  tasks:
   - name: Obter fatos do disco
     win_command: wmic cpu get caption, deviceid, name, numberofcores, maxclockspeed, status
     register: usage
   - debug: msg="{{ usage.stdout }}"

Execute o ansible-playbook para obter informações do sistema remoto.

[email protected] ~
$ ansible-playbook check.yml

PLAY [win] ***********************************************************************************************************************************

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

TASK [Obter fatos] ************************************************************************************************************************
changed: [192.168.0.102]

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

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

Execução de Comandos

Quaisquer comandos executados no prompt de comando podem ser executados através do módulo win_command do Ansible. É necessário apenas especificar o comando no seu arquivo YAML. Neste exemplo, estou apenas criando um diretório.

[email protected] ~
$ vi commands.yml
---
- hosts: win
  tasks:
   - name: executar um executável usando win_command
     win_command: whoami.exe
   - name: executar um comando cmd
      win_command: cmd.exe /c mkdir C:test

Execute o ansible-playbook para realizar a operação win_command.

[email protected] ~
$ ansible-playbook commands.yml

PLAY [win] ***********************************************************************************************************************************

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

TASK [executar um executável usando win_command] ***************************************************************************************************
changed: [192.168.0.102]

TASK [executar um comando cmd] *********************************************************************************************************************
changed: [192.168.0.102]

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

Variáveis de Ambiente

Um sistema Windows possui várias variáveis de ambiente, como por exemplo, JAVA_HOME. Utilizando o módulo win_environment do Ansible, é possível adicionar ou modificar variáveis de ambiente em um sistema Windows. Neste exemplo, estou adicionando uma nova variável à lista de variáveis de ambiente do Windows.

[email protected] ~
$ vi env.yml
---
- hosts: win
  tasks:
   - name: Definir uma variável de ambiente para todos os usuários
     win_environment:
       state: present
       name: NewVariable
       value: New Value
       level: machine

Execute o ansible-playbook para adicionar a variável de ambiente em uma máquina Windows remota.

[email protected] ~
$ ansible-playbook env.yml

PLAY [win] ***********************************************************************************************************************************

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

TASK [Definir uma variável de ambiente para todos os usuários] *********************************************************************************************
changed: [192.168.0.102]

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

Ao acessar a janela de variáveis de ambiente, você notará que a nova variável adicionada estará presente.

Adicionar/Editar Registro

O módulo win_regedit do Ansible é utilizado para adicionar ou editar detalhes do registro em uma máquina Windows remota. É necessário informar o caminho do registro e o conteúdo a ser adicionado/atualizado. Neste exemplo, estou criando uma nova entrada de registro etechpt.com dentro do caminho HKLM:SOFTWARE, e então adicionando um nome e dados a este registro.

[email protected] ~
$ vi registry.yml
---
- hosts: win
  tasks:
   - name: Criar um registro
     win_regedit:
      path: HKLM:SOFTWAREetechpt.com
   - name: Modificar um registro, adicionando nome e dados
     win_regedit:
      path: HKLM:SOFTWAREetechpt.com
      name: Geek
      data: Flare

Execute o ansible-playbook para adicionar o registro.

[email protected] ~
$ ansible-playbook registry.yml

PLAY [win] ***********************************************************************************************************************************

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

TASK [Criar um registro] *******************************************************************************************************************
changed: [192.168.0.102]

TASK [Modificar um registro, adicionando nome e dados] ********************************************************************************************
changed: [192.168.0.102]

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

Ao acessar o Editor de Registro no sistema remoto, será possível verificar que o registro foi adicionado com sucesso com os parâmetros “Nome” e “Dados”.

Excluir Registro

O módulo win_eventlog do Ansible é utilizado para adicionar, limpar ou remover logs de eventos do Windows de um sistema Windows.

Acesse o Windows Powershell e liste os EventLogs presentes na máquina Windows remota.

PS C:Usersetechpt.com> Get-EventLog -List
    Max(K) Retain OverflowAction        Entries Log
    ------ ------ --------------        ------- ---
    20,480      0 OverwriteAsNeeded      33,549 Application
    20,480      0 OverwriteAsNeeded           0 HardwareEvents
        512      7 OverwriteOlder             20 Internet Explorer
    20,480      0 OverwriteAsNeeded           0 Key Management Service
        128      0 OverwriteAsNeeded         190 OAlerts
                                                   Security
    20,480      0 OverwriteAsNeeded      44,828 System
    15,360      0 OverwriteAsNeeded       3,662 Windows PowerShell

Agora, demonstrarei como remover logs de todas as fontes do Internet Explorer.

[email protected] ~
$ vi log.yml
---
- hosts: win
  tasks:
   - name: Remover Logs do Internet Explorer
     win_eventlog:
      name: Internet Explorer
      state: absent

Execute o ansible-playbook para remover o Internet Explorer da máquina Windows remota.

[email protected] ~
$ ansible-playbook log.yml

PLAY [win] *************************************************************************************************************************************************************************************

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

TASK [Remover Logs do Internet Explorer] **********************************************************************************************************************************************
changed: [192.168.0.102]

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

Agora, ao listar os EventLogs novamente, você notará que os logs do Internet Explorer foram removidos.

PS C:Usersetechpt.com> Get-EventLog -List

    Max(K) Retain OverflowAction        Entries Log
    ------ ------ --------------        ------- ---
    20,480      0 OverwriteAsNeeded      33,549 Application
    20,480      0 OverwriteAsNeeded           0 HardwareEvents
    20,480      0 OverwriteAsNeeded           0 Key Management Service
        128      0 OverwriteAsNeeded         190 OAlerts
                                                   Security
    20,480      0 OverwriteAsNeeded      44,835 System
    15,360      0 OverwriteAsNeeded          56 Windows PowerShell

Este foi um panorama geral sobre os playbooks do Ansible, que podem ser utilizados para administração remota do Windows. Experimente esses playbooks. Você pode também explorar outros Módulos Ansible do Windows disponíveis.