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.