Azure Resource Manager JSON

Łukasz Cholewa

Azure Resource Manager JSON
Maj 5, 2017 Katarzyna Sobczak

Azure Resource Manager JSON

Portal Azure Resources – modyfikacje elementów za pomocą JSON.

Przedstawię dzisiaj jedną z możliwości portalu https://resources.azure.com, w którym będziemy dokonywać edycji maszyny wirtualnej za pomocą JSON.

Edycja maszyny wirtualnej to tylko jedna z wielu możliwości jakie daje nam zarówno w/w portal oraz JSON. Możemy tak naprawdę dokonywać zarówno edycji, jak i tworzenia nowych elementów z poziomu kodu. Portal jest bardzo czytelny i  przyjemny w poruszaniu się, wszystkie elementy mają logiczny układ.

Jeżeli nie jesteśmy programistami lub nie mamy czasu na zabawę w kodzie od podstaw, możemy skorzystać z gotowych skryptów, które pomogą nam uruchomić np. nasze środowisko do testów. Skrypty są dostępne na stronie https://github.com/Azure, gotowe w formacie JSON do implementacji.

Do szczegółowego zapoznania się z JSON odsyłam do dokumentacji Microsoft.

 

Wymagania wstępne:

  1. Posiadanie aktywnej subskrypcji Azure
  2. Utworzona maszyna wirtualna
  3. Notepad++ 😉

Rozpoczynamy od zalogowania się na portal https://resources.azure.com, gdzie przechodzimy do wyboru sekcji, w której znajduje się nasza maszyna wirtualna. Postępujemy zgodnie ze schematem rozwijając po kolei:

  1. Subscriptions
  2. ResourceGroups
  3. Microsoft.Compute
  4. Virtual Machines

Następnym krokiem jest wybór maszyny wirtualnej, w moim przypadku to „TestVM1”.

Zmieniamy uprawnienia w witrynie z Read Only na Read/Write.

Przechodzi do skopiowania całego kodu maszyny wirtualnej w formacie JSON.

Wklejamy kod do naszego ulubionego edytora tekstu. Ja korzystam z Notepad++ , ponieważ potrafi podczas edycji przypisać format kodu JSON do pliku. Jest to bardzo wygodne ze względu na widok kodu i jego układ.

Teraz przechodzimy do edycji kodu. Musimy pozbyć się „niepotrzebnych” wpisów oraz edytować istniejące elementy. Poniżej zamieszczę sekcje, które zostały usunięte z kodu.

Tak wygląda cały kod maszyny wirtualnej, nie jest zbyt „userfirendly” 😊 i zaraz to zmienimy. Kod zamieszczam w postaci pliku TXT, ponieważ w tekście zajmie zbyt dużo miejsca.

Poniżej umieszczone zostały usunięte całe sekcje oraz poszczególne elementy kodu:

Sekcja zawiera numer unikalny maszyny, kasujemy go, ponieważ zostanie nadany nowy, unikalny numer.


 "vmId": "29ccd31f-49fb-4282-ad46-81dd2d2de300",

Image Reference zawiera informacje o obrazie systemu operacyjnego, którego tutaj nie będziemy używać, ponieważ edytujemy maszynę wirtualną z już zainstalowanym systemem.


"imageReference": { 
        "publisher": "MicrosoftWindowsServer", 
        "offer": "WindowsServer", 
        "sku": "2016-Datacenter", 
        "version": "latest", 
        "id": "(string)" 
      },

Dodatkowe pola, które nie zawierają żadnych danych i przez to nie są nam potrzebne.


