Terraform vars 파일을 구문 분석하고 TF vars 파일의 변수를 Makefile의 vars로 저장하고 싶습니다.

Terraform vars 파일을 구문 분석하고 TF vars 파일의 변수를 Makefile의 vars로 저장하고 싶습니다.

vars.tfTerraform 변수 파일( )과 Makefile이라는 두 개의 파일이 있습니다 .

내가 원하는 것은 Makefile이 vars.tfTerraform 파일의 일부 변수를 "읽게" 하는 것입니다.

문서 vars.tf:

variable "region" {
    default = "us-west-1"
    description = "AWS Region"
}
variable "profile" {
    default = "bobs-profile"
    description = "Please enter your AWS CLI profile name"
}
variable "env" {
    default = "dev"
    description = "Please label the environment this infrastructure will be deployed to eg dev, uat, prod"
}

vars.tf내 Makefile의 파일에 나열된 변수를 호출할 수 있기를 원합니다 . 여기에 간단한 예가 있습니다.

.ONESHELL:
.SHELL := /usr/bin/bash
.PHONY: apply plan prep
VARS="variables/$(ENV)-$(REGION).tfvars"
CURRENT_FOLDER=$(shell basename "$$(pwd)")
AWS_PROFILE"bobs-profile"

예를 들어 다음 값을 원합니다.

  • $(ENV)
  • $(REGION)
  • $(AWS_PROFILE)

vars.tfMakefile이 다음 변수로 실행되도록 Terraform 파일에서 추출합니다 .

ENV=dev
REGION=us-west-1
AWS_PROFILE=bobs-profile

이것을 달성할 수 있는 방법이 있나요?

답변1

표시되는 파일은 HCL(HashiCorp 구성 언어)로 작성되었습니다. JSON으로 변환하여 사용할 수 있습니다 jq.

HCL 파일을 JSON으로 변환하려면 다음과 같은 것을 사용할 수 있습니다 yj.https://github.com/sclevine/yj). 그러면 다음 명령이 이미 jq생성되어 있을 수 있습니다 make.

eval "$(
    yj -cj <vars.tf |
    jq -r '
        [
            "make",
            (.variable[] | keys[]) as $key |
                "\($key)=\(.variable[][$key][].default)"
        ] | @sh'
)"

주어진 예에서는 다음 명령이 생성됩니다.

'make' 'env=dev' 'profile=bobs-profile' 'region=us-west-1'

평가 시 명명된 변수를 실행 make하고 언급된 값으로 설정합니다. 변수는 원하는 대로 소문자로 표시됩니다. 예를 들어, 이 설정은 ENVMakefile의 셸 명령이 실행되는 방식에 영향을 미칠 수 있습니다( ENV이것은 셸이 시작될 때 가져와야 하는 파일을 가리킬 수 있는 셸의 특수 변수입니다).

변수와 값을 탭으로 구분된 목록으로 가져와서 셸에서 읽을 수도 있습니다.

set --

yj -cj <vars.tf |
jq -r '
    (.variable[] | keys[]) as $key |
    [ $key, .variable[][$key][].default ] |
    @tsv' |
{
    while IFS=$'\t' read -r key value; do
        set -- "$@" "$key"="$value"
    done

    make "$@"
}

그러면 위치 인수 목록에 있는 변수와 해당 값을 수집한 다음 make이를 사용하여 호출합니다. 문제의 문서를 고려하면 실행될 명령은 다음과 같습니다.

make 'env=dev' 'profile=bobs-profile' 'region=us-west-1'

참고로 위에서 생성한 JSON 문서 yj는 다음과 같습니다.

{
  "variable": [
    {
      "region": [
        {
          "default": "us-west-1",
          "description": "AWS Region"
        }
      ],
      "profile": [
        {
          "default": "bobs-profile",
          "description": "Please enter your AWS CLI profile name"
        }
      ],
      "env": [
        {
          "default": "dev",
          "description": "Please label the environment this infrastructure will be deployed to eg dev, uat, prod"
        }
      ]
    }
  ]
}

답변2

GNU가 있다고 가정하면 makeshell명령을 사용하여 외부 명령의 결과를 Makefile 변수에 할당할 수 있습니다.

귀하의 경우에는 다음을 사용할 수 있습니다.

ENV:=$(shell awk '$$1=="variable" && $$2=="\"env\"" {i=1} $$1=="}" {i=0} i && $$1=="default" {split($$0,a,"\""); print a[2]}' test.tf)

REGION:=$(shell awk '$$1=="variable" && $$2=="\"region\"" {i=1} $$1=="}" {i=0} i && $$1=="default" {split($$0,a,"\""); print a[2]}' test.tf)

AWS_PROFILE:=$(shell awk '$$1=="variable" && $$2=="\"profile\"" {i=1} $$1=="}" {i=0} i && $$1=="default" {split($$0,a,"\""); print a[2]}' test.tf)

variable이는 로 시작하고 끝나는 관심 영역을 찾고 }, "올바른" 영역이 발견되면 플래그를 설정합니다. i해당 플래그가 설정되고 키워드가 있는 행이 발견되면 default큰따옴표( )로 요소를 추출합니다 " ... ".

double은 (에 관계없이 ) 전체 내용을 해석하고 리터럴을 명령 에 전달하기 때문에 앞에 다른 것을 추가하여 "이스케이프"해야 하기 때문에 $$필요합니다 .make$( ... )' ... '$shell$

약간 투박하지만(세 가지 모두의 구문 분석된 구조가 기본적으로 동일하므로 루프 구성이 더 좋습니다) 작동해야 합니다.

관련 정보