Check! Terraform 동적 선택 모듈 사용

10581 단어 TerraformIaCtech

Prologue


테라form으로 다양한 환경의 샘플을 썼는데 필요에 따라 나눠서 시행착오의 마지막에 안정적인 방법을 쓸 필요가 있다.

Terraform 동적 선택 모듈 사용


이번 구성은 이렇다.
  • 진열을 준비하는 input variables, 사용할 모듈을 지정
  • 정렬과 일치하는 문자열이 있으면 모듈
  • 을 포함합니다.
  • 실행 모듈의 실행 결과 표시
  • 전체 샘플 코드는 여기를 참조하세요.
    https://github.com/dzeyelid/terraform-playground/tree/main/module-selector
    요점 코드를 발췌하다.source의 모듈은 되돌아오는 module_name의 위선일 뿐이다.
    먼저 모듈을 선택할 매개 변수를 지정합니다.여기에 문자열 배열을 받는 매개 변수 modules 가 준비되어 있습니다.문자열은 키워드로 뒤에 설명됩니다.모듈 이름과 같거나 모듈을 지정하기 쉬운 문자열을 선택하는 것이 좋습니다.
    .auto.tfvars
    modules = [
      "one",
      "two",
    ]
    
    variables.tf
    variable "modules" {
      type = list(string)
    }
    
    다음에 각 모듈의 경우 매개 변수에 키워드와 일치하는 문자열이 지정되어 있으면 count 또는 for_each로 분류된 기술을 사용합니다.count의 예에서 var.modules에 키워드가 포함된 문자열을 사용할 때 count에서 1회 실행 모듈을 지정한다.없으면 0번을 지정하고 실행하지 않습니다.
    main.tf
    module "one" {
      count = 0 <= try(index(var.modules, "one"), -1) ? 1 : 0
    
      source = "./modules/base"
      name   = "one"
    }
    
    사용for_each의 예에서 var.modules에 키워드가 포함된 문자열은 원소"selected"가 포함된 수조를 set로 변환하여 실행한다.그렇지 않으면 빈 그룹을 지정해서 실행할 수 없습니다.
    main.tf
    module "two" {
      for_each = toset(0 <= try(index(var.modules, "two"), -1) ? ["selected"] : [])
    
      source = "./modules/base"
      name   = "two"
    }
    
    실행 결과 확인은 사용할 모듈에 가깝습니다. 여기outputs 출력 모듈의 출력을 확인하십시오.countmodule.one를 사용하면 [*] 기호를 사용하여 각 모듈(즉 1개 또는 0개)의 출력을 참조할 수 있다.for_each의 사용module.two은 해당 키워드를 지정했을 때for_each에 하나 이상의 요소를 포함하는 배열을 지정set하면 문제없이 참조할 수 있으나 키워드를 지정하지 않았을 때for_each빈 배열을 지정했을 때set참조 오류가 발생할 수 있습니다.이용try()회피.
    outputs.tf
    output "one_module_name" {
      value = module.one[*].module_name
    }
    
    output "two_module_name" {
      value = try(module.two["selected"].module_name, "Not found")
    }
    
    그럼 코드가 준비되면 확인해 보세요.Terraform 명령을 실행합니다.
    terraform init
    terraform plan
    
    는 이러한 출력으로 표시됩니다.기대했던 대로!✨
    Changes to Outputs:
      + one_module_name = [
          + "one",
        ]
      + two_module_name = "two"
    
    또한 모듈이 지정되지 않았는지 확인해 보십시오.매개변수modules가 비어 있으면 각각 count 또는 for_each에서 선택되지 않으므로 개별 모듈이 실행되지 않습니다.
    .auto.tfvars
    modules = [
    #  "one",
    #  "two",
    ]
    
    terraform plan의 집행 결과는 다음과 같다.
    Changes to Outputs:
      + one_module_name = []
      + two_module_name = "Not found"
    
    잘됐다, 의도대로!통쾌하다🙌✨
    또한 오류가 발생한 사람은 다음과 같은 내용을 참고하시기 바랍니다.

    장애점

    for_each 사용 시 참고가 좀 독특합니다.개별 인스턴스를 보려면 참조가 아닌 레이아웃의 쓰기 방법<TYPE>.<NAME>["<KEY>"] 또는 module.<NAME>["<KEY>"]을 참조하십시오.
    https://www.terraform.io/docs/language/meta-arguments/for_each.html#referring-to-instances

    toset () 를 사용하여 문자열 목록을 지정할 때


    main.tf
    module "example" {
      for_each = toset(["a_member"])
      ...
    }
    
    outputs.tf
    output "output_example" {
      value = module.example["a_member"].output_a_string
    }
    

    맵으로 지정한 경우


    main.tf
    module "example" {
      for_each = { a_key = "a_value" }
      ...
    }
    
    outputs.tf
    output "output_example" {
      value = module.example["a_key"].output_a_string
    }
    

    오류 예


    잘못된 특집을 지정하면, 예를 들어 실행 terraform plan 할 때 다음과 같은 오류가 나타납니다.
    outputs.tf
    output "output_example" {
      value = module.example.output_a_string  # <- Wrong reference
    }
    
    Error: Unsupported attribute
    
      on outputs.tf line 6, in output "output_example":
       6:   value = module.example.output_a_string
        |----------------
        | module.example is object with 1 attribute "a_key"
    
    This object does not have an attribute named "output_a_string".
    

    Epilogue


    이 방법으로 모듈을 선택한 것은 창고 코드입니다.Azure PaaS에 안전하게 연결된 샘플 몇 개를 모듈로 나누어 설명합니다.관심 있으신 분들은 꼭 참고해주세요.😊
    https://github.com/dzeyelid/learn-azure-functions-with-network-options/tree/main/terraform

    좋은 웹페이지 즐겨찾기