"encryptionSettings": { 
          "diskEncryptionKey": { 
            "secretUrl": "(string)", 
            "sourceVault": { 
              "id": "(string)" 
            } 
          }, 
          "keyEncryptionKey": { 
            "keyUrl": "(string)", 
            "sourceVault": { 
              "id": "(string)" 
            } 
          }, 
          "enabled": "(boolean)" 
        }, 
        "image": { 
          "uri": "(string)" 
        }, 
        "diskSizeGB": "(integer)", 
        "managedDisk": { 
          "id": "(string)", 
          "storageAccountType": "(string)" 
        } 
      }, 
{ 
          "lun": "(integer)", 
          "name": "(string)", 
          "vhd": { 
            "uri": "(string)" 
          }, 
          "image": { 
            "uri": "(string)" 
          }, 
          "caching": "(string)", 
          "createOption": "(string)", 
          "diskSizeGB": "(integer)", 
 
          "managedDisk": { 
            "id": "(string)", 
            "storageAccountType": "(string)" 
          } 
        }

OsProfile zawiera informacje o konfiguracji systemu operacyjnego, np. login administratora czy też nazwę komputera.


"osProfile": { 
      "computerName": "TestVM1", 
      "adminUsername": "lcholewa", 
      "windowsConfiguration": { 
        "provisionVMAgent": true, 
        "enableAutomaticUpdates": true, 
        "timeZone": "(string)", 
        "additionalUnattendContent": [ 
          { 
            "passName": "(string)", 
            "componentName": "(string)", 
            "settingName": "(string)", 
            "content": "(string)" 
          } 
        ], 
        "winRM": { 
          "listeners": [ 
            { 
              "protocol": "(string)", 
              "certificateUrl": "(string)" 
            }  
          ] 
        } 
      }, 
      "secrets": [ 
        { 
          "sourceVault": { 
            "id": "(string)" 
          }, 
          "vaultCertificates": [ 
            { 
              "certificateUrl": "(string)", 
              "certificateStore": "(string)" 
            } 
          ] 
        } 
      ], 
      "adminPassword": "(string)", 
      "customData": "(string)", 
      "linuxConfiguration": { 
        "disablePasswordAuthentication": "(boolean)", 
        "ssh": { 
          "publicKeys": [ 
            { 
              "path": "(string)", 
              "keyData": "(string)" 
            } 
          ] 
        } 
      } 
    }, 
{ 
          "id": "(string)", 
          "properties": { 
            "primary": "(boolean)" 
          } 
        }

provisioningState zawiera informacje o statusie maszyny w Azure. Wpis będzie utworzony na nowo.


 "provisioningState": "Succeeded",

Ponownie puste sekcje, które nie zostały wykorzystane.


"diagnosticsProfile": { 
      "bootDiagnostics": { 
        "enabled": "(boolean)", 
        "storageUri": "(string)" 
      } 
    }, 
"availabilitySet": { 
      "id": "(string)" 
    }, 
"instanceView": { 
      "platformUpdateDomain": "(integer)", 
      "platformFaultDomain": "(integer)",
      "rdpThumbPrint": "(string)",
      "vmAgent": {
        "vmAgentVersion": "(string)",
        "extensionHandlers": [
          {
            "type": "(string)",
            "typeHandlerVersion": "(string)",
            "status": {
              "code": "(string)",
              "level": "(string)",
              "displayStatus": "(string)",
              "message": "(string)",
              "time": "(string)"
            }
          }
        ],
        "statuses": [
          {
            "code": "(string)",
            "level": "(string)",
            "displayStatus": "(string)",
            "message": "(string)",
            "time": "(string)"
          }
        ]
      },
      "disks": [
        {
          "name": "(string)",
          "statuses": [
            {
              "code": "(string)",
              "level": "(string)",
              "displayStatus": "(string)",
              "message": "(string)",
              "time": "(string)"
            }
          ]
        }
      ],
      "extensions": [
        {
          "name": "(string)",
          "type": "(string)",
          "typeHandlerVersion": "(string)",
          "substatuses": [
            {
              "code": "(string)",
              "level": "(string)",
              "displayStatus": "(string)",
              "message": "(string)",
              "time": "(string)"
            }
          ],
          "statuses": [
            {
              "code": "(string)",
              "level": "(string)",
              "displayStatus": "(string)",
              "message": "(string)",
              "time": "(string)"
            }
          ]
        }
      ],
      "bootDiagnostics": {
        "consoleScreenshotBlobUri": "(string)",
        "serialConsoleLogBlobUri": "(string)"
      },
      "statuses": [
        {
          "code": "(string)",
          "level": "(string)",
          "displayStatus": "(string)",
          "message": "(string)",
          "time": "(string)"
        }
      ]
    },
    "licenseType": "(string)"
  },
