Öğretici - Azure’da ilk önyüklemede bir Linux sanal makinesini özelleştirmek için cloud-init kullanmaTutorial - How to use cloud-init to customize a Linux virtual machine in Azure on first boot

Bir önceki öğreticide, sanal makineye nasıl SSH uygulanacağını ve NGINX öğesinin el ile nasıl yükleneceğini öğrendiniz.In a previous tutorial, you learned how to SSH to a virtual machine (VM) and manually install NGINX. Hızlı ve tutarlı şekilde sanal makineler oluşturmak için genellikle bir otomasyon biçimi istenir.To create VMs in a quick and consistent manner, some form of automation is typically desired. İlk önyüklemede bir sanal makineyi özelleştirmek için genellikle cloud-init kullanılır.A common approach to customize a VM on first boot is to use cloud-init. Bu öğreticide şunların nasıl yapıldığını öğrenirsiniz:In this tutorial you learn how to:

  • cloud-init yapılandırma dosyası oluşturmaCreate a cloud-init config file
  • cloud-init dosyası kullanan bir sanal makine oluşturmaCreate a VM that uses a cloud-init file
  • Sanal makine oluşturulduktan sonra çalıştırılan bir Node.js uygulamasını görüntülemeView a running Node.js app after the VM is created
  • Sertifikaları güvenli şekilde depolamak için Key Vault’u kullanmaUse Key Vault to securely store certificates
  • cloud-init ile güvenli NGINX dağıtımlarını otomatikleştirmeAutomate secure deployments of NGINX with cloud-init

Azure Cloud Shell kullanmaUse Azure Cloud Shell

Azure, Azure Cloud Shell, tarayıcınız üzerinden kullanabileceğiniz bir etkileşimli Kabuk ortamını barındırır.Azure hosts Azure Cloud Shell, an interactive shell environment that you can use through your browser. Cloud Shell'i ya da kullanmanıza imkan tanır bash veya PowerShell Azure hizmetleriyle çalışmak için.Cloud Shell lets you use either bash or PowerShell to work with Azure services. Cloud Shell önceden yüklenmiş komutları, yerel ortamınızda herhangi bir yükleme gerekmeden bu makaledeki kodu çalıştırmak için kullanabilirsiniz.You can use the Cloud Shell pre-installed commands to run the code in this article without having to install anything on your local environment.

Azure Cloud Shell'i başlatmak için:To launch Azure Cloud Shell:

SeçenekOption Örnek/bağlantıExample/Link
Kod bloğunun sağ üst köşesindeki Deneyin’i seçin.Select Try It in the upper-right corner of a code block. Seçme deneyin kod Cloud Shell için otomatik olarak kopyalamaz.Selecting Try It doesn't automatically copy the code to Cloud Shell. Örneği Azure Cloud Shell için deneyin
Git https://shell.azure.com veya Cloud Shell'i Başlat Cloud Shell, tarayıcınızda açmak için düğmeyi.Go to https://shell.azure.com or select the Launch Cloud Shell button to open Cloud Shell in your browser. <a href="https://shell.azure.com" title="Azure Cloud Shell'i Başlat
Seçin Cloud Shell düğmesine sağ üst menü çubuğundaki Azure portalında.Select the Cloud Shell button on the top-right menu bar in the Azure portal. Azure portaldaki Cloud Shell düğmesi

Bu makalede Azure Cloud shell'de kod çalıştırmak için:To run the code in this article in Azure Cloud Shell:

  1. Cloud Shell'i başlatın.Launch Cloud Shell.
  2. Seçin kopyalama kodu kopyalamak için bir kod bloğu üzerinde düğmesi.Select the Copy button on a code block to copy the code.
  3. Cloud Shell oturumla kodu yapıştırın Ctrl+Shift+V Windows ve Linux'ta veya Cmd + Shift+V macOS üzerinde.Paste the code into the Cloud Shell session with Ctrl+Shift+V on Windows and Linux, or Cmd+Shift+V on macOS.
  4. Tuşuna Enter kodu çalıştırmak için.Press Enter to run the code.

