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.

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 dan connection 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 dari azure_rm_publicipaddress dalam variabel yang disebut output_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 port 5985 dan 5986.

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. Tambahkan no_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_virtualmachineextensionberikut :

  - 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 PowerShell ConfigureRemotingForAnsible.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 lalu set_fact menyimpan output dalam variabel untuk digunakan modul wait_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

  1. 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
    
  2. 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 bagian debug dari playbook, hasilnya akan ditampilkan ketika perintah selesai.

Langkah berikutnya