"tags": {},
  "plan": {
    "name": "(string)",
    "publisher": "(string)",
    "product": "(string)",
    "promotionCode": "(string)"
  },
  "resources": [
    {
      "id": "(string)",
      "name": "(string)",
      "type": "(string)",
      "location": "(string)",
      "tags": {},
      "properties": {
        "forceUpdateTag": "(string)",
        "publisher": "(string)",
        "type": "(string)",
        "typeHandlerVersion": "(string)",
        "autoUpgradeMinorVersion": "(boolean)",
        "settings": {},
        "protectedSettings": {},
        "provisioningState": "(string)",
        "instanceView": {
          "name": "(string)",
          "type": "(string)",
          "typeHandlerVersion": "(string)",
          "substatuses": [
            {
              "code": "(string)",
              "level": "(string)",
              "displayStatus": "(string)",
              "message": "(string)",
              "time": "(string)"
            }
          ],
          "statuses": [
            {
              "code": "(string)",
              "level": "(string)",
              "displayStatus": "(string)",
              "message": "(string)",
              "time": "(string)"
            }
          ]
        }
      }
    }
  ],
  "identity": {
    "principalId": "(string)",
    "tenantId": "(string)",
    "type": "(string)"
  }

Tak wygląda nasz kod po skasowaniu sekcji. Jak widać, wygląda lepiej. Teraz musimy dokonać ostatecznej edycji kodu poprzez kasowanie przecinków, nawiasów i zmianę nazw pól.


{
  "properties": {
    "hardwareProfile": {
      "vmSize": "Basic_A0"
    },
    "storageProfile": {     
      "osDisk": {
        "osType": "Windows",
        "name": "TestVM1",
        "createOption": "FromImage",
        "vhd": {
          "uri": "https://democlients7664.blob.core.windows.net/vhds/TestVM120170501203642.vhd"
        },
        "caching": "ReadWrite",
       
      "dataDisks": [
       
      ]
    },
   
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "/subscriptions/22g25809-526c-4d69-785dd-44b748bjhgasd50/resourceGroups/DemoClients/providers/Microsoft.Network/networkInterfaces/testvm1959"
        },
       
      ]
    },
   
   
   
  "type": "Microsoft.Compute/virtualMachines",
  "location": "westeurope",
  "id": "/subscriptions/22g25809-526c-4d69-785dd-44b748bjhgasd50/resourceGroups/DemoClients/providers/Microsoft.Compute/virtualMachines/TestVM1",
  "name": "TestVM1",
 
}

Gotowy, zamieszczony poniżej kod jest już możliwy do wgrania do Azure.

Zmieniłem pola z zapisów:

  • “createOption”: “FromImage”,
  • “name”: “TestVM1”

na zapisy przedstawione poniżej:

  • “createOption”: “Attach”, – Dlatego, że nie wykonujemy tworzenia maszyny wirtualnej z obrazu, tylko dodajemy już istniejący dysk.
  •   “name”: “TestVM1Modified” – Zmieniamy nazwę maszyny wirtualnej na nową.

{
  "properties": {
    "hardwareProfile": {
      "vmSize": "Basic_A0"
    },
    "storageProfile": {     
      "osDisk": {
        "osType": "Windows",
        "name": "TestVM1Modified",
        "createOption": "Attach",
        "vhd": {
          "uri": "https://democlients7664.blob.core.windows.net/vhds/TestVM120170501203642.vhd"
        },
        "caching": "ReadWrite"                 
      },
      "dataDisks": [       
      ]
    },   
    "networkProfile": {
      "networkInterfaces": [
        {
          "id": "/subscriptions/22g25809-526c-4d69-785dd-44b748bjhgasd50/resourceGroups/DemoClients/providers/Microsoft.Network/networkInterfaces/testvm1959"
        }       
      ]
                              }
               },   
  "type": "Microsoft.Compute/virtualMachines",
  "location": "westeurope",
  "id": "/subscriptions/22g25809-526c-4d69-785dd-44b748bjhgasd50/resourceGroups/DemoClients/providers/Microsoft.Compute/virtualMachines/TestVM1",
  "name": "TestVM1Modified"
}

Mamy już gotowy kod, możemy zatem przystąpić do skasowania naszej maszyny wirtualnej z poziomu portalu. Wykonujemy to za pomocą opcje „Delete” w zakładce „Actions (POST,DELETE)”

kasowanie maszyny wirtualnej z poziomu portalu

Po kilku chwilach możemy dodać nasz kod – wybieramy opcję „Create”, kasujemy cały schemat kodu i wklejamy ten z notatnika.

dodawanie kodu

Przepisujemy nazwę maszyny wirtualnej i wybieramy opcję „PUT”

maszyny wirtualne

Po paru sekundach maszyna wirtualna pojawi się na liście ze statusem „Creating”

maszyna wirtualna creating

Oczekiwany wynik to “provisioningState”: “Succeeded”

JSON test

Sprawdzamy z poziomu portalu możliwość zalogowania się do maszyny wirtualnej pobierając plik RDP.

Sprawdzenie możliwości zalogowania się do maszyny wirtualnej

Jak widać maszyna działa i ma się dobrze.

maszyna wirtualna

Podsumowując: edycja maszyny wirtualnej nie jest skomplikowanym procesem. Kod na początku może przerażać, ale po bliższym zapoznaniu nie jest trudny do okiełznania. Jeżeli zajdzie potrzeba edycji dodatkowych elementów, takich jak np. sieć czy VPN Gateway, wykonamy je w podobny sposób w portalu.

Podziel się

Autor: Łukasz Cholewa

Łukasz Cholewa

Łukasz Cholewa

Zespół: Data Center

Ostatnie artykuły autora

Jak napisać skrypt w PowerShell i zabezpieczyć poświadczenia

Jak napisać skrypt w PowerShell i zabezpieczyć poświadczenia

Zdarza się, że trzeba przygotować skrypt, który wykona za nas jakieś zadanie, a wymagane są do tego poświadczenia. W artykule pokażę jak ustrzec się przed kompromitację poświadczeń i naruszeniem bezpieczeństwa.

Import/Export na żądanie w Azure część 2

Import/Export na żądanie w Azure część 2

W tym artykule opiszę jak stworzyć API przechowywującą listę zakupów w oparciu o ASP.NET Core na platformę Linux.

Azure Resource Manager JSON

Azure Resource Manager JSON

Portal Azure Resources – modyfikacje elementów za pomocą JSON.

Skontaktuj się z Łukaszem

 

Administratorem danych gromadzonych z wykorzystaniem formularza jest A.P.N. Promise S.A. Podane przez Ciebie dane będą przetwarzane w zakresie niezbędnym do podjęcia kontaktu lub realizacji określonego żądania zgodnie z art. 6 ust. 1 lit. b RODO przez okres niezbędny dla realizacji Twojego zgłoszenia. Wszelkie informacje w zakresie przetwarzania podanych przez Ciebie w formularzu danych oraz posiadanych uprawnieniach znajdziesz w Polityce prywatności. Kliknij i dowiedz się więcej jeżeli informacje podane powyżej nie są dostatecznie jasne!