Domínio do Ansible no Windows: Seu Guia Especializado

Mesmo que o Ansible seja conhecido por gerenciar nós Linux usando SSH, você sabia que o Ansible no Windows também funciona muito bem? Utilizando Windows Remote Management (WinRM), o Ansible no Windows pode gerenciar efetivamente todos os seus nós Windows também!

Com o Ansible no Windows, você pode realizar tarefas como implantar patches, gerenciar servidores Windows, executar scripts do PowerShell e muito mais.

Neste tutorial, você aprenderá como configurar seu primeiro nó Windows para ser gerenciado com o Ansible e verá como executar comandos e playbooks nele.

Pré-requisitos

Se você deseja acompanhar o tutorial, certifique-se de ter o seguinte antes de começar:

  • Um host controlador Ansible – Este tutorial usará o Ansible v2.9.18 em uma máquina Ubuntu 18.04.5 LTS com o endereço IP 10.111.4.53. Note que o Windows não é suportado como um nó de controle, apenas como um nó gerenciado.
  • Python instalado em seu host controlador Ansible – Este tutorial usará o Python v2, mas v3 também deve funcionar muito bem.
  • O pacote pip instalado no controlador Ansible.
  • A Windows 2012 R2 or greater computer for Ansible to manage – This tutorial will use two Windows Server 2012 R2 Standard machines as remote nodes with IP addresses of 52.242.251.213 and 10.111.4.106.
  • A Windows workstation – This tutorial will perform some basic pre-configuration to the node that Windows will manage with Ansible and will require you to sitting at a Windows workstation.
  • O servidor Windows que será gerenciado tem o PowerShell Remoting habilitado
  • A user account in the local Administrators group on the Windows computer. This tutorial will use an account called adminuser.

Configurando o ouvinte WinRM no Windows

Antes que o Ansible possa se comunicar com um nó Windows remoto, ele deve ser capaz de estabelecer uma conexão com ele. Ele faz isso através do protocolo da Microsoft WinRM. WinRM é o mesmo protocolo que o PowerShell Remoting usa para executar comandos remotos de dentro do PowerShell.

No momento desta escrita, o Ansible não suporta SSH como protocolo de gerenciamento, mas é um recurso experimental neste momento.

Para o Ansible usar o WinRM para se comunicar com o nó Windows, você deve configurar o WinRM. Para isso, o Ansible fornece um script do PowerShell que define várias opções do WinRM.

Embora o script do PowerShell fornecido pela Red Hat para configurar o WinRM tenha sido testado e seja seguro, você deve lê-lo e entender, em um nível alto, o que ele está fazendo.

Sua primeira tarefa será baixar o script de configuração e executar o Ansible no nó Windows. Para fazer isso, assumindo que você já tenha habilitado o PowerShell Remoting no seu computador Windows de destino e esteja em uma estação de trabalho Windows:

Baixe o script PowerShell ConfigureRemotingForAnsible.ps1 para o seu computador Windows local. Este tutorial assumirá que ele está salvo em ~\Downloads.

Execute o script de configuração no nó Windows que o Ansible irá gerenciar usando o comando Invoke-Command. O comando abaixo executará o comando nas duas máquinas de demonstração do tutorial e solicitará a senha para a conta local adminuser nos nós Windows.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -FilePath '~\Downloads\ConfigureRemotingForAnsible.ps1' -Credential (Get-Credential -UserName adminuser)

Por padrão, o script de configuração configurará o WinRM para autenticação básica HTTP. Se você deseja que o Ansible use uma conexão mais segura, aprenda Como Configurar o WinRM sobre HTTPS para o Ansible.

Configurando o Controlador do Ansible no Windows

Agora que o nó Windows está pronto para o Ansible, vamos configurar o controlador do Ansible para mostrar como o Ansible deve se comunicar com ele.

1. Conecte-se ao host do controlador do Ansible via SSH usando seu cliente SSH favorito.

2. Instale o módulo Python pywinrm. O módulo Python pywinrm é necessário para que o Ansible no Windows se comunique com os hosts via protocolo WinRM.

pip install pywinrm

3. Defina os nós remotos do Windows em um arquivo de inventário do Ansible. Um inventário do Ansible é uma coleção de hosts remotos definidos em um arquivo, seja por seu nome de host ou endereço IP. Uma vez definidos, você pode direcionar comandos e playbooks para esses inventários do Ansible, como verá em breve.

