Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Terraform模板文件变量中使用Bash命令?_Terraform_Terraform Template File - Fatal编程技术网

如何在Terraform模板文件变量中使用Bash命令?

如何在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

我正在使用Terraform配置自动缩放Gitlab Runner。我在覆盖runner配置文件(我使用Terraform模板)时遇到问题,因为该文件需要注册后生成的runner唯一令牌

配置文件如下所示:

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,资源之间的显式依赖关系。