CLI'yi yerel olarak yükleyip kullanmayı tercih ederseniz bu öğretici için Azure CLI 2.0.30 veya sonraki bir sürümünü çalıştırmanız gerekir.If you choose to install and use the CLI locally, this tutorial requires that you are running the Azure CLI version 2.0.30 or later. Sürümü bulmak için az --version komutunu çalıştırın.Run az --version to find the version. Yükleme veya yükseltme yapmanız gerekiyorsa bkz. Azure CLI'yı yükleme.If you need to install or upgrade, see Install Azure CLI.

Cloud-init genel bakışCloud-init overview

Cloud-init, Linux VM’sini ilk kez önyüklendiğinde özelleştirmeyi sağlayan, sık kullanılan bir yaklaşımdır.Cloud-init is a widely used approach to customize a Linux VM as it boots for the first time. cloud-init’i paket yükleme, dosyalara yazma ve kullanıcılar ile güvenliği yapılandırma işlemleri için kullanabilirsiniz.You can use cloud-init to install packages and write files, or to configure users and security. cloud-init önyükleme işlemi sırasında çalışırken, yapılandırmanıza uygulayabileceğiniz ek adım veya gerekli aracı yoktur.As cloud-init runs during the initial boot process, there are no additional steps or required agents to apply your configuration.

Cloud-init, dağıtımlar arasında da çalışır.Cloud-init also works across distributions. Örneğin, bir paket yüklemek için apt-get install veya yum install kullanmazsınız.For example, you don't use apt-get install or yum install to install a package. Bunun yerine, yüklenecek paketlerin listesini tanımlayabilirsiniz.Instead you can define a list of packages to install. Cloud-init, seçtiğiniz dağıtım için yerel paket yönetim aracını otomatik olarak kullanır.Cloud-init automatically uses the native package management tool for the distro you select.

Azure’a sağladıkları görüntülere cloud-init’in dahil edilmesini ve bu görüntülerde çalışmasını sağlamak için iş ortaklarımızla çalışıyoruz.We are working with our partners to get cloud-init included and working in the images that they provide to Azure. Aşağıdaki tabloda, Azure platform görüntülerindeki geçerli cloud-init kullanılabilirliği açıklanmaktadır:The following table outlines the current cloud-init availability on Azure platform images:

AliasAlias YayımcıPublisher SunduğuOffer SKUSKU VersionVersion
UbuntuLTSUbuntuLTS CanonicalCanonical UbuntuServerUbuntuServer 16.04-LTS16.04-LTS latestlatest
UbuntuLTSUbuntuLTS CanonicalCanonical UbuntuServerUbuntuServer 14.04.5-LTS14.04.5-LTS latestlatest
CoreOSCoreOS CoreOSCoreOS CoreOSCoreOS DengeliStable latestlatest
OpenLogicOpenLogic CentOSCentOS 7-CI7-CI latestlatest
RedHatRedHat RHELRHEL 7-RAW-CI7-RAW-CI latestlatest

cloud-init yapılandırma dosyası oluşturmaCreate cloud-init config file

cloud-init’i uygulamalı olarak görmek için, NGINX’i yükleyen ve basit bir 'Merhaba Dünya' Node.js uygulaması çalıştıran bir sanal makine oluşturun.To see cloud-init in action, create a VM that installs NGINX and runs a simple 'Hello World' Node.js app. Aşağıdaki cloud-init yapılandırması, gerekli paketleri yükler, bir Node.js uygulaması oluşturur, ardından uygulamayı kullanıma hazırlar ve başlatır.The following cloud-init configuration installs the required packages, creates a Node.js app, then initialize and starts the app.

Geçerli kabuğunuzda cloud-init.txt adlı bir dosya oluşturup aşağıdaki yapılandırmayı yapıştırın.In your current shell, create a file named cloud-init.txt and paste the following configuration. Örneğin, dosyayı yerel makinenizde değil Cloud Shell’de oluşturun.For example, create the file in the Cloud Shell not on your local machine. İstediğiniz düzenleyiciyi kullanabilirsiniz.You can use any editor you wish. Dosyayı oluşturmak ve kullanılabilir düzenleyicilerin listesini görmek için sensible-editor cloud-init.txt adını girin.Enter sensible-editor cloud-init.txt to create the file and see a list of available editors. Başta birinci satır olmak üzere cloud-init dosyasının tamamının doğru bir şekilde kopyalandığından emin olun:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 80;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

cloud-init yapılandırma seçenekleri hakkında daha fazla bilgi için bkz. cloud-init config örnekleri.For more information about cloud-init configuration options, see cloud-init config examples.

Sanal makine oluşturmaCreate virtual machine

VM oluşturabilmek için önce az group create ile bir kaynak grubu oluşturun.Before you can create a VM, create a resource group with az group create. Aşağıdaki örnek, eastus konumunda myResourceGroupAutomate adlı bir kaynak grubu oluşturur:The following example creates a resource group named myResourceGroupAutomate in the eastus location:

az group create --name myResourceGroupAutomate --location eastus

Şimdi az vm create ile bir VM oluşturun.Now create a VM with az vm create. --custom-data parametresini kullanarak cloud-init yapılandırma dosyanızı geçirin.Use the --custom-data parameter to pass in your cloud-init config file. Dosyayı mevcut çalışma dizininizin dışına kaydettiyseniz cloud-init.txt yapılandırmasının tam yolunu belirtin.Provide the full path to the cloud-init.txt config if you saved the file outside of your present working directory. Aşağıdaki örnek myVM adlı bir VM oluşturur:The following example creates a VM named myVM:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myVM \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init.txt

VM’nin oluşturulması, paketlerin yüklenmesi ve uygulamanın başlatılması birkaç dakika sürebilir.It takes a few minutes for the VM to be created, the packages to install, and the app to start. Azure CLI sizi isteme geri döndürdükten sonra çalışmaya devam eden arka plan görevleri vardır.There are background tasks that continue to run after the Azure CLI returns you to the prompt. Uygulamaya erişmeniz birkaç dakika sürebilir.It may be another couple of minutes before you can access the app. VM oluşturulduktan sonra, Azure CLI tarafından görüntülenen publicIpAddress değerini not edin.When the VM has been created, take note of the publicIpAddress displayed by the Azure CLI. Bu adres, web tarayıcısı aracılığıyla Node.js uygulamasına erişmek için kullanılır.This address is used to access the Node.js app via a web browser.

Web trafiğinin VM’nize erişmesine izin vermek için, az vm open-port komutuyla İnternet’te 80 numaralı bağlantı noktasını açın:To allow web traffic to reach your VM, open port 80 from the Internet with az vm open-port:

az vm open-port --port 80 --resource-group myResourceGroupAutomate --name myVM

Web uygulamasını test etmeTest web app

Artık bir web tarayıcısı açın ve girin http://<Publicıpaddress > adres çubuğundaki.Now you can open a web browser and enter http://<publicIpAddress> in the address bar. VM oluşturma işleminden kendi herkese açık IP adresinizi sağlayın.Provide your own public IP address from the VM create process. Node.js uygulamanız, aşağıdaki örnekte olduğu gibi görüntülenir:Your Node.js app is displayed as shown in the following example:

Çalışan NGINX sitesini görüntüleme

Key Vault’tan sertifikalar eklemeInject certificates from Key Vault