O arquivo de inventário padrão do Ansible está localizado no diretório /etc/ansible/hosts.

O exemplo de arquivo de inventário abaixo cria um grupo windows de hosts que contém cada nó do Windows. O tutorial está utilizando um grupo de hosts aqui para facilitar o direcionamento de todos os nós do Windows (se você tiver mais de um) de uma vez posteriormente.

[windows]
 54.242.251.213
 10.111.4.106

4. Em seguida, defina algumas variáveis necessárias que o Ansible usará ao se conectar aos hosts do Windows no arquivo de inventário como um grupo windows:vars.

[windows:vars]
 ansible_user=localadmin ## o nome de usuário do Windows para o Ansible se comunicar
 ansible_password=s3crect ## a senha do Windows para o Ansible se comunicar
 ansible_connection=winrm ## O tipo de conexão que o Ansible fará com o nó remoto do Windows
 ansible_winrm_server_cert_validation=ignore ## ignorar a validação do certificado porque estaremos usando um certificado autoassinado que vem com o Ansible

5. Agora, use o módulo Ansible win_ping para executar um teste de conexão simples aos hosts dentro do grupo de hosts windows definido no passo #3.

# windows é o grupo de hosts
# -m informa ao Ansible para usar o módulo win_ping
 ansible windows -m win_ping

Uma vez executado, você pode ver abaixo que o Ansible retorna texto verde com uma mensagem de SUCESSO indicando a tentativa de ping bem-sucedida.

Successful win_ping connection

A saída confirma que o host controlador do Ansible pode se comunicar com o host remoto do Windows com sucesso através do WinRM.

Executando Comandos Ad-Hoc em Hosts Windows

Neste ponto, você está pronto para o Ansible começar a controlar seus nós Windows. Vamos testar isso agora executando um comando ad-hoc nos nós Windows para alterá-los. Comandos ad-hoc são ótimos quando você precisa executar um comando simples em nós sem criar primeiro um playbook.

Vamos demonstrar comandos ad-hoc instalando um recurso do Windows nos nós Windows definidos no arquivo de inventário no grupo de hosts windows. Para fazer isso, assumindo que você ainda está conectado via SSH no seu nó controlador do Ansible:

1. Em vez do módulo win_ping desta vez, chame o módulo win_feature (-m), passando dois argumentos (-a) de name e state indicando o nome do recurso do Windows e o estado desejado.

# windows aqui é um grupo de hosts
# win_feature é o nome do módulo
# state=present significa instalar o pacote ou serviço
 ansible windows -m win_feature -a "name=Telnet-Client state=present"

Ao executar o comando acima, se tudo correr bem, o Ansible deve conectar-se a todos os nós no grupo de hosts windows e executar o comando win_feature em cada um, verificando e, se não estiver presente, instalando o recurso do Windows Telnet-Client.

Ansible Windows Feature

2. O Ansible mostra sucesso, mas para ter certeza, conecte-se manualmente aos nós do Windows com o PowerShell e verifique se o recurso do Windows Telnet Client está agora instalado. Em sua estação de trabalho local do Windows, execute o Invoke-Command para executar o comando PowerShell Get-WindowsFeature em cada computador com Windows.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Get-WindowsFeature -Name 'Telnet-Service' } -Credential (Get-Credential -UserName adminuser)

Neste ponto, você pode executar qualquer módulo do Windows que desejar como comandos ad-hoc!

Criando e Executando Playbooks Ansible no Windows

Uma vez que você dominou a arte de executar comandos ad-hoc em nós gerenciados do Windows, sua próxima tarefa é criar e executar playbooks.. Um playbook do Ansible combina comandos em um único lugar e permite que você escreva lógica complexa para realizar cenários de automação complexos.

Executando Comandos Remotos do Windows com o Módulo win_command

Supondo que você ainda esteja conectado ao seu host controlador do Ansible:

1. Crie uma pasta em seu diretório home chamada ansible-windows-demo e mude para ela. Esta pasta conterá seu playbook.

mkdir ~/ansible-windows-demo 
cd ~/ansible-windows-demo 

2. Abra seu editor de texto favorito e crie e salve um arquivo chamado ansible-windows.yml no diretório ~/ansible-windows-demo.

Os playbooks do Ansible são escritos em YAML

