vars.tf
Terraform 변수 파일( )과 Makefile이라는 두 개의 파일이 있습니다 .
내가 원하는 것은 Makefile이 vars.tf
Terraform 파일의 일부 변수를 "읽게" 하는 것입니다.
문서 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.tf
Makefile이 다음 변수로 실행되도록 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
하고 언급된 값으로 설정합니다. 변수는 원하는 대로 소문자로 표시됩니다. 예를 들어, 이 설정은 ENV
Makefile의 셸 명령이 실행되는 방식에 영향을 미칠 수 있습니다( 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가 있다고 가정하면 make
이 shell
명령을 사용하여 외부 명령의 결과를 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
$
약간 투박하지만(세 가지 모두의 구문 분석된 구조가 기본적으로 동일하므로 루프 구성이 더 좋습니다) 작동해야 합니다.