Bu isteğe bağlı bölümde, Azure Key Vault’ta sertifikaları nasıl güvenli şekilde depolayabileceğiniz ve sanal makine dağıtımı sırasında bunları nasıl ekleyebileceğiniz gösterilir.This optional section shows how you can securely store certificates in Azure Key Vault and inject them during the VM deployment. Bu süreç, sertifikaları içeren özel bir görüntü kullanmak yerine ilk önyüklemede bir sanal makineye en güncel sertifikaların eklenmesini sağlar.Rather than using a custom image that includes the certificates baked-in, this process ensures that the most up-to-date certificates are injected to a VM on first boot. İşlem sırasında sertifika hiçbir zaman Azure platformundan ayrılmaz veya bir betikte, komut satırı geçmişinde ya da şablonda gösterilmez.During the process, the certificate never leaves the Azure platform or is exposed in a script, command-line history, or template.

Azure Key Vault, sertifikalar veya parolalar gibi şifreleme anahtarları ile gizli dizilerin güvenliğini sağlar.Azure Key Vault safeguards cryptographic keys and secrets, such as certificates or passwords. Key Vault, anahtar yönetimi işleminin kolaylaştırılmasına yardımcı olur ve verilerinize erişen ve bunları şifreleyen anahtarları denetiminizde tutmanıza olanak sağlar.Key Vault helps streamline the key management process and enables you to maintain control of keys that access and encrypt your data. Bu senaryo, Key Vault’un nasıl kullanılacağına dair kapsamlı bir genel bakış sunmasa da, sertifika oluşturma ve kullanmaya yönelik bazı Key Vault kavramlarını sunar.This scenario introduces some Key Vault concepts to create and use a certificate, though is not an exhaustive overview on how to use Key Vault.

Aşağıdaki adımlar şunları nasıl yapabileceğinizi gösterir:The following steps show how you can:

  • Azure Key Vault oluşturmaCreate an Azure Key Vault
  • Sertifikaları oluşturma veya Key Vault’a yüklemeGenerate or upload a certificate to the Key Vault
  • Sanal makineye eklenecek sertifikadan gizli dizi oluşturmaCreate a secret from the certificate to inject in to a VM
  • VM oluşturma ve sertifika eklemeCreate a VM and inject the certificate

Azure Key Vault oluşturmaCreate an Azure Key Vault

İlk olarak az keyvault create ile bir Key Vault oluşturun ve bu anahtarın VM dağıtırken kullanılmasını etkinleştirin.First, create a Key Vault with az keyvault create and enable it for use when you deploy a VM. Her Key Vault benzersiz bir ad gerektirir ve küçük harflerle yazılmalıdır.Each Key Vault requires a unique name, and should be all lower case. Aşağıdaki örnekte yer alan mykeyvault değerini, kendi benzersiz Key Vault adınızla değiştirin:Replace mykeyvault in the following example with your own unique Key Vault name:

keyvault_name=mykeyvault
az keyvault create \
    --resource-group myResourceGroupAutomate \
    --name $keyvault_name \
    --enabled-for-deployment

Sertifika oluşturma ve sertifikayı Key Vault’ta depolamaGenerate certificate and store in Key Vault

Üretim sırasında kullanım için, az keyvault certificate import komutunu kullanarak güvenilen bir sağlayıcı tarafından imzalanan geçerli bir sertifikayı içeri aktarmalısınız.For production use, you should import a valid certificate signed by trusted provider with az keyvault certificate import. Bu öğreticide, aşağıdaki örnekte varsayılan sertifika ilkesini kullanan az keyvault certificate create ile nasıl otomatik olarak imzalanan sertifika oluşturabileceğiniz gösterilmektedir:For this tutorial, the following example shows how you can generate a self-signed certificate with az keyvault certificate create that uses the default certificate policy:

az keyvault certificate create \
    --vault-name $keyvault_name \
    --name mycert \
    --policy "$(az keyvault certificate get-default-policy)"

Sertifikayı VM ile kullanım için hazırlamaPrepare certificate for use with VM

