Conecte seu Ansible (Ubuntu) ao Windows em 6 passos!

Vou demonstrar de forma concisa como estabelecer uma conexão entre o servidor Windows e o Ansible, este último em execução em um sistema Ubuntu.

Para prosseguir com as etapas a seguir, é imprescindível que o Python 3.x e o Ansible estejam instalados em ambos os sistemas. Caso necessite de auxílio, consulte os guias abaixo:

Como instalar e configurar o Ansible no Ubuntu?

Como instalar o Ansible no Windows?

Abaixo, apresento os detalhes dos servidores que utilizarei neste processo:

  • Controlador Ansible – 192.168.0.108
  • Servidor Windows – 192.168.0.102

Passo 1: Criação do Usuário Ansible no Windows

Inicialmente, crie um novo usuário especificamente para a configuração da conexão com o Ansible no Windows.

  • Abra o “Gerenciamento do Computador” no seu sistema Windows e navegue até “Usuários e Grupos Locais”.
  • Clique com o botão direito em “Usuários” e selecione “Novo Usuário”.
  • Marque a opção “A senha nunca expira” e conclua a criação do usuário.
  • Entre os grupos disponíveis, clique com o botão direito no grupo “Administradores” e selecione “Propriedades”.
  • Clique em “Adicionar” e insira o nome de objeto “ansible”.
  • Clique em “Verificar Nomes” e depois em “OK”.

Agora, o usuário ‘ansible’ está devidamente configurado na máquina Windows.

Passo 2: Configuração das Bibliotecas e WinRM

No seu sistema controlador Ansible, atualize os pacotes e instale as bibliotecas mencionadas abaixo:

[email protected]:~$ sudo apt-get update
[email protected]:~$ sudo apt-get install gcc python-dev
[email protected]:~$ sudo apt install python3-pip
    

O WinRM (Gerenciamento Remoto do Windows) é fundamental para executar tarefas de administração em sistemas Windows remotamente. Instale o ‘python3-winrm’, um cliente Python usado para estabelecer a comunicação com o sistema Windows:

[email protected]:~$ sudo apt-get install python3-winrm
Reading package lists... Done
Building dependency tree
Reading state information... Done
The following packages were automatically installed and are no longer required:
gyp libc-ares2 libhttp-parser2.8 libjs-async libjs-inherits libjs-is-typedarray libjs-node-uuid libuv1 libuv1-dev node-abbrev node-ajv
node-ansi node-ansi-color-table node-ansi-regex node-ansi-styles node-ansistyles node-aproba node-archy node-are-we-there-yet node-async

node-validate-npm-package-license node-wcwidth.js node-which node-which-module node-wide-align node-wrap-ansi node-wrappy node-y18n
node-yallist node-yargs node-yargs-parser nodejs nodejs-doc
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
python3-kerberos python3-ntlm-auth python3-requests-kerberos python3-requests-ntlm python3-xmltodict
The following NEW packages will be installed:
python3-kerberos python3-ntlm-auth python3-requests-kerberos python3-requests-ntlm python3-winrm python3-xmltodict
0 upgraded, 6 newly installed, 0 to remove and 231 not upgraded.
Need to get 84.8 kB of archives.
After this operation, 442 kB of additional disk space will be used.
Do you want to continue? [Y/n] Y
Get:1 http://old-releases.ubuntu.com/ubuntu cosmic/universe amd64 python3-kerberos amd64 1.1.14-1build1 [16.8 kB]
Get:2 http://old-releases.ubuntu.com/ubuntu cosmic/universe amd64 python3-ntlm-auth all 1.1.0-1 [19.6 kB]
Get:3 http://old-releases.ubuntu.com/ubuntu cosmic/universe amd64 python3-requests-kerberos all 0.11.0-2 [10.1 kB]
Get:4 http://old-releases.ubuntu.com/ubuntu cosmic/universe amd64 python3-requests-ntlm all 1.1.0-1 [6,004 B]
Get:5 http://old-releases.ubuntu.com/ubuntu cosmic/universe amd64 python3-xmltodict all 0.11.0-2 [10.6 kB]
Get:6 http://old-releases.ubuntu.com/ubuntu cosmic/universe amd64 python3-winrm all 0.3.0-2 [21.7 kB]
Fetched 84.8 kB in 1s (70.3 kB/s)
Selecting previously unselected package python3-kerberos.
(Reading database ... 244430 files and directories currently installed.)
Preparing to unpack .../0-python3-kerberos_1.1.14-1build1_amd64.deb ...
Unpacking python3-kerberos (1.1.14-1build1) ...
Selecting previously unselected package python3-ntlm-auth.
Selecting previously unselected package python3-xmltodict.
Preparing to unpack .../4-python3-xmltodict_0.11.0-2_all.deb ...
Unpacking python3-xmltodict (0.11.0-2) ...
Selecting previously unselected package python3-winrm.
Preparing to unpack .../5-python3-winrm_0.3.0-2_all.deb ...
Unpacking python3-winrm (0.3.0-2) ...
Setting up python3-kerberos (1.1.14-1build1) ...
Setting up python3-winrm (0.3.0-2) ...
    

Passo 3: Atualização do Arquivo de Inventário do Ansible

Agora, modifique o arquivo de hosts do Ansible, incluindo o endereço IP do sistema Windows. Isso permitirá que o Ansible identifique a máquina Windows a ser conectada.

[email protected]:~$ sudo gedit /etc/ansible/hosts

[win]
192.168.0.102
    

Passo 4: Configuração das Variáveis de Grupo do Ansible

