Membuat mesin virtual Windows di Azure
Artikel ini menunjukkan cara menyebarkan VM Windows Server 2019 di Azure dengan Ansible.
Dalam artikel ini, Anda akan mempelajari cara:
- Buat grup sumber daya
- Membuat jaringan virtual, IP publik, grup keamanan jaringan, dan antarmuka jaringan
- Membuat komputer virtual Windows Server
- Menyambungkan ke mesin virtual melalui WinRM
- Menjalankan playbook Ansible untuk mengonfigurasi Windows IIS
Prasyarat
- Langganan Azure: Jika Anda tidak memiliki langganan Azure, buat akun gratis sebelum memulai.
- Perwakilan layanan Azure: Buat perwakilan layanan, catat nilai-nilai berikut: appId, displayName, kata sandi, dan penyewa.
Instal Ansible: Lakukan salah satu opsi berikut:
- Menginstal dan mengonfigurasi Ansibel pada mesin virtual Linux
- Konfigurasikan Azure Cloud Shell
Tambahkan Dukungan WinRM ke Ansible
Untuk berkomunikasi melalui WinRM, server kontrol Ansible membutuhkan paket python pywinrm
.
Jalankan perintah berikut di server Ansible untuk menginstal pywinrm
:
pip install "pywinrm>=0.3.0"
Untuk informasi selengkapnya, lihat Windows Remote Management for Ansible.
Buat grup sumber daya
Buat playbook Ansible bernama azure_windows_vm.yml
dan salin konten berikut ke dalam playbook:
---
- name: Create Azure VM
hosts: localhost
connection: local
tasks:
- name: Create resource group
azure_rm_resourcegroup:
name: myResourceGroup
location: eastus
Poin utama:
- Pengaturan
hosts
ke hostlokal danconnection
ketika_local_
menjalankan playbook secara lokal di server Ansible.
Membuat jaringan virtual dan subnet
Tambahkan tugas berikut ke azure_windows_vm.yml
playbook Ansible untuk membuat jaringan 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
Membuat alamat IP publik
Tambahkan tugas berikut ke playbook azure_windows_vm.yml
untuk membuat alamat IP publik:
- 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 }}"
Poin utama:
- Modul Ansible
register
digunakan untuk menyimpan output dariazure_rm_publicipaddress
dalam variabel yang disebutoutput_ip_address
. - Modul
debug
digunakan untuk mengeluarkan alamat IP publik VM ke konsol.
Membuat grup keamanan jaringan dan NIC
Grup keamanan jaringan menentukan lalu lintas apa yang diizinkan dan tidak diizinkan untuk mencapai VM.
Untuk membuka port WinRM dan HTTP, tambahkan tugas berikut ke playbook Ansible azure_windows_vm.yml
:
- 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
Poin utama:
- Kartu antarmuka jaringan virtual (NIC) menyambungkan VM Anda ke jaringan virtual, alamat IP publik, dan kelompok keamanan.
azure_rm_securitygroup
tersebut membuat grup keamanan jaringan Azure untuk memungkinkan lalu lintas WinRM dari server Ansible ke host jarak jauh dengan mengizinkan port5985
dan5986
.
Membuat mesin virtual
Selanjutnya buat mesin virtual yang menggunakan semua sumber daya yang telah Anda buat di bagian sebelumnya dari artikel ini.
Tambahkan tugas berikut ke playbook Ansible azure_windows_vm.yml
:
- 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
Nilai admin_password
dari {{ password }}
adalah variabel Ansible yang berisi kata sandi VM Windows. Untuk mengisi variabel tersebut dengan aman, tambahkan entri var_prompts
ke bagian awal playbook.
- name: Create Azure VM
hosts: localhost
connection: local
vars_prompt:
- name: password
prompt: "Enter local administrator password"
tasks:
Poin utama:
- Hindari menyimpan data sensitif sebagai teks biasa. Gunakan
var_prompts
untuk mengisi variabel pada waktu berjalan. Tambahkanno_log: true
untuk mencegah pencatatan kata sandi.
Konfigurasikan Pendengar WinRM
Ansible menggunakan PowerShell untuk menghubungkan dan mengonfigurasi host jarak jauh Windows melalui WinRM.
Untuk mengonfigurasi WinRM, tambahkan ekstensi azure_rm_virtualmachineextension
berikut :
- 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/devel/examples/scripts/ConfigureRemotingForAnsible.ps1"],"commandToExecute": "powershell -ExecutionPolicy Unrestricted -File ConfigureRemotingForAnsible.ps1"}'
auto_upgrade_minor_version: true
Ansible tidak dapat terhubung ke VM hingga WinRM dikonfigurasi sepenuhnya.
Tambahkan tugas berikut ke playbook Anda untuk menunggu koneksi 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
Poin utama:
- Modul ini
azure_rm_virtualmachineextension
memungkinkan Anda menjalankan skrip PowerShell secara lokal di Windows Azure. Menjalankan skrip PowerShellConfigureRemotingForAnsible.ps1
mengonfigurasi WinRM dengan membuat sertifikat yang ditandatangani sendiri dan membuka port yang diperlukan agar Ansible dapat terhubung. - Modul
azure_rm_publicipaddress_info
mengkueri alamat IP publik dari Azure laluset_fact
menyimpan output dalam variabel untuk digunakan modulwait_for
.
Selesaikan sampel playbook Ansible
Bagian ini mencantumkan seluruh contoh playbook Ansible yang telah Anda buat selama mengikuti artikel ini.
---
- 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/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
Menyambungkan ke mesin virtual Windows
Buat playbook Ansible baru bernama connect_azure_windows_vm.yml
dan salin konten berikut ke dalam playbook:
---
- 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:
Jalankan playbook Ansible.
ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,
Ganti <publicIPaddress>
dengan alamat mesin virtual Anda.
Poin utama:
- Konfigurasi Ansible menentukan bagaimana Ansible menghubungkan dan mengautentikasi ke host jarak jauh. Variabel yang perlu Anda tentukan untuk terhubung ke host Windows bergantung pada jenis koneksi WinRM Anda dan opsi autentikasi yang Anda pilih. Untuk informasi selengkapnya, lihat Menyambungkan ke Opsi Host dan Opsi Autentikasi Windows.
- Menambahkan koma setelah alamat IP publik tanpa melalui parser inventaris Ansible. Teknik ini memungkinkan Anda untuk menjalankan playbook tanpa file inventaris.
Membersihkan sumber daya
Simpan kode berikut sebagai
delete_rg.yml
.--- - hosts: localhost tasks: - name: Deleting resource group - "{{ name }}" azure_rm_resourcegroup: name: "{{ name }}" state: absent register: rg - debug: var: rg
Jalankan playbook menggunakan perintah ansible-playbook. Ganti tempat penampung dengan nama grup sumber daya yang akan dihapus. Semua sumber daya dalam grup sumber daya akan dihapus.
ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
Poin utama:
- Karena variabel
register
dan bagiandebug
dari playbook, hasilnya akan ditampilkan ketika perintah selesai.
- Karena variabel
Langkah berikutnya
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk