Udostępnij za pośrednictwem


Dane wyjściowe w Bicep

W tym artykule opisano sposób definiowania wartości wyjściowych w pliku Bicep. Dane wyjściowe są używane, gdy trzeba zwracać wartości z wdrożonych zasobów. Masz ograniczenie do 64 wyników w pliku Bicep. Aby uzyskać więcej informacji, zobacz Limity szablonów.

Definiowanie danych wyjściowych

Składnia definiująca wartość wyjściową to:

output <name> <data-type or type-expression> = <value>

Dane wyjściowe mogą mieć taką samą nazwę jak parametr, zmienna, moduł lub zasób. Każda wartość wyjściowa musi odnosić się do jednego z typów danych lub jednego z typów danych zdefiniowanych przez użytkownika w Bicep.

W poniższym przykładzie pokazano, jak zwrócić właściwość z wdrożonego zasobu. W tym przykładzie publicIP to nazwa symboliczna publicznego adresu IP wdrożonego w pliku Bicep. Wartość wyjściowa pobiera w pełni kwalifikowaną nazwę domeny dla publicznego adresu IP:

output hostname string = publicIP.properties.dnsSettings.fqdn

W następnym przykładzie pokazano, jak zwrócić dane wyjściowe różnych typów:

output stringOutput string = deployment().name
output integerOutput int = length(environment().authentication.audiences)
output booleanOutput bool = contains(deployment().name, 'demo')
output arrayOutput array = environment().authentication.audiences
output objectOutput object = subscription()

Jeśli musisz wyświetlić właściwość, która ma łącznik w nazwie, użyj nawiasów kwadratowych wokół nazwy zamiast notacji kropkowej. Na przykład użyj polecenia ['property-name'] zamiast .property-name.

var user = {
  'user-name': 'Test Person'
}

output stringOutput string = user['user-name']

W poniższym przykładzie pokazano, jak używać wyrażenia typu:

param foo 'a' | 'b' = 'a'

output out 'a' | 'b' = foo

Korzystanie z dekoratorów

Dekoratory są zapisywane w formacie @expression i są umieszczane powyżej deklaracji wyjściowych. W poniższej tabeli przedstawiono dostępne modyfikatory dla wyników:

Dekorator Aplikuj do Argumentacja opis
opis wszystkie sznurek Zawiera on opisy danych wyjściowych.
Rozróżniacz obiekt sznurek Użyj tego dekoratora, aby upewnić się, że prawidłowa podklasa jest identyfikowana i zarządzana. Aby uzyskać więcej informacji, zobacz Custom-tagged union data type (Typ danych unii z tagiem niestandardowym).
maxLength tablica, ciąg int (integer) Zapewnia to maksymalną długość wyjściowych ciągów znaków i tablic, a wartość zawiera wartość graniczną.
maxValue int (integer) int (integer) Zapewnia to maksymalną wartość dla danych wyjściowych liczby całkowitej, a wartość jest inkluzywna.
metadane wszystkie obiekt Udostępnia niestandardowe właściwości do zastosowania do wyników i może zawierać właściwość opisu, która jest równoważna dekoratorowi opisu.
minLength tablica, ciąg int (integer) To określa minimalną długość wyników ciągów i tablic, a wartość jest włączna.
minValue int (integer) int (integer) Określa minimalną wartość dla całkowitych danych wyjściowych, a wartość ta jest wliczana.
zapieczętowany obiekt Brak Podnieś poziom BCP089 z ostrzeżenia do błędu, gdy nazwa właściwości zdefiniowanego przez użytkownika typu danych jest prawdopodobnie literówką. Aby uzyskać więcej informacji, zobacz Podnoszenie poziomu błędu.
zabezpieczyć ciąg, obiekt Brak Oznacza dane wyjściowe jako bezpieczne. Wartość bezpiecznego wyjścia nie jest zapisywana w historii wdrożenia i nie jest logowana. Aby uzyskać więcej informacji, zobacz Zabezpieczanie ciągów i obiektów.

