如何在Terraform模板文件变量中使用Bash命令?
我正在使用Terraform配置自动缩放Gitlab Runner。我在覆盖runner配置文件(我使用Terraform模板)时遇到问题,因为该文件需要注册后生成的runner唯一令牌 配置文件如下所示:如何在Terraform模板文件变量中使用Bash命令?,terraform,terraform-template-file,Terraform,Terraform Template File,我正在使用Terraform配置自动缩放Gitlab Runner。我在覆盖runner配置文件(我使用Terraform模板)时遇到问题,因为该文件需要注册后生成的runner唯一令牌 配置文件如下所示: concurrent = 1 check_interval = 60 [[runners]] name = "POC Group Runner" url = "https://gitlab.com/" token = "ABCD" executor = "d
concurrent = 1
check_interval = 60
[[runners]]
name = "POC Group Runner"
url = "https://gitlab.com/"
token = "ABCD"
executor = "docker+machine"
limit = 1 # max number of docker machines to be created
我想从该文件中读取此runner令牌(即“ABCD”),以便在地形模板中使用它来覆盖配置
在terraform中,我唯一的“读取”功能是“文件”,它读取整个内容,然后从中仅获取令牌,这是一个丑陋的过程:
trimspace(replace(split("executor", split("token =", file("/etc/gitlab-runner/config.toml"))[1])[0], "\"", ""))
是否可以使用Bash脚本为模板创建变量
例如,我可以使用以下命令读取令牌:
cat /etc/gitlab-runner/config.toml | grep "token =" | awk '//{print $3}' | sed 's/"//g'
但是我如何将其输入到模板中呢
我可以这样做吗
Data "template_file" "runner-config" {
template = "${file("runner-config.toml")"
vars = {
runner_token = "`cat /etc/gitlab-runner/config.toml | grep "token =" | awk '//{print $3}' | sed 's/"//g'`"
}
是否有人有更好的方法从文件中读取特定内容,或者知道如何在模板中使用bash脚本?您也有类似的问题:使用外部数据资源怎么样? 获取_token.sh
#/bin/bash
token=$(cat/etc/gitlab runner/config.toml | grep“token=“|awk'/{print$3}'| sed's/“//g')
jq-n--arg令牌$token'{token:$token}'
或者你可以用echo代替jq
。。。
echo-n“{\'token\”:\“${token}\”}”
及
数据“外部”获取令牌{
program=[“/bin/sh”,“${path.module}/get token.sh”]
}
数据“模板文件”“运行程序配置”{
template=“${file(“runner config.toml”)”
变量={
runner_token=“${lookup(data.external.get_token.result,“token”)}
}
您也有类似的问题:。使用外部数据资源怎么样? 获取_token.sh
!/bin/bash
token=$(cat/etc/gitlab runner/config.toml | grep“token=“|awk'/{print$3}'| sed's/“//g')
jq-n--arg令牌$token'{token:$token}'
或者你可以用echo代替jq
。。。
echo-n“{\'token\”:\“${token}\”}”
及
数据“外部”获取令牌{
program=[“/bin/sh”,“${path.module}/get token.sh”]
}
数据“模板文件”“运行程序配置”{
template=“${file(“runner config.toml”)”
变量={
runner_token=“${lookup(data.external.get_token.result,“token”)}
}
感谢您的回复。外部数据源看起来是我问题的完美解决方案。我有一个问题,因为我不完全理解terraform中的执行逻辑。外部数据源中的程序是在引用结果时执行的,还是在较早时执行的?如果程序在配置gitlab runner之前执行,因此配置文件将不存在。Terraform会自动生成依赖顺序,您不必担心。或者您可以使用Dependes_on,资源之间的显式依赖关系。感谢您的响应。外部数据源看起来是解决我问题的完美解决方案。我有一个问题,因为我不完全理解terraform中的执行逻辑。外部数据源中的程序是在引用结果时执行的,还是在较早时执行的?如果在配置gitlab runner之前执行该程序,则可能会出现错误,因此配置文件将不存在。terraform使依赖关系为自动排序,您不必担心。或者您可以使用dependens,资源之间的显式依赖关系。