Aracılığıyla paylaş


Ansible kullanarak Azure'da Windows sanal makinesi oluşturma

Bu makalede , Ansible ile Azure'da Windows Server 2019 VM'sini dağıtma adımları gösterilmektedir.

Bu makalede şunları öğreneceksiniz:

  • Bir kaynak grubu oluşturun
  • Sanal ağ, genel IP, ağ güvenlik grubu ve ağ arabirimi oluşturma
  • Windows Server sanal makinesi dağıtma
  • WinRM aracılığıyla sanal makineye bağlanma
  • Windows IIS'yi yapılandırmak için Ansible playbook'u çalıştırma

Önkoşullar

  • Azure aboneliği: Azure aboneliğiniz yoksa başlamadan önce ücretsiz bir hesap oluşturun.

Ansible'a WinRM Desteği Ekleme

WinRM üzerinden iletişim kurmak için Ansible denetim sunucusu python paketine pywinrmihtiyaç duyar.

Yüklemek için pywinrm, Ansible sunucusunda aşağıdaki komutu çalıştırın.

pip install "pywinrm>=0.3.0"

Daha fazla bilgi için bkz. Ansible için Windows Uzaktan Yönetimi.

Bir kaynak grubu oluşturun

adlı azure_windows_vm.yml bir Ansible playbook oluşturun ve aşağıdaki içerikleri playbook'a kopyalayın:

---
- name: Create Azure VM
  hosts: localhost
  connection: local
  tasks:

  - name: Create resource group
    azure_rm_resourcegroup:
      name: myResourceGroup
      location: eastus

Önemli noktalar:

  • localhost ve olarak ayarlandığında, playbook Ansible sunucusunda yerel olarak çalışır.

Sanal ağı ve alt ağı oluşturma

Bir sanal ağ oluşturmak için azure_windows_vm.yml Ansible playbook'a aşağıdaki görevleri ekleyin:

  - 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

Genel IP adresi oluşturma

Aşağıdaki görevleri azure_windows_vm.yml playbook'a ekleyerek genel bir IP adresi oluşturun.

  - 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 }}"

Önemli noktalar:

  • Ansible register modülü, çıkışını azure_rm_publicipaddress adlı output_ip_addressbir değişkende depolamak için kullanılır.
  • Modül debug , konsola VM'nin genel IP adresini çıkarmak için kullanılır.

Ağ güvenlik grubu ve NIC oluşturma

Ağ güvenlik grubu, vm'ye erişmesine izin verilen ve erişilmeyen trafiği tanımlar.

WinRM ve HTTP bağlantı noktalarını açmak için Ansible playbook'a azure_windows_vm.yml aşağıdaki görevleri ekleyin:

  - 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

Önemli noktalar:

  • Sanal ağ arabirim kartı VM'nizi sanal ağına, genel IP adresine ve güvenlik grubuna bağlar.
  • azure_rm_securitygroup Ansible sunucusundan uzak ana bilgisayara WinRM trafiğine izin vermek için 5985 ve 5986 bağlantı noktalarına izin veren bir Azure ağ güvenlik grubu oluşturur.

Sanal makine oluşturun

Ardından, bu makalenin önceki bölümlerinde oluşturduğunuz tüm kaynakları kullanan bir sanal makine oluşturun.

Ansible playbook'a azure_windows_vm.yml aşağıdaki görevi ekleyin:

  - 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

admin_password değeri{{ password }}, Windows VM parolasını içeren bir Ansible değişkenidir. Bu değişkeni güvenli bir şekilde doldurmak için playbook'un başına bir var_prompts giriş ekleyin.

- name: Create Azure VM
  hosts: localhost
  connection: local
  vars_prompt:
    - name: password
      prompt: "Enter local administrator password"
  tasks:

Önemli noktalar:

  • Hassas verileri düz metin olarak depolamaktan kaçının. Çalışma zamanında değişkenleri doldurmak için kullanın var_prompts . Parolaların günlüğe kaydedilmesini önlemek için no_log: true ekleyin.

WinRM Dinleyicisini yapılandırma

Ansible, WinRM aracılığıyla Windows uzak konaklarına bağlanmak ve yapılandırmak için PowerShell kullanır.

WinRM'yi yapılandırmak için aşağıdaki ext azure_rm_virtualmachineextensionöğesini ekleyin:

  - 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

Ansible, WinRM tam olarak yapılandırılana kadar VM'ye bağlanamaz.

WinRM bağlantısını beklemek için playbook'unuza aşağıdaki görevleri ekleyin:

  - 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

Önemli noktalar:

  • Bu modül, azure_rm_virtualmachineextension Azure Windows'ta yerel olarak bir PowerShell betiği çalıştırmanıza olanak tanır. ConfigureRemotingForAnsible.ps1 PowerShell betiğini çalıştırmak, otomatik olarak imzalanan sertifikalar oluşturarak ve Ansible'ın bağlanması için gerekli bağlantı noktalarını açarak WinRM'yi yapılandırıyor.
  • Modül, azure_rm_publicipaddress_info Azure'dan genel IP adresini sorgular ve ardından set_fact çıkışı modülün kullanması için bir değişkende wait_for depolar.

Tam bir Ansible çalışma kitabı örneği

Bu bölümde, bu makale boyunca oluşturduğunuz örnek Ansible playbook'unun tamamı listelenir.

---
- 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

Windows sanal makinesine bağlanma

adlı connect_azure_windows_vm.yml yeni bir Ansible playbook oluşturun ve aşağıdaki içerikleri playbook'a kopyalayın:

---
- 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:

Ansible playbook'unu çalıştırın.

ansible-playbook connect_azure_windows_vm.yml -i <publicIPaddress>,

<publicIPaddress> adresini sanal makinenizin adresiyle değiştirin.

Önemli noktalar:

  • Ansible yapılandırması, Ansible'ın uzak konaklara nasıl bağlandığını ve kimlik doğrulamasını belirler. Bir Windows konağına bağlanmak için tanımlamanız gereken değişkenler, WinRM bağlantı türünüz ve seçtiğiniz kimlik doğrulama seçeneğine bağlıdır. Daha fazla bilgi için bkz. Windows Konağına Bağlanma ve Windows Kimlik Doğrulama Seçenekleri.
  • Genel IP adresinden sonra virgül eklemek Ansible'ın envanter ayrıştırıcısını atlar. Bu teknik, playbook'ları envanter dosyası olmadan çalıştırmanızı sağlar.

Kaynakları temizle

  1. Aşağıdaki kodu olarak delete_rg.ymlkaydedin.

    ---
    - hosts: localhost
      tasks:
        - name: Deleting resource group - "{{ name }}"
          azure_rm_resourcegroup:
            name: "{{ name }}"
            state: absent
          register: rg
        - debug:
            var: rg
    
  2. ansible-playbook komutunu kullanarak playbook'u çalıştırın. Yer tutucuyu silinecek kaynak grubunun adıyla değiştirin. Kaynak grubundaki tüm kaynaklar silinir.

    ansible-playbook delete_rg.yml --extra-vars "name=<resource_group>"
    

    Önemli noktalar:

    • Playbook'un register değişkeni ve debug bölümü nedeniyle, komut tamamlandığında sonuçlar görüntülenir.

Sonraki Adımlar