테라폼 보간에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법은 무엇입니까?
테라폼 보간에서 문자열에 하위 문자열이 포함되어 있는지 확인하는 방법은 무엇입니까?
테라폼 문자열에 다른 문자열이 포함되어 있는지 확인하려면 어떻게 해야 합니까?
예를 들어, 나는 특별히 이름에 "tmp"가 있는 테라폼 작업 공간을 취급하고 싶다(예: 스냅샷 없이 rds 인스턴스를 삭제할 수 있도록 허용). 그래서 다음과 같은 것이 있다:
locals
{
is_tmp = "${"tmp" in terraform.workspace}"
}
내가 아는 한, 그는 이것을 성취하지 못한다.
예를 들어, 다음과 같은 방법을 사용하여 간접적으로 서브스트링을 확인할 수 있습니다.
locals
{
is_tmp = "${replace(terraform.workspace, "tmp", "") != terraform.workspace}"
}
스니펫에 있는 것처럼 사용:
// string contains ABBA = result is ABBA
output "match" {
value = "${ replace("xxxABBAyyy", "/(?:.*)(ABBA)(?:.*)/", "$1") }"
}
// string doesn't contain ABBA = result is original string
output "no_match" {
value = "${ replace("xxxBABAyyy", "/(?:.*)(ABBA)(?:.*)/", "$1")}"
}
// string contains ABBA (ingorecase) = result is AbBA
output "equals_ignorecase" {
value = "${ replace("xxxAbBAyyy", "/(?:.*)((?i)ABBA)(?:.*)/", "$1")}"
}
의 출력은 다음과 같습니다:
Outputs:
equals_ignorecase = AbBA
match = ABBA
no_match = xxxBABAyyy
테라포름 0.12.7에서 우리는 이제 를 가지고 있다. 이것은 일부 코드를 단순화하고 일부 코드를 읽을 수 있게 하는 데 도움이 될 수 있다(아마도?)
> regex("[a-z]+", "53453453.345345aaabbbccc23454")
aaabbbccc
와 유사하게 Terraform 0.12.7+를 사용하면 문자열에 특정 하위 문자열이 포함된 경우 를 사용하여 부울 값을 반환할 수 있습니다:
locals {
is_tmp = contains(regex("^(?:.*(tmp))?.*$",terraform.workspace),"tmp")
}
쿼리는 "tmp" 앞에 있는 모든 문자, "tmp"가 발견되면 "tmp" 뒤에 있는 모든 문자에 대한 캡처 그룹 목록을 반환합니다. 그런 다음 목록에서 "tmp"를 찾고 true 또는 false를 반환합니다.
테라폼 0.12의 경우.xx 분명히 당신은 이것을 하기 위해 regexall을 사용해야 한다.
테라폼 0.12 설명서에서 확인하십시오.XX:
또한 결과 일치 목록의 길이가 0보다 큰지 여부를 테스트하여 특정 문자열이 지정된 패턴과 일치하는지 여부를 테스트하는 데 사용할 수 있습니다.
설명서의 예:
> length(regexall("[a-z]+", "1234abcd5678efgh9"))
2
> length(regexall("[a-z]+", "123456789")) > 0
false
테라폼 0.12의 사례에 적용된 예입니다.xx 구문은 다음과 같아야 합니다:
locals
{
is_tmp = length(regexall(".*tmp.*", terraform.workspace)) > 0
}
또한 매뉴얼에 regex를 사용하지 말고 regexall을 사용하도록 명시되어 있습니다.
지정된 패턴이 전혀 일치하지 않으면 정규식에서 오류가 발생합니다. 지정된 패턴이 문자열과 일치하는지 여부를 테스트하려면 regexall을 사용하고 결과의 길이가 0보다 큰지 여부를 테스트합니다.
위에서 언급한 것처럼 0.12 이후 버전에서 사용하려고 하면 실제로 예외 오류가 발생하기 때문입니다.당신이 계획을 실행할 때 지금 나온 xx. 이것이 내가 어떻게 이것을 알게 되었고 왜 내가 여기에 새로운 답을 게시했는지이다.
함수에 의해 생성된 리스트의 길이는 구분자가 부분 문자열일 때 1보다 크다.
locals {
is_tmp = length(split("tmp", terraform.workspace)) > 1
}
이 방법을 사용하여 버킷 이름이 test-tmp로 시작하는지 확인합니다(예: test-tmp, test-tmp-app1, test-tmp-db1 등)..
is_test_bucket = can(regex("^(test-tmp){1}($|-{1}.*$)", var.bucket_name))
읽는 것이 의미가 있는 것, IMHO:
locals {
is_tmp = can(regex("tmp", terraform.workspace))
}
일치하는 항목이 없으면 정규식 함수가 오류를 발생시키기 때문에 작동합니다.
보너스: 테라폼 1.3.x 이후, 많은 경우에 유용하게 사용할 수 있는 새로운 기능과 기능이 있습니다.
가장 많이(v1.5.0) 소개된 테라폼은 다음에서 사용할 수 있습니다:
locals {
substring_present = strcontains(mystring, mysubstring) # returns True
}