Crie um diretório para armazenar as variáveis necessárias para a conexão com o sistema Windows.

[email protected]:~$ mkdir /etc/ansible/group_vars
[email protected]:~$ sudo chmod -R 777 /etc/ansible/
    

Crie um arquivo ‘win.yaml’ e adicione as credenciais do usuário criado no primeiro passo, juntamente com outras variáveis necessárias para conectar-se ao sistema Windows.

[email protected]:~$ gedit /etc/ansible/group_vars/win.yaml
    
---

ansible_user: ansible

ansible_password: ansible

ansible_connection: winrm

ansible_winrm_server_cert_validation: ignore

ansible_winrm_transport: basic

ansible_winrm_port: 5985

ansible_python_interpreter: C:Usersetechpt.comAppDataLocalProgramsPythonPython37python
    

Passo 5: Configuração do Servidor Windows para Gerenciamento

Abra o PowerShell no Windows e atualize-o. Certifique-se de que o PowerShell 3.0 e o .NET Framework 4.0 estejam instalados na máquina Windows.

PS C:WINDOWSsystem32> $url = "https://raw.githubusercontent.com/jborean93/ansible-windows/master/scripts/Upgrade-PowerShell.ps1"
PS C:WINDOWSsystem32> $file = "$env:tempUpgrade-PowerShell.ps1"
PS C:WINDOWSsystem32> $username = "ansible"
PS C:WINDOWSsystem32> $password = "ansible"
PS C:WINDOWSsystem32> (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
PS C:WINDOWSsystem32> Set-ExecutionPolicy -ExecutionPolicy Unrestricted -Force
PS C:WINDOWSsystem32> &$file -Version 5.1 -Username $username -Password $password -Verbose
    

Para configurar o WinRM em um sistema Windows com Ansible, utilize um script de configuração remota fornecido pelo Ansible. Execute o script no PowerShell.

PS C:WINDOWSsystem32> $url = "https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"
PS C:WINDOWSsystem32> $file = "$env:tempConfigureRemotingForAnsible.ps1"
PS C:WINDOWSsystem32> (New-Object -TypeName System.Net.WebClient).DownloadFile($url, $file)
PS C:WINDOWSsystem32> powershell.exe -ExecutionPolicy ByPass -File $file
PS C:WINDOWSsystem32> winrm enumerate winrm/config/Listener

Listener
    Address = *
    Transport = HTTP
    Port = 5985
    Hostname
    Enabled = true
    URLPrefix = wsman

    CertificateThumbprint
    ListeningOn = 127.0.0.1, 169.254.8.240, 169.254.36.9, 169.254.102.217, 169.254.215.170, 192.168.0.102, ::1, fe80::3131:c6d7:9ef5:8f0%7, fe80::51b7:9134:550d:d7aa%22, fe80::88f1:1229:e1dd:2409%16, fe80::99cf:5796:4f8e:f5c1%15, fe80::fd77:c19d:e0f2:66d9%9

Listener
    Address = *
    Transport = HTTPS
    Port = 5986
    Hostname = DESKTOP-2L8QMI6
    Enabled = true
    URLPrefix = wsman

    CertificateThumbprint = C83B3FC8B274D0B650F0FD647DC7AC129BBE3FA0
    ListeningOn = 127.0.0.1, 169.254.8.240, 169.254.36.9, 169.254.102.217, 169.254.215.170, 192.168.0.102, ::1, fe80::3131:c6d7:9ef5:8f0%7, fe80::51b7:9134:550d:d7aa%22, fe80::88f1:1229:e1dd:2409%16, fe80::99cf:5796:4f8e:f5c1%15, fe80::fd77:c19d:e0f2:66d9%9
    

Configure o WinRM para permitir tráfego HTTP.

PS C:WINDOWSsystem32> winrm set winrm/config/service '@{AllowUnencrypted="true"}'
Service
    RootSDDL = O:NSG:BAD:P(A;;GA;;;BA)(A;;GR;;;IU)S:P(AU;FA;GA;;;WD)(AU;SA;GXGW;;;WD)

    MaxConcurrentOperations = 4294967295

    MaxConcurrentOperationsPerUser = 1500

    EnumerationTimeoutms = 240000
    MaxConnections = 300

    MaxPacketRetrievalTimeSeconds = 120
    AllowUnencrypted = true
    Auth
        Basic = true
        Kerberos = true
        Negotiate = true
        Certificate = false
        CredSSP = false

    CbtHardeningLevel = Relaxed
    DefaultPorts
        HTTP = 5985
        HTTPS = 5986
    IPv4Filter = *
    IPv6Filter = *

    EnableCompatibilityHttpListener = false

    EnableCompatibilityHttpsListener = false

    CertificateThumbprint
    AllowRemoteAccess = true
    

Habilite a autenticação básica no WinRM.

PS C:WINDOWSsystem32> winrm set winrm/config/service/auth '@{Basic="true"}'
Auth
    Basic = true
    Kerberos = true
    Negotiate = true
    Certificate = false
    CredSSP = false
    CbtHardeningLevel = Relaxed
    

Passo 6: Teste da Conectividade com o Servidor Windows

Com todas as etapas de configuração concluídas, retorne ao sistema controlador Ansible e verifique a conexão com o servidor Windows utilizando o módulo ‘win_ping’ do Ansible.

[email protected]:~$ ansible win -m win_ping
192.168.0.102 | SUCCESS => {

    "changed": false,
    "ping": "pong"
}
    

A mensagem “SUCCESS” confirma que a conexão foi estabelecida. O sistema Windows está agora apto para ser gerenciado remotamente através do Ansible em execução no Ubuntu.