使用"null_resource" "apply"执行时地形"file name too long"



我正在尝试执行以下命令:kubectl get cm aws-auth -n kube-system -o json | jq --arg add "`cat additional_roles_aws_auth.yaml`" '.data.mapRoles += $add' | kubectl apply -f -作为当地地形构造的一部分,如下所示:

locals {
kubeconfig = yamlencode({
apiVersion      = "v1"
kind            = "Config"
current-context = "terraform"
clusters = [{
name = module.eks.cluster_id
cluster = {
certificate-authority-data = module.eks.cluster_certificate_authority_data
server                     = module.eks.cluster_endpoint
}
}]
contexts = [{
name = "terraform"
context = {
cluster = module.eks.cluster_id
user    = "terraform"
}
}]
users = [{
name = "terraform"
user = {
token = data.aws_eks_cluster_auth.this.token
}
}]
})
}
resource "null_resource" "apply" {
triggers = {
kubeconfig = base64encode(local.kubeconfig)
cmd_patch  = <<-EOT
kubectl get cm aws-auth -n kube-system -o json | jq --arg add "`cat additional_roles_aws_auth.yaml`" '.data.mapRoles += $add' | kubectl apply -f -
EOT
}
provisioner "local-exec" {
interpreter = ["/bin/bash", "-c"]
environment = {
KUBECONFIG = self.triggers.kubeconfig
}
command = self.triggers.cmd_patch
}
}

在Terraform之外执行相同的命令,简单地在命令行上执行即可。然而,当作为Terraform脚本的一部分执行时,我总是会遇到以下错误:

│ ': exit status 1. Output:
│ iAic2FtcGxlLWNsdXN0ZXI...WaU5ERXdNekEiCg==":
│ open
│ ImFwaVZlcnNpb24iOiAidjEiy...RXdNekEiCg==:
│ file name too long

有人知道可能是什么问题吗?

根据我的评论:KUBECONFIG环境变量需要是配置文件的列表,而不是文件本身的内容[1]:

KUBECONFIG环境变量是配置文件的路径列表。

最初的问题是,文件的内容以base64格式[2]编码,并在没有解码的情况下以该格式使用。值得庆幸的是,Terraform内置了这两个函数,因此使用base64decode[3]将返回";正常的";文件内容。不过,它将是文件内容,而不是配置文件的路径。根据其他注释,我想需要注意的重要事项是additional_roles_aws_auth.yaml文件必须与根模块位于同一目录中。由于命令有点复杂,我不确定您是否可以使用Terraform内置的path对象[4]来确保在模块的根目录中搜索文件:

kubectl get cm aws-auth -n kube-system -o json | jq --arg add "`cat ${path.root}/additional_roles_aws_auth.yaml`" '.data.mapRoles += $add' | kubectl apply -f -

[1]https://kubernetes.io/docs/tasks/access-application-cluster/configure-access-multiple-clusters/#set-kubeconfig环境变量

[2]https://www.terraform.io/language/functions/base64encode

[3]https://www.terraform.io/language/functions/base64decode

[4]https://www.terraform.io/language/expressions/references#filesystem-和工作区信息

base64编码的kubeconfig在您的命令中被调用,因此您必须对其进行解码:

kubectl <YOUR_COMMAND> --kubeconfig <(echo $KUBECONFIG | base64 --decode)

相关内容

  • 没有找到相关文章

最新更新