Dekoratory znajdują się w przestrzeni nazw sys. Jeśli musisz odróżnić dekorator od innego elementu o tej samej nazwie, należy poprzedzić dekorator znakiem sys. Jeśli na przykład plik Bicep zawiera parametr o nazwie description, należy dodać przestrzeń nazw sys podczas korzystania z dekoratora opisu .

@sys.description('The name of the instance.')
param name string
@sys.description('The description of the instance to display.')
param description string

opis

Aby dodać wyjaśnienie, dodaj opis do deklaracji wyjściowych. Na przykład:

@description('Conditionally output the endpoint.')
output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

Tekst w formacie markdown może służyć do tekstu opisu.

Rozróżniacza

Zobacz Typ danych unii otagowanych niestandardowych tagach.

Ograniczenia liczb całkowitych

Można ustawić wartości minimalne i maksymalne dla danych wyjściowych liczby całkowitej oraz jedno lub oba ograniczenia.

var thisMonth = 3

@minValue(1)
@maxValue(12)
output month int = thisMonth

Ograniczenia długości

Możesz określić minimalną i maksymalną długość dla danych wyjściowych ciągu i tablicy. Można ustawić jedno lub oba ograniczenia. W przypadku ciągów długość wskazuje liczbę znaków. W przypadku tablic długość wskazuje liczbę elementów w tablicy.

Poniższy przykład deklaruje dwa dane wyjściowe. Jednym z danych wyjściowych jest nazwa konta magazynu, która musi mieć od 3 do 24 znaków. Inne dane wyjściowe to tablica, która musi zawierać od 1 do 5 elementów:

var accountName = uniqueString(resourceGroup().id)
var appNames = [
  'SyncSphere'
  'DataWhiz'
  'FlowMatrix'
]

@minLength(3)
@maxLength(24)
output storageAccountName string = accountName

@minLength(1)
@maxLength(5)
output applicationNames array = appNames

Metadane

Jeśli masz właściwości niestandardowe, które chcesz zastosować do danych wyjściowych, dodaj dekorator metadanych. W metadanych zdefiniuj obiekt z niestandardowymi nazwami i wartościami. Obiekt zdefiniowany dla metadanych może zawierać właściwości dowolnej nazwy i typu.

Możesz użyć tego dekoratora do śledzenia informacji o danych wyjściowych, które nie mają sensu dodawać do opisu.

var obj = {}
@description('Configuration values that are applied when the application starts.')
@metadata({
  source: 'database'
  contact: 'Web team'
})
output settings object = obj

Kiedy nadasz dekoratorowi @metadata() właściwość powodującą konflikt z innym dekoratorem, ten dekorator zawsze ma pierwszeństwo nad wszystkim w dekoratorze @metadata(). Z kolei właściwość powodująca konflikt w @metadata() jest niepotrzebna i zostanie zastąpiona. Aby uzyskać więcej informacji, zobacz reguła Linter — brak konfliktowych metadanych.

Zamknięte

Zobacz Podnoszenie poziomu błędu.

Bezpieczne dane wyjściowe

W wersji Bicep w wersji 0.35.1 lub nowszej można oznaczyć dane wyjściowe ciągów lub obiektów jako bezpieczne. Gdy dane wyjściowe są ozdobione elementem @secure(), usługa Azure Resource Manager traktuje wartość wyjściową jako wrażliwą, uniemożliwiając jej zarejestrowanie lub wyświetlenie w historii wdrożenia, witrynie Azure Portal lub danych wyjściowych wiersza polecenia.

@secure()
output demoPassword string

@secure()
output demoSecretObject object

@secure() Dekorator jest poprawny tylko dla wyników typu ciąg znaków lub obiekt, ponieważ są one zgodne z typami secureString i secureObject w szablonach ARM. Aby bezpiecznie przekazać tablice lub liczby, opakuj je w secureObject lub serializuj je jako secureString.

Dane wyjściowe warunkowe

Gdy zwracana wartość zależy od warunku we wdrożeniu, użyj operatora ?.

