Dodawanie elastyczności przy użyciu parametrów i zmiennych
Szablony są zaawansowane ze względu na ich możliwość ponownego zastosowania. Możesz użyć Bicep do pisania szablonów, które wdrażają wiele środowisk lub kopii zasobów.
Twoja firma regularnie uruchamia nowe produkty i musisz użyć szablonów Bicep, aby utworzyć zasoby platformy Azure wymagane dla każdego uruchomienia produktu. Należy unikać używania stałych nazw zasobów. Wiele typów zasobów platformy Azure wymaga unikatowych nazw, dlatego osadzanie nazw w szablonie oznacza, że nie można ponownie użyć szablonu na potrzeby wielu uruchomień produktów. Musisz również wdrożyć zasoby w różnych lokalizacjach w zależności od tego, gdzie zabawki zostaną uruchomione, co oznacza, że nie można osadzić lokalizacji zasobów w szablonie.
W tej lekcji poznasz parametry i zmienne, które są dwiema funkcjami Bicep, które mogą sprawić, że szablony będą elastyczne i wielokrotnego użytku. Zostaną również wprowadzone wyrażenia.
Uwaga
Polecenia w tej lekcji są wyświetlane w celu zilustrowania pojęć. Nie uruchamiaj jeszcze poleceń. Będziesz ćwiczyć to, czego nauczysz się tutaj wkrótce.
Parametry i zmienne
Parametr umożliwia wprowadzanie wartości spoza pliku szablonu. Jeśli na przykład ręcznie wdrażasz szablon przy użyciu interfejsu wiersza polecenia platformy Azure lub programu Azure PowerShell, zostanie wyświetlony monit o podanie wartości dla każdego parametru. Można również utworzyć plik parametrów, który zawiera listę wszystkich parametrów i wartości, których chcesz użyć do wdrożenia. Jeśli szablon zostanie wdrożony z zautomatyzowanego procesu, takiego jak potok wdrażania, potok może podać wartości parametrów.
Zmienna jest definiowana i ustawiana w szablonie. Zmienne umożliwiają przechowywanie ważnych informacji w jednym miejscu i odwoływanie się do nich w całym szablonie bez konieczności kopiowania i wklejania.
Zazwyczaj dobrym pomysłem jest użycie parametrów dla elementów, które zmienią się między poszczególnymi wdrożeniami, na przykład:
- Nazwy zasobów, które muszą być unikatowe.
- Lokalizacje, w których mają zostać wdrożone zasoby.
- Ustawienia wpływające na ceny zasobów, takie jak ich jednostki SKU, warstwy cenowe i liczniki wystąpień.
- Poświadczenia i informacje potrzebne do uzyskania dostępu do innych systemów, które nie są zdefiniowane w szablonie.
Zmienne są zwykle dobrą opcją, gdy użyjesz tych samych wartości dla każdego wdrożenia, ale chcesz zmienić wartość na wielokrotne użycie w szablonie lub gdy chcesz użyć wyrażeń do utworzenia wartości złożonej. Można również używać zmiennych dla zasobów, które nie wymagają unikatowych nazw.
Napiwek
Ważne jest, aby używać dobrego nazewnictwa dla parametrów i zmiennych, więc szablony są łatwe do odczytania i zrozumienia. Upewnij się, że używasz przejrzystych, opisowych i spójnych nazw.
Dodawanie parametru
W pliku Bicep można zdefiniować parametr podobny do następującego:
param appServiceAppName string
Przyjrzyjmy się, jak działa każda część tej definicji:
param
informuje Bicep, że definiujesz parametr.appServiceAppName
to nazwa parametru. Jeśli wdrażasz szablon ręcznie, może zostać wyświetlony monit o wprowadzenie wartości, dlatego ważne jest, aby nazwa była jasna i zrozumiała. Nazwa jest również sposobem odwoływania się do wartości parametru w szablonie, podobnie jak w przypadku nazw symbolicznych zasobów.string
jest typem parametru. Można określić kilka różnych typów parametrów Bicep, w tymstring
dla tekstu,int
liczb ibool
wartości logicznych true lub false. Można również przekazać bardziej złożone parametry przy użyciuarray
typów iobject
.
Napiwek
Spróbuj nie uogólnić szablonów za pomocą zbyt wielu parametrów. Należy użyć minimalnej liczby parametrów potrzebnych w scenariuszu biznesowym. Pamiętaj, że zawsze możesz zmienić szablony w przyszłości, jeśli wymagania się zmienią.
Podaj wartości domyślne
Opcjonalnie możesz podać wartość domyślną parametru. Po określeniu wartości domyślnej parametr staje się opcjonalny. Osoba wdrażająca szablon może określić wartość, jeśli chce, ale jeśli tak nie jest, Bicep używa wartości domyślnej.
Poniżej przedstawiono sposób dodawania wartości domyślnej:
param appServiceAppName string = 'toy-product-launch-1'
Uwaga
W tym przykładzie nazwa aplikacji usługi aplikacja systemu Azure Service ma ustaloną wartość domyślną. Nie jest to dobry pomysł, ponieważ aplikacje usługi App Service potrzebują unikatowych nazw. Wkrótce to naprawisz.
Używanie wartości parametrów w szablonie
Po zadeklarowaniu parametru możesz odwołać się do niego w pozostałej części szablonu. Zobaczmy, jak można użyć nowego parametru w definicji zasobu:
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
name: appServiceAppName
location: 'eastus'
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
Zwróć uwagę, że szablon używa teraz wartości parametru do ustawienia nazwy zasobu aplikacji zamiast wartości zakodowanej na podstawie kodu.
Napiwek
Rozszerzenie Bicep dla programu Visual Studio Code pokazuje wskaźniki wizualne, aby poinformować Cię, gdy nie przestrzegasz zalecanych rozwiązań. Na przykład zostanie wyświetlony ostrzeżenie, jeśli zdefiniujesz parametr, którego nie używasz. Linter Bicep stale uruchamia te kontrole podczas pracy.
Dodawanie zmiennej
Możesz zdefiniować zmienną w następujący sposób:
var appServicePlanName = 'toy-product-launch-plan'
Zmienne są definiowane w podobny sposób do parametrów, ale istnieje kilka różnic:
- Użyj słowa kluczowego
var
, aby poinformować Bicep, że deklarujesz zmienną. - Musisz podać wartość zmiennej.
- Zmienne nie potrzebują typów. Bicep może określić typ na podstawie ustawionej wartości.
Wyrażenia
Podczas pisania szablonów często nie chcesz zapisywać wartości w kodzie, a nawet prosić o ich określenie w parametrze. Zamiast tego chcesz odnajdywać wartości podczas uruchamiania szablonu. Na przykład prawdopodobnie chcesz wdrożyć wszystkie zasoby w szablonie w jednym regionie świadczenia usługi Azure: regionie, w którym utworzono grupę zasobów. Możesz też automatycznie utworzyć unikatową nazwę zasobu na podstawie określonej strategii nazewnictwa używanej przez firmę.
Wyrażenia w Bicep to zaawansowana funkcja, która ułatwia obsługę różnych interesujących scenariuszy. Przyjrzyjmy się kilku miejscom, w których można używać wyrażeń w szablonie Bicep.
Lokalizacje zasobów
Podczas pisania i wdrażania szablonu często nie trzeba określać lokalizacji każdego zasobu osobno. Zamiast tego może istnieć prosta reguła biznesowa, która domyślnie wdraża wszystkie zasoby w tej samej lokalizacji, w której została utworzona grupa zasobów.
W Bicep możesz utworzyć parametr o nazwie location
, a następnie użyć wyrażenia, aby ustawić jego wartość:
param location string = resourceGroup().location
Przyjrzyj się wartości domyślnej tego parametru. Używa funkcji o nazwie resourceGroup()
, która zapewnia dostęp do informacji o grupie zasobów, w której jest wdrażany szablon. W tym przykładzie szablon używa location
właściwości . Tego podejścia często używa się do wdrażania zasobów w tym samym regionie świadczenia usługi Azure co grupa zasobów.
Jeśli ktoś wdraża ten szablon, może zdecydować się zastąpić tutaj wartość domyślną i użyć innej lokalizacji.
Uwaga
Niektóre zasoby na platformie Azure można wdrożyć tylko w określonych lokalizacjach. Może być konieczne oddzielne parametry, aby ustawić lokalizacje tych zasobów.
Teraz możesz użyć parametru lokalizacji zasobu wewnątrz szablonu, w następujący sposób:
resource appServiceApp 'Microsoft.Web/sites@2023-12-01' = {
name: appServiceAppName
location: location
properties: {
serverFarmId: appServicePlan.id
httpsOnly: true
}
}
Nazwy zasobów
Wiele zasobów platformy Azure wymaga unikatowych nazw. W swoim scenariuszu masz dwa zasoby, które wymagają unikatowych nazw: konta magazynu i aplikacji usługi App Service. Prośba o ustawienie tych wartości jako parametrów może utrudnić niezależnie od tego, kto używa szablonu, ponieważ musi znaleźć nazwę, której nikt inny nie użył.
Bicep ma inną funkcję o nazwie uniqueString()
, która przydaje się podczas tworzenia nazw zasobów. W przypadku korzystania z tej funkcji należy podać wartość inicjatora, która powinna być inna w różnych wdrożeniach, ale spójna we wszystkich wdrożeniach dla tych samych zasobów.
Jeśli wybierzesz dobrą wartość inicjatora, możesz uzyskać tę samą nazwę za każdym razem, gdy wdrożysz ten sam zestaw zasobów, ale otrzymasz inną nazwę za każdym razem, gdy wdrożysz inny zestaw zasobów przy użyciu tego samego szablonu. Przyjrzyjmy się, jak można użyć uniqueString()
funkcji:
param storageAccountName string = uniqueString(resourceGroup().id)
Wartość domyślna tego parametru resourceGroup()
ponownie używa funkcji, tak jak podczas ustawiania lokalizacji zasobu. Tym razem jednak otrzymujesz identyfikator grupy zasobów. Oto, jak wygląda identyfikator grupy zasobów:
/subscriptions/aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e/resourceGroups/MyResourceGroup
Identyfikator grupy zasobów zawiera identyfikator subskrypcji platformy Azure (aaaa0a0a-bb1b-cc2c-dd3d-eeeeee4e4e4e
) i nazwę grupy zasobów (MyResourceGroup
). Identyfikator grupy zasobów jest często dobrym kandydatem na wartość inicjatora nazw zasobów, ponieważ:
- Za każdym razem, gdy wdrażasz te same zasoby, będą one przechodzić do tej samej grupy zasobów. Funkcja
uniqueString()
będzie zwracać tę samą wartość za każdym razem. - W przypadku wdrożenia w dwóch różnych grupach zasobów w subskrypcji platformy Azure wartość będzie inna,
resourceGroup().id
ponieważ nazwy grup zasobów będą inne. FunkcjauniqueString()
da różne wartości dla każdego zestawu zasobów. - Jeśli wdrażasz w dwóch różnych subskrypcjach platformy Azure, nawet jeśli używasz tej samej nazwy grupy zasobów, wartość będzie inna,
resourceGroup().id
ponieważ identyfikator subskrypcji platformy Azure będzie inny. FunkcjauniqueString()
ponownie nada różne wartości dla każdego zestawu zasobów.
Napiwek
Często dobrym pomysłem jest użycie wyrażeń szablonu do tworzenia nazw zasobów. Wiele typów zasobów platformy Azure ma reguły dotyczące dozwolonych znaków i długości ich nazw. Osadzanie tworzenia nazw zasobów w szablonie oznacza, że każda osoba korzystająca z szablonu nie musi pamiętać, aby samodzielnie przestrzegać tych reguł.
Połączone ciągi
Jeśli po prostu używasz uniqueString()
funkcji do ustawiania nazw zasobów, prawdopodobnie uzyskasz unikatowe nazwy, ale nie będą one istotne. Dobra nazwa zasobu powinna być również opisowa, aby było jasne, do czego służy zasób. Często warto utworzyć nazwę, łącząc zrozumiały wyraz lub ciąg z unikatową wartością. W ten sposób będziesz mieć zasoby, które mają zarówno znaczące , jak i unikatowe nazwy.
Bicep ma funkcję o nazwie interpolacja ciągów, która umożliwia łączenie ciągów. Zobaczmy, jak to działa:
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'
Wartość domyślna parametru storageAccountName
ma teraz dwie części:
toylaunch
to zakodowany ciąg, który ułatwia każdemu, kto patrzy na wdrożony zasób na platformie Azure, aby zrozumieć przeznaczenie konta magazynu.${uniqueString(resourceGroup().id)}
to sposób informowania Bicep o ocenie danych wyjściowychuniqueString(resourceGroup().id)
funkcji, a następnie łączenie jej w ciąg.
Napiwek
Czasami uniqueString()
funkcja tworzy ciągi rozpoczynające się od liczby. Niektóre zasoby platformy Azure, takie jak konta magazynu, nie zezwalają na rozpoczynanie ich nazw od liczb. Oznacza to, że dobrym pomysłem jest użycie interpolacji ciągów do tworzenia nazw zasobów, takich jak w poprzednim przykładzie.
Wybieranie jednostek SKU dla zasobów
Inni członkowie zespołu są pod wrażeniem utworzonego do tej pory kodu Bicep. Podjęto decyzję, że użyjesz szablonu do wdrożenia zasobów w celu obsługi wszystkich nowych uruchomień.
Jeden z Twoich współpracowników zasugerował, że utworzysz środowiska nieprodukcyjne dla każdego uruchomienia produktu, aby pomóc zespołowi ds. marketingu przetestować witryny przed udostępnieniem ich klientom. Jednak chcesz upewnić się, że nie wydajesz zbyt dużo pieniędzy na środowiska nieprodukcyjne, więc decydujesz się na niektóre zasady razem:
- W środowiskach produkcyjnych konta magazynu zostaną wdrożone w jednostce
Standard_GRS
SKU (magazynu geograficznie nadmiarowego) w celu zapewnienia wysokiej odporności. Plany usługi App Service zostaną wdrożone w jednostceP2v3
SKU w celu zapewnienia wysokiej wydajności. - W środowiskach nieprodukcyjnych konta magazynu zostaną wdrożone w jednostce
Standard_LRS
SKU (magazyn lokalnie nadmiarowy). Plany usługi App Service zostaną wdrożone w bezpłatnejF1
jednostce SKU.
Jednym ze sposobów wdrożenia tych wymagań biznesowych jest użycie parametrów w celu określenia każdej jednostki SKU. Jednak określenie każdej jednostki SKU jako parametru może być trudne do zarządzania, zwłaszcza w przypadku większych szablonów. Inną opcją jest osadzanie reguł biznesowych w szablonie przy użyciu kombinacji parametrów, zmiennych i wyrażeń.
Najpierw można określić parametr wskazujący, czy wdrożenie jest przeznaczone dla środowiska produkcyjnego, czy nieprodukcyjnego:
@allowed([
'nonprod'
'prod'
])
param environmentType string
Zwróć uwagę, że ten kod używa nowej składni, aby określić listę dozwolonych wartości parametru environmentType
. Bicep nie pozwoli nikomu wdrożyć szablonu, chyba że podają jedną z tych wartości.
Następnie możesz utworzyć zmienne, które określają jednostki SKU do użycia dla konta magazynu i planu usługi App Service w oparciu o środowisko:
var storageAccountSkuName = (environmentType == 'prod') ? 'Standard_GRS' : 'Standard_LRS'
var appServicePlanSkuName = (environmentType == 'prod') ? 'P2V3' : 'F1'
Zwróć też uwagę na nową składnię. Podzielmy go na:
(environmentType == 'prod')
oblicza wartość logiczną (prawda lub fałsz), w zależności od dozwolonej wartości parametruenvironmentType
.?
jest nazywany operatoremternary i ocenia instrukcjęif/then
. Wartość po operatorze?
jest używana, jeśli wyrażenie ma wartość true. Jeśli wyrażenie zwróci wartość false, zostanie użyta wartość po dwukropku (:
).
Możemy przetłumaczyć te reguły na:
- W przypadku zmiennej
storageAccountSkuName
, jeślienvironmentType
parametr jest ustawiony naprod
wartość , użyj jednostkiStandard_GRS
SKU. W przeciwnym razie użyj jednostkiStandard_LRS
SKU. - W przypadku zmiennej
appServicePlanSkuName
, jeślienvironmentType
parametr jest ustawiony naprod
, użyj jednostkiP2V3
SKU i warstwyPremiumV3
. W przeciwnym razie użyj jednostkiF1
SKU.
Napiwek
Podczas tworzenia wyrażeń wieloczęściowych, takich jak to, najlepiej używać zmiennych, a nie osadzania wyrażeń bezpośrednio we właściwościach zasobu. Ułatwia to odczytywanie i zrozumienie szablonów, ponieważ pozwala uniknąć zaśmiecania definicji zasobów za pomocą logiki.
Gdy używasz parametrów, zmiennych i wyrażeń w szablonie, możesz ponownie użyć szablonu i szybko wdrożyć nowy zestaw zasobów. Na przykład za każdym razem, gdy dział marketingu poprosi Cię o wdrożenie nowej witryny internetowej na potrzeby następnego uruchomienia, należy podać nowe wartości parametrów dla każdego wdrożonego środowiska i zostanie ustawiona!