Оператор экспорта пулуми в цикле работает неожиданно

Я использовал pulumi python для создания нескольких виртуальных машин Azure.

По сути, я просто помещаю код примера из Azure-py-веб-сервер в цикл, естественно, каждый ресурс имеет свое уникальное имя с индексом цикла. Я ожидал, что оператор export в конце цикла покажет мне общедоступные IP-адреса всех виртуальных машин после их создания.

for i in range(2):
    vm_name = f"sol{i}"
    ...
    ...
    ...
    public_ip_addr = vm.id.apply(lambda _: network.get_public_ip_address_output(
        public_ip_address_name=public_ip.name,
        resource_group_name=resource_group.name))

    export(f"{vm_name} IP", public_ip_addr.ip_address)

Все ресурсы были созданы успешно, но выходные данные экспорта всегда отображали тот же IP для всех виртуальных машин, как показано ниже.

    Type                                      Name            Status
 +   pulumi:pulumi:Stack                       azure-vms-dev   created
 +   ├─ azure-native:resources:ResourceGroup   resource_group  created
 +   ├─ azure-native:network:VirtualNetwork    sol_VNET        created
 +   ├─ azure-native:network:PublicIPAddress   sol0_PublicIP   created
 +   ├─ azure-native:network:PublicIPAddress   sol1_PublicIP   created
 +   ├─ azure-native:network:NetworkInterface  sol0_Nic        created
 +   ├─ azure-native:network:NetworkInterface  sol1_Nic        created
 +   ├─ azure-native:compute:VirtualMachine    sol1            created
 +   └─ azure-native:compute:VirtualMachine    sol0            created

Outputs:
    sol0 IP:: "20.239.154.16"
    sol1 IP:: "20.239.154.16"

Resources:
    + 9 created

Duration: 1m55s

Мой вопрос: как я могу экспортировать общедоступные IP-адреса всех виртуальных машин?

3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
0
0
47
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Экспорт происходит только один раз, в конце программы. Если вы хотите экспортировать более одного значения, вы можете просто создать массив или словарь, добавить значения в эту структуру данных и экспортировать ее. Так, например:

public_ip_address = [] # create an array to store the information
for i in range(2):
    vm_name = f"sol{i}"
    ...
    ...
    ...
    public_ip_addr = vm.id.apply(lambda _: network.get_public_ip_address_output(
        public_ip_address_name=public_ip.name,
        resource_group_name=resource_group.name))
    public_ip_addresses.append(public_ip_addr)


export(f"addresses", public_ip_addresses)

Привет, @jaxxstorm, я просто сделал то, что ты предложил, public_ip_addresses.append(public_ip_addr.ip_address) в цикле и экспортировал это в конце программы. Но у меня все еще есть два одинаковых IP-адреса. ``` Выводы: адреса: [[0]: "20.239.160.85" [1]: "20.239.160.85" ] ```

flyisland 05.05.2022 04:56
Ответ принят как подходящий

Я только что исправил эту проблему.

Как указал @Frassle, основная причина этой проблемы заключается в том, что я напрямую использовал локальную переменную цикла в лямбда-выражении.

После того, как я изучил Как использовать лямбда-функции Python и Входы и выходы Пулуми, я думаю, что должен получить нужную переменную из аргумента метода apply.

Вот измененный код:

for i in range(2):
    vm_name = f"sol{i}"
    ...
    ...
    ...
    # Get IP address as an output.
    combined_output = Output.all(
        vm_id=vm.id,
        public_ip_name=public_ip.name,
        resource_group_name=resource_group.name,
    )
    public_ip_addr = combined_output.apply(
        lambda args: network.get_public_ip_address_output(
            public_ip_address_name=args["public_ip_name"],
            resource_group_name=args["resource_group_name"],
        )
    )
    export(f"{vm_name} IP", public_ip_addr.ip_address)

Теперь я могу получить все общедоступные IP-адреса, которые захочу:

Outputs:
  - sol0 IP: "20.239.193.78"
  - sol1 IP: "20.239.195.132"

Другие вопросы по теме