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.