VM oluşturma sürecinde sertifikayı kullanmak için, az keyvault secret list-versions komutuyla sertifikanızın kimliğini alın.To use the certificate during the VM create process, obtain the ID of your certificate with az keyvault secret list-versions. VM, sertifikanın önyüklemede eklenmesi için belirli bir biçimde olmasını gerektirir, bu nedenle az vm secret format komutu ile sertifikayı dönüştürün.The VM needs the certificate in a certain format to inject it on boot, so convert the certificate with az vm secret format. Aşağıdaki örnekte, sonraki adımlarda kullanım kolaylığı sağlamak için bu komutların çıkışı değişkenlere atanmaktadır:The following example assigns the output of these commands to variables for ease of use in the next steps:

secret=$(az keyvault secret list-versions \
          --vault-name $keyvault_name \
          --name mycert \
          --query "[?attributes.enabled].id" --output tsv)
vm_secret=$(az vm secret format --secret "$secret")

NGINX’in güvenliğini sağlamak için cloud-init yapılandırması oluşturmaCreate cloud-init config to secure NGINX

VM oluşturduğunuzda, sertifika ve anahtarlar korunan /var/lib/waagent/ dizininde depolanır.When you create a VM, certificates and keys are stored in the protected /var/lib/waagent/ directory. VM’ye sertifika eklenmesini ve NGINX’in yapılandırılmasını otomatikleştirmek için önceki örnekte yer alan güncelleştirilmiş bir cloud-init yapılandırmasını kullanabilirsiniz.To automate adding the certificate to the VM and configuring NGINX, you can use an updated cloud-init config from the previous example.

cloud-init-secured.txt adlı bir dosya oluşturup aşağıdaki yapılandırmayı yapıştırın.Create a file named cloud-init-secured.txt and paste the following configuration. Cloud Shell’i kullanırsanız yerel makinenizden değil, oradan cloud-init yapılandırma dosyasını oluşturun.Again, if you use the Cloud Shell, create the cloud-init config file there and not on your local machine. Dosyayı oluşturmak ve kullanılabilir düzenleyicilerin listesini görmek için sensible-editor cloud-init-secured.txt komutunu kullanın.Use sensible-editor cloud-init-secured.txt to create the file and see a list of available editors. Başta birinci satır olmak üzere cloud-init dosyasının tamamının doğru bir şekilde kopyalandığından emin olun:Make sure that the whole cloud-init file is copied correctly, especially the first line:

#cloud-config
package_upgrade: true
packages:
  - nginx
  - nodejs
  - npm
write_files:
  - owner: www-data:www-data
    path: /etc/nginx/sites-available/default
    content: |
      server {
        listen 80;
        listen 443 ssl;
        ssl_certificate /etc/nginx/ssl/mycert.cert;
        ssl_certificate_key /etc/nginx/ssl/mycert.prv;
        location / {
          proxy_pass http://localhost:3000;
          proxy_http_version 1.1;
          proxy_set_header Upgrade $http_upgrade;
          proxy_set_header Connection keep-alive;
          proxy_set_header Host $host;
          proxy_cache_bypass $http_upgrade;
        }
      }
  - owner: azureuser:azureuser
    path: /home/azureuser/myapp/index.js
    content: |
      var express = require('express')
      var app = express()
      var os = require('os');
      app.get('/', function (req, res) {
        res.send('Hello World from host ' + os.hostname() + '!')
      })
      app.listen(3000, function () {
        console.log('Hello world app listening on port 3000!')
      })
runcmd:
  - secretsname=$(find /var/lib/waagent/ -name "*.prv" | cut -c -57)
  - mkdir /etc/nginx/ssl
  - cp $secretsname.crt /etc/nginx/ssl/mycert.cert
  - cp $secretsname.prv /etc/nginx/ssl/mycert.prv
  - service nginx restart
  - cd "/home/azureuser/myapp"
  - npm init
  - npm install express -y
  - nodejs index.js

Güvenli VM oluşturmaCreate secure VM

Şimdi az vm create ile bir VM oluşturun.Now create a VM with az vm create. Bu sertifika verileri, --secrets parametresiyle Key Vault’tan eklenir.The certificate data is injected from Key Vault with the --secrets parameter. Önceki örnekte olduğu gibi --custom-data parametresi ile de cloud-init yapılandırmasını geçirirsiniz:As in the previous example, you also pass in the cloud-init config with the --custom-data parameter:

az vm create \
    --resource-group myResourceGroupAutomate \
    --name myVMSecured \
    --image UbuntuLTS \
    --admin-username azureuser \
    --generate-ssh-keys \
    --custom-data cloud-init-secured.txt \
    --secrets "$vm_secret"

VM’nin oluşturulması, paketlerin yüklenmesi ve uygulamanın başlatılması birkaç dakika sürebilir.It takes a few minutes for the VM to be created, the packages to install, and the app to start. Azure CLI sizi isteme geri döndürdükten sonra çalışmaya devam eden arka plan görevleri vardır.There are background tasks that continue to run after the Azure CLI returns you to the prompt. Uygulamaya erişmeniz birkaç dakika sürebilir.It may be another couple of minutes before you can access the app. VM oluşturulduktan sonra, Azure CLI tarafından görüntülenen publicIpAddress değerini not edin.When the VM has been created, take note of the publicIpAddress displayed by the Azure CLI. Bu adres, web tarayıcısı aracılığıyla Node.js uygulamasına erişmek için kullanılır.This address is used to access the Node.js app via a web browser.

Güvenli web trafiğinin VM’nize erişmesine izin vermek için, az vm open-port komutuyla internette 443 numaralı bağlantı noktasını açın:To allow secure web traffic to reach your VM, open port 443 from the Internet with az vm open-port:

az vm open-port \
    --resource-group myResourceGroupAutomate \
    --name myVMSecured \
    --port 443

Güvenli web uygulamasını test etmeTest secure web app

Artık bir web tarayıcısı açın ve girin https://<Publicıpaddress > adres çubuğundaki.Now you can open a web browser and enter https://<publicIpAddress> in the address bar. Önceki VM oluşturma işleminin çıkışında gösterildiği gibi kendi genel IP adresinizi girin.Provide your own public IP address as shown in the output of the previous VM create process. Otomatik olarak imzalanan sertifika kullanıyorsanız güvenlik uyarısını kabul edin:Accept the security warning if you used a self-signed certificate:

Web tarayıcısı güvenlik uyarısını kabul edin

Güvenli NGINX siteniz ve Node.js uygulamanız aşağıdaki örnekte olduğu gibi görüntülenir:Your secured NGINX site and Node.js app is then displayed as in the following example:

Çalışan güvenli NGINX sitesini görüntüleme

Sonraki adımlarNext steps

Bu öğreticide, cloud-init ile ilk önyüklemede VM’leri yapılandırdınız.In this tutorial, you configured VMs on first boot with cloud-init. Şunları öğrendiniz:You learned how to:

  • cloud-init yapılandırma dosyası oluşturmaCreate a cloud-init config file
  • cloud-init dosyası kullanan bir sanal makine oluşturmaCreate a VM that uses a cloud-init file
  • Sanal makine oluşturulduktan sonra çalıştırılan bir Node.js uygulamasını görüntülemeView a running Node.js app after the VM is created
  • Sertifikaları güvenli şekilde depolamak için Key Vault’u kullanmaUse Key Vault to securely store certificates
  • cloud-init ile güvenli NGINX dağıtımlarını otomatikleştirmeAutomate secure deployments of NGINX with cloud-init

Özel VM görüntülerinin nasıl oluşturulacağını öğrenmek için sonraki öğreticiye geçin.Advance to the next tutorial to learn how to create custom VM images.