嵌套列表中的地形嵌套循环

时间:2020-10-12 19:21:28

标签: terraform terraform-provider-azure terraform0.12+

我正在尝试创建一种动态方法,以在将由最终用户配置的多个环境中创建虚拟机。 尝试使用嵌套循环的循环。展平功能,计数等,但尚未找到达到我目标的方法。 我的terrafrom.tfvars具有以下结构:

// CONFIG1
#pragma config FEXTOSC = OFF    // External Oscillator mode selection bits (Oscillator not enabled)
#pragma config RSTOSC = HFINT1  // Power-up default value for COSC bits (HFINTOSC (1MHz))
#pragma config CLKOUTEN = OFF   // Clock Out Enable bit (CLKOUT function is disabled; i/o or oscillator function on OSC2)
#pragma config CSWEN = ON       // Clock Switch Enable bit (Writing to NOSC and NDIV is allowed)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor Enable bit (FSCM timer disabled)

// CONFIG2
#pragma config MCLRE = ON       // Master Clear Enable bit (MCLR pin is Master Clear function)
#pragma config PWRTE = OFF      // Power-up Timer Enable bit (PWRT disabled)
#pragma config LPBOREN = OFF    // Low-Power BOR enable bit (ULPBOR disabled)
#pragma config BOREN = OFF      // Brown-out reset enable bits (Brown-out reset disabled)
#pragma config BORV = LO        // Brown-out Reset Voltage Selection (Brown-out Reset Voltage (VBOR) set to 1.9V on LF, and 2.45V on F Devices)
#pragma config ZCD = OFF        // Zero-cross detect disable (Zero-cross detect circuit is disabled at POR.)
#pragma config PPS1WAY = OFF     // Peripheral Pin Select one-way control (The PPSLOCK bit can be cleared and set only once in software)
#pragma config STVREN = ON      // Stack Overflow/Underflow Reset Enable bit (Stack Overflow or Underflow will cause a reset)

// CONFIG3
#pragma config WDTCPS = WDTCPS_31// WDT Period Select bits (Divider ratio 1:65536; software control of WDTPS)
#pragma config WDTE = OFF       // WDT operating mode (WDT Disabled, SWDTEN is ignored)
#pragma config WDTCWS = WDTCWS_7// WDT Window Select bits (window always open (100%); software control; keyed access not required)
#pragma config WDTCCS = SC      // WDT input clock selector (Software Control)

// CONFIG4
#pragma config WRT = OFF        // UserNVM self-write protection bits (Write protection off)
#pragma config SCANE = available// Scanner Enable bit (Scanner module is available for use)
#pragma config LVP = OFF         // Low Voltage Programming Enable bit (Low Voltage programming enabled. MCLR/Vpp pin function is MCLR.)

// CONFIG5
#pragma config CP = OFF         // UserNVM Program memory code protection bit (Program Memory code protection disabled)
#pragma config CPD = OFF        // DataNVM code protection bit (Data EEPROM code protection disabled)

#include <xc.h>
#include <stdint.h>

void InitUART1(void)
{
    TRISCbits.TRISC6 = 0;
    TRISCbits.TRISC7 = 1;
    RXPPS = 0x17;
    TXPPS = 0x10;
    
    TX1STA = 0X00;
    RC1STA = 0x90;
    BAUD1CON = 0X08;
//    SP1BRGL = 26;        
//    SP1BRGH = 0x00;
    SPBRG = 25;
    TX1STA |= 0X20;
}

void send_char_uart1(uint8_t c)
{
    TX1REG = c;
    while(PIR3bits.TXIF == 0);
}

void send_string_uart1(uint8_t *str)
{
    while(*str != '\0')
    {
        send_char_uart1(*str++);
    }
}

void main(void) {
    OSCCON1 = 0x60;         //
    OSCFRQ = 0x03;          //8 MHZ
    ANSELC = 0X00;
    
    InitUART1();
    
        
    while(1)
    {
            send_char_uart1('s');
    }
    return;
}

迭代列表中的每个键(在示例中是2个键-主集线器和分支)并创建与 bigip_instance_count 设置相对应的虚拟机数量的正确方法是什么。 在上面的示例中,我想创建2个环境,一个环境包含2个设备,第二个环境包含4个设备。 有办法实现吗?

1 个答案:

答案 0 :(得分:1)

如果将上述复杂的JSON转换为每个要创建的资源具有一个元素的集合,那将非常方便。为此,您可以使用flatten函数。

locals {
  # A list of objects with one object per instance.
  flattened_values = flatten([
    for ip_key, ip in var.Bigip_devices : [
      for index in range(ip.bigip_instance_count) : {
        region  = ip.region
        azs            = ip.azs
        ip_index      = index
        ip_key        = ip_key
        cluster         = ip.cluster
        version        = ip.version
        sku   = ip.sku
        offer = ip.offer
        instance_type = ip.instance_type
        disable_password_authentication = ip.disable_password_authentication
        tags = ip.tags
      }
    ]
  ])
}

使用上面的flattened函数,您将在下面想要创建的资源集合列表下面。

flattened_value_output = [
  {
    "azs" = [
      "1",
    ]
    "cluster" = "yes"
    "disable_password_authentication" = ""
    "instance_type" = ""
    "ip_index" = 0
    "ip_key" = "main_hub"
    "offer" = ""
    "region" = "eastus"
    "sku" = ""
    "tags" = ""
    "version" = ""
  },
  {
    "azs" = [
      "1",
    ]
    "cluster" = "yes"
    "disable_password_authentication" = ""
    "instance_type" = ""
    "ip_index" = 1
    "ip_key" = "main_hub"
    "offer" = ""
    "region" = "eastus"
    "sku" = ""
    "tags" = ""
    "version" = ""
  },
  {
    "azs" = [
      "1",
      "2",
    ]
    "cluster" = "yes"
    "disable_password_authentication" = ""
    "instance_type" = ""
    "ip_index" = 0
    "ip_key" = "spoke"
    "offer" = ""
    "region" = "eastus"
    "sku" = ""
    "tags" = ""
    "version" = ""
  },
  {
    "azs" = [
      "1",
      "2",
    ]
    "cluster" = "yes"
    "disable_password_authentication" = ""
    "instance_type" = ""
    "ip_index" = 1
    "ip_key" = "spoke"
    "offer" = ""
    "region" = "eastus"
    "sku" = ""
    "tags" = ""
    "version" = ""
  },
  {
    "azs" = [
      "1",
      "2",
    ]
    "cluster" = "yes"
    "disable_password_authentication" = ""
    "instance_type" = ""
    "ip_index" = 2
    "ip_key" = "spoke"
    "offer" = ""
    "region" = "eastus"
    "sku" = ""
    "tags" = ""
    "version" = ""
  },
  {
    "azs" = [
      "1",
      "2",
    ]
    "cluster" = "yes"
    "disable_password_authentication" = ""
    "instance_type" = ""
    "ip_index" = 3
    "ip_key" = "spoke"
    "offer" = ""
    "region" = "eastus"
    "sku" = ""
    "tags" = ""
    "version" = ""
  },
]

从上面的集合中,您可以使用如下所示的唯一键来迭代和创建资源:

resource "some_resource" "example" {
  for_each = {
    # Generate a unique string identifier for each instance
    for ip in local.flattened_value_output : format("%s-%02d", ip.ip_key, ip.ip_index + 1) => ip
  }
}

这样,由于每个资源都使用唯一的密钥,因此可以保证资源的创建或更新。

有关更多详细信息,请参阅我与Hashicorp人员共事的this discussion