output <name> <data-type> = <condition> ? <true-value> : <false-value>

Zazwyczaj dane wyjściowe warunkowe są używane podczas warunkowego wdrażania zasobu. W poniższym przykładzie pokazano, jak warunkowo zwrócić identyfikator zasobu dla publicznego adresu IP na podstawie tego, czy został wdrożony nowy.

Aby określić dane wyjściowe warunkowe w Bicep, użyj operatora ?. Poniższy przykład zwraca adres URL punktu końcowego lub pusty ciąg, który zależy od warunku:

param deployStorage bool = true
param storageName string
param location string = resourceGroup().location

resource myStorageAccount 'Microsoft.Storage/storageAccounts@2023-04-01' = if (deployStorage) {
  name: storageName
  location: location
  kind: 'StorageV2'
  sku:{
    name:'Standard_LRS'
    tier: 'Standard'
  }
  properties: {
    accessTier: 'Hot'
  }
}

output endpoint string = deployStorage ? myStorageAccount.properties.primaryEndpoints.blob : ''

Dynamiczna liczba danych wyjściowych

W niektórych sytuacjach, podczas tworzenia szablonu, nie znasz liczby wystąpień wartości, które musisz zwrócić. Możesz użyć wyrażenia for, aby zwrócić zmienną liczbę wartości.

output <name> <data-type> = [for <item> in <collection>: {
  ...
}]

Poniższy przykład iteruje przez tablicę:

param nsgLocation string = resourceGroup().location
param orgNames array = [
  'Contoso'
  'Fabrikam'
  'Coho'
]

resource nsg 'Microsoft.Network/networkSecurityGroups@2023-11-01' = [for name in orgNames: {
  name: 'nsg-${name}'
  location: nsgLocation
}]

output deployedNSGs array = [for (name, i) in orgNames: {
  orgName: name
  nsgName: nsg[i].name
  resourceId: nsg[i].id
}]

Aby uzyskać więcej informacji na temat pętli, zobacz Iteracyjne pętle w Bicep.

Dane wyjściowe z modułów

Aby uzyskać wartość wyjściową z modułu, użyj następującej składni:

<module-name>.outputs.<property-name>

W poniższym przykładzie pokazano, jak pobrać wartość z modułu w celu ustawienia adresu IP w module równoważenia obciążenia:

module publicIP 'modules/public-ip-address.bicep' = {
  name: 'public-ip-address-module'
}

resource loadBalancer 'Microsoft.Network/loadBalancers@2023-11-01' = {
  name: loadBalancerName
  location: location
  properties: {
    frontendIPConfigurations: [
      {
        name: 'name'
        properties: {
          publicIPAddress: {
            id: publicIP.outputs.resourceId
          }
        }
      }
    ]
    // ...
  }
}

Pobieranie wartości wyjściowych

Po pomyślnym wdrożeniu wyniki wdrożenia automatycznie pokazują wartości wyjściowe.

Aby uzyskać wartości wyjściowe z historii wdrożenia, możesz użyć interfejsu wiersza polecenia platformy Azure lub skryptu programu Azure PowerShell.

(Get-AzResourceGroupDeployment `
  -ResourceGroupName <resource-group-name> `
  -Name <deployment-name>).Outputs.resourceID.value

Sortowanie obiektów w danych wyjściowych

W formacie JSON obiekt jest nieuporządkowaną kolekcją zero lub więcej par klucz-wartość. Kolejność może się różnić w zależności od implementacji. Na przykład funkcja Bicep items() sortuje obiekty w kolejności alfabetycznej. W innych miejscach można zachować oryginalną kolejność. Ze względu na ten niedeterminizm należy unikać wprowadzania wszelkich założeń dotyczących porządkowania kluczy obiektów podczas pisania kodu, który wchodzi w interakcje z parametrami i danymi wyjściowymi wdrożenia.

Następne kroki

Aby dowiedzieć się więcej o właściwościach dostępnych dla danych wyjściowych, zobacz struktura plików Bicep i składnia.