3. Agora, copie o playbook abaixo para o arquivo ansible-windows.yml para criar uma única tarefa. Este playbook executará o comando do Windows netstat usando o módulo do Ansible do Windows win_command em todos os hosts dentro do grupo de hosts windows.

O módulo win_command executa comandos em um host remoto do Windows. Ele não permite comandos que incluam variáveis como caracteres especiais, quebra de linha, símbolo maior que, etc.

---
 - name: Ansible win_command module example  
   hosts: windows # grupo de hosts para executar o módulo
   tasks: 
   -  name: run an executable command on a remote Windows system
      win_command: netstat -e # win_command é um módulo do Windows.

4. Invoque o playbook ansible-windows.yml, que executa a tarefa no host remoto, executando o seguinte comando.

ansible-playbook ansible-windows.yml

Se tudo ocorrer bem, você deverá ver uma saída como a abaixo.

Ansible successfully executed the netstat command using win_command module

Executando comandos do PowerShell remoto com o módulo win_shell

Você criou um playbook para executar um comando cmd.exe remoto (netstat) em nós gerenciados do Windows no exemplo anterior. Vamos agora aumentar um pouco o nível e executar comandos do PowerShell usando o módulo win_shell.

Por padrão, o módulo win_shell é executado no PowerShell no host do Windows

No seu workstation local do Windows:

1. Primeiro, abra o seu editor de texto favorito na sua estação de trabalho local com Windows e crie um exemplo de script PowerShell e copie o seguinte código para ele, salvando-o como one.ps1. Este tutorial irá salvar o script em ~\one.ps1.

O código abaixo cria um arquivo de texto em branco chamado test2.txt no diretório C:\temp.

Set-Content -Path C:\temp\test2.txt -Value ''

2. Copie o script PowerShell one.ps1 para os seus nós gerenciados do Windows usando o seu método preferido. Este tutorial irá assumir que você copiou o script one.ps1 para a pasta C:\Temp em cada nó do Windows.

3. Uma vez que o exemplo do script PowerShell estiver no(s) nó(s) do Windows, conecte-se ao seu host controlador do Ansible e abra novamente o seu editor de texto favorito. Desta vez, crie e salve outro playbook chamado ansible-windows-shell.yml no mesmo diretório ~/ansible-windows-demo.

4. Copie e cole o seguinte playbook no arquivo ansible-windows-shell.yml. Este playbook irá executar duas tarefas para demonstrar o módulo win_shell. Ele invoca o script PowerShell acabado de copiar do passo #2 e insere o código PowerShell diretamente no playbook para demonstrar que o script não é necessário.

Para passar várias linhas de código PowerShell para o módulo win_shell, use o caractere | pipe.

---
 - name: Ansible win_shell module example 
   remote_user: localadmin # utilizador local do Windows para conexão
   hosts: windows # grupo de host remoto
   tasks:
    - name: Single line PowerShell # Executar um único comando usando o módulo win_shell
      win_shell: C:\temp\one.ps1
    - name: Run multi-lined shell commands 
      win_shell: |
        $text = ' Iam Author of ATA'
       Set-Content -Path C:\temp\test3.txt -Value $text 

5. Agora, invoque o segundo playbook ansible-windows-shell.yml, que é executado no host remoto mas com PowerShell.

ansible-playbook ansible-windows-shell.yml
ansible-playbook ansible-windows-shell.yml

6. Se necessário, no seu posto de trabalho local do Windows, verifique se o playbook executou o script existente e o código PowerShell no playbook.

Invoke-Command -ComputerName 52.242.251.213, 10.111.4.106 -ScriptBlock { Test-Path -Path 'C:\Temp\test3.txt','C:\Temp\test2.txt' } -Credential (Get-Credential -UserName adminuser)

Se o playbook do Ansible foi executado com sucesso, o PowerShell deve retornar dois afirmativos True indicando que os ficheiros agora existem.

Conclusão

Neste tutorial, aprendeu como configurar o seu primeiro nó gerido do Windows no Ansible. Mesmo que o Ansible seja tradicionalmente conhecido como uma ferramenta Linux, pode ser facilmente utilizado para o Windows também!

Que playbooks e módulos do Windows irá começar a utilizar para gerir o Windows com o Ansible?

Source:
https://adamtheautomator.com/ansible-on-windows/