Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
Este artigo mostra como implantar uma VM do Windows Server 2019 no Azure com o Ansible.
Neste artigo, você aprenderá a:
- Criar um grupo de recursos
- Criar uma rede virtual, IP público, grupo de segurança de rede e interface de rede
- Implantar uma máquina virtual do Windows Server
- Conectar-se à máquina virtual por meio do WinRM
- Executar um guia estratégico do Ansible para configurar o Windows IIS
Pré-requisitos
- Assinatura do Azure: Se você não tiver uma assinatura do Azure, crie uma conta gratuita antes de começar.
- Azure Service Principal: Criar um principal de serviço, anotando os seguintes valores: appId, displayName, senha e locatário.
Instalar o Ansible: execute uma das seguintes opções:
- Instalar e configurar o Ansible em uma máquina virtual linux
- Configurar o Azure Cloud Shell
Adicionar suporte do WinRM ao Ansible
Para se comunicar pelo WinRM, o servidor de controle do Ansible precisa do pacote pywinrmpython.
Execute o seguinte comando no servidor Ansible para instalar pywinrm:
pip install "pywinrm>=0.3.0"
Para obter mais informações, consulte o Gerenciamento Remoto do Windows para Ansible.
Criar um grupo de recursos
Crie um guia estratégico do Ansible nomeado azure_windows_vm.yml e copie o seguinte conteúdo para o guia estratégico:
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Pontos principais:
- Definindo
hostspara localhost econnectionpara_local_, executa o playbook localmente no servidor Ansible.
Criar a rede virtual e a sub-rede
Adicione as seguintes tarefas ao guia estratégico do azure_windows_vm.yml Ansible para criar uma rede virtual:
- name: Create virtual network
azure_rm_virtualnetwork:
resource_group: myResourceGroup
name: vNet
address_prefixes: "10.0.0.0/16"
- name: Add subnet
azure_rm_subnet:
resource_group: myResourceGroup
name: subnet
address_prefix: "10.0.1.0/24"
virtual_network: vNet
Criar um endereço IP público
Adicione as seguintes tarefas ao azure_windows_vm.yml guia estratégico para criar um endereço IP público:
- name: Create public IP address
azure_rm_publicipaddress:
resource_group: myResourceGroup
allocation_method: Static
name: pip
register: output_ip_address
- name: Output public IP
debug:
msg: "The public IP is {{ output_ip_address.state.ip_address }}"
Pontos principais:
- O módulo Ansible
registeré usado para armazenar a saída deazure_rm_publicipaddressem uma variável chamadaoutput_ip_address. - O
debugmódulo é usado para gerar o endereço IP público da VM para o console.
Criar grupo de segurança de rede e NIC
O grupo de segurança de rede define qual tráfego é permitido e não é permitido acessar a VM.
Para abrir as portas WinRM e HTTP, adicione as seguintes tarefas ao guia estratégico do azure_windows_vm.yml Ansible:
- name: Create Network Security Group
azure_rm_securitygroup:
resource_group: myResourceGroup
name: networkSecurityGroup
rules:
- name: 'allow_rdp'
protocol: Tcp
destination_port_range: 3389
access: Allow
priority: 1001
direction: Inbound
- name: 'allow_web_traffic'
protocol: Tcp
destination_port_range:
- 80
- 443
access: Allow
priority: 1002
direction: Inbound
- name: 'allow_powershell_remoting'
protocol: Tcp
destination_port_range:
- 5985
- 5986
access: Allow
priority: 1003
direction: Inbound
- name: Create a network interface
azure_rm_networkinterface:
name: nic
resource_group: myResourceGroup
virtual_network: vNet
subnet_name: subnet
security_group: networkSecurityGroup
ip_configurations:
- name: default
public_ip_address_name: pip
primary: True
Pontos principais:
- Uma placa de interface de rede virtual conecta sua VM à sua rede virtual, ao endereço IP público e ao grupo de segurança.
- Cria um grupo de segurança de rede do Azure
azure_rm_securitygrouppara permitir o tráfego do WinRM do servidor Ansible para o host remoto, permitindo as portas5985e5986.
Criar uma máquina virtual
Em seguida, crie uma máquina virtual que use todos os recursos que você criou nas seções anteriores deste artigo.
Adicione a seguinte tarefa ao guia estratégico do azure_windows_vm.yml Ansible:
- name: Create VM
azure_rm_virtualmachine:
resource_group: myResourceGroup
name: win-vm
vm_size: Standard_DS1_v2
admin_username: azureuser
admin_password: "{{ password }}"
network_interfaces: nic
os_type: Windows
image:
offer: WindowsServer
publisher: MicrosoftWindowsServer
sku: 2019-Datacenter
version: latest
no_log: true
O valor de admin_password é uma variável Ansible que contém a senha da VM do Windows. Para preencher com segurança essa variável, adicione uma var_prompts entrada ao início do guia estratégico.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Pontos principais:
- Evite armazenar dados confidenciais como texto sem formatação. Use
var_promptspara preencher variáveis em tempo de execução. Adicioneno_log: truepara impedir que senhas sejam registradas.
Configurar o Ouvinte do WinRM
O Ansible usa o PowerShell para se conectar e configurar hosts remotos do Windows por meio do WinRM.
Para configurar o WinRM, adicione a seguinte extensão azure_rm_virtualmachineextension:
- name: Create VM script extension to enable HTTPS WinRM listener
azure_rm_virtualmachineextension:
name: winrm-extension
resource_group: myResourceGroup
virtual_machine_name: win-vm
publisher: Microsoft.Compute
virtual_machine_extension_type: CustomScriptExtension
type_handler_version: '1.9'
settings: '{"fileUris": ["https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"],"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1"}'
auto_upgrade_minor_version: true
O Ansible não pode se conectar à VM até que o WinRM esteja totalmente configurado.
Adicione as seguintes tarefas ao seu guia estratégico para aguardar a conexão WinRM:
- name: Get facts for one Public IP
azure_rm_publicipaddress_info:
resource_group: myResourceGroup
name: pip
register: publicipaddresses
- name: set public ip address fact
set_fact: publicipaddress="{{ publicipaddresses | json_query('publicipaddresses[0].ip_address')}}"
- name: wait for the WinRM port to come online
wait_for:
port: 5986
host: '{{ publicipaddress }}'
timeout: 600
Pontos principais:
- O
azure_rm_virtualmachineextensionmódulo permite que você execute um script do PowerShell localmente no Azure Windows. Executar o script do PowerShell configura oConfigureRemotingForAnsible.ps1WinRM ao criar certificados autoassinados e abrir as portas necessárias para que o Ansible se conecte. - O
azure_rm_publicipaddress_infomódulo consulta o endereço IP público do Azure eset_factarmazena a saída em uma variável para owait_formódulo a ser usado.
Concluir o guia estratégico do Ansible de exemplo
Esta seção lista todo o guia estratégico do Ansible de exemplo que você criou ao longo deste artigo.
---
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
- name: Create virtual network
azure_rm_virtualnetwork:
resource_group: myResourceGroup
name: vNet
address_prefixes: "10.0.0.0/16"
- name: Add subnet
azure_rm_subnet:
resource_group: myResourceGroup
name: subnet
address_prefix: "10.0.1.0/24"
virtual_network: vNet
- name: Create public IP address
azure_rm_publicipaddress:
resource_group: myResourceGroup
allocation_method: Static
name: pip
register: output_ip_address
- name: Output public IP
debug:
msg: "The public IP is {{ output_ip_address.state.ip_address }}"
- name: Create Network Security Group
azure_rm_securitygroup:
resource_group: myResourceGroup
name: networkSecurityGroup
rules:
- name: 'allow_rdp'
protocol: Tcp
destination_port_range: 3389
access: Allow
priority: 1001
direction: Inbound
- name: 'allow_web_traffic'
protocol: Tcp
destination_port_range:
- 80
- 443
access: Allow
priority: 1002
direction: Inbound
- name: 'allow_powershell_remoting'
protocol: Tcp
destination_port_range:
- 5985
- 5986
access: Allow
priority: 1003
direction: Inbound
- name: Create a network interface
azure_rm_networkinterface:
name: nic
resource_group: myResourceGroup
virtual_network: vNet
subnet_name: subnet
security_group: networkSecurityGroup
ip_configurations:
- name: default
public_ip_address_name: pip
primary: True
- name: Create VM
azure_rm_virtualmachine:
resource_group: myResourceGroup
name: win-vm
vm_size: Standard_DS1_v2
admin_username: azureuser
admin_password: "{{ password }}"
network_interfaces: nic
os_type: Windows
image:
offer: WindowsServer
publisher: MicrosoftWindowsServer
sku: 2019-Datacenter
version: latest
no_log: true
- name: Create VM script extension to enable HTTPS WinRM listener
azure_rm_virtualmachineextension:
name: winrm-extension
resource_group: myResourceGroup
virtual_machine_name: win-vm
publisher: Microsoft.Compute
virtual_machine_extension_type: CustomScriptExtension
type_handler_version: '1.9'
settings: '{"fileUris": ["https://raw.githubusercontent.com/ansible/ansible-documentation/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"],"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1"}'
auto_upgrade_minor_version: true
- name: Get facts for one Public IP
azure_rm_publicipaddress_info:
resource_group: myResourceGroup
name: pip
register: publicipaddresses
- name: set public ip address fact
set_fact: publicipaddress="{{ publicipaddresses | json_query('publicipaddresses[0].ip_address')}}"
- name: wait for the WinRM port to come online
wait_for:
port: 5986
host: '{{ publicipaddress }}'
timeout: 600
Conectar-se à máquina virtual do Windows
Crie um novo guia estratégico do Ansible chamado connect_azure_windows_vm.yml e copie o seguinte conteúdo para o guia estratégico:
---
- hosts: all
vars_prompt:
- name: ansible_password
prompt: "Enter local administrator password"
vars:
ansible_user: azureuser
ansible_connection: winrm
ansible_winrm_transport: ntlm
ansible_winrm_server_cert_validation: ignore
tasks:
- name: Test connection
win_ping:
Execute o guia estratégico do Ansible.
ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,
Substitua <publicIPaddress> pelo endereço da máquina virtual.
Pontos principais:
- A configuração do Ansible determina como o Ansible se conecta e se autentica a hosts remotos. As variáveis que você precisa definir para se conectar a um host do Windows dependem do tipo de conexão WinRM e da opção de autenticação escolhida. Para obter mais informações, consulte Conectar-se a um host do Windows e opções de autenticação do Windows.
- Adicionar uma vírgula após o endereço IP público faz com que o analisador de inventário do Ansible seja ignorado. Essa técnica permite que você execute guias estratégicos sem um arquivo de inventário.
Limpar os recursos
Salve o código a seguir como
delete_rg.yml.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rgExecute o playbook usando o comando ansible-playbook. Substitua o espaço reservado pelo nome do grupo de recursos a ser excluído. Todos os recursos dentro do grupo de recursos serão excluídos.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"Pontos principais:
- Devido ao
registervariável e àdebugseção do livro de estratégias, os resultados são mostrados quando o comando é concluído.
- Devido ao