Ansible: Criado AMI Windows personalizada na AWS (Parte 1)

Quando vamos trabalhar com Ansbile usando Windows na AWS notamos que as imagens padrões do Windows não estão com o WinRM configurado e as senhas são geradas aleatoriamente usando a chave selecionada, sendo somente acessíveis alguns minutos após a instância iniciar. Conectando em uma instância Windows.

Uma alternativa é criar uma AMI personalizada com WinRM configurado e uma senha pré-definida, estando assim disponível imediatamente para uso. O primeiro passo é iniciar uma instância Windows colocando o script abaixo em User Data. Atenção para o campo onde está definido a senha, o script também irá baixar e executar o script para configurar o WinRM.

<powershell>
$admin = [adsi]("WinNT://./administrator, user")
$admin.PSBase.Invoke("SetPassword", "myTempPassword123!")
Invoke-Expression ((New-Object System.Net.Webclient).DownloadString('https://raw.githubusercontent.com/ansible/ansible/devel/examples/scripts/ConfigureRemotingForAnsible.ps1'))
</powershell>

UserData

Caso você use o Packer para gerar suas imagens esse script também por ser usado no parâmetro user_data_file.

Na configuração de Security Group da instância lembre-se de liberar as portas 3389 e 5986. Caso não saiba a porta 5986 é usada para conexão segura com o WinRM, que é usado pelo Ansible para conexão. Após alguns instantes após iniciar a instância ela já vai estar liberada para o acesso.

No arquivo de hosts do ansible, configure usando os dados abaixo e a senha definida no script acima

[windows]
ip-host-windows

[windows:vars]
ansible_connection=winrm
ansible_ssh_port=5986
ansible_ssh_user=Administrator
ansible_ssh_pass=myTempPassword123!

Após alguns instantes estando a instância disponível para acesso. Podemos testar usando o módulo do ansible win_ping. No nosso exemplo usando o comando ansible windows -i hosts -m win_ping. O retorno deve ser parecido com esse:

Win Ping

Bom essa é a primeira etapa, na parte 2 iremos ver como configurar o Windows e gerar uma nova AMI personalizada usando o Ansible