Terraform - 无法在本地 exec 中运行多个命令

Posted

技术标签:

【中文标题】Terraform - 无法在本地 exec 中运行多个命令【英文标题】:Terraform - Unable to run multiple commands in local exec 【发布时间】:2021-07-21 15:07:47 【问题描述】:

我是 Terraform 世界的新手。我正在尝试使用 Terraform 运行 shell 脚本。

下面是main.tf文件

#Executing shell script via Null Resource

resource "null_resource" "install_istio" 
 provisioner "local-exec" 
    command = <<EOT
      "chmod +x install-istio.sh"
      "./install-istio.sh"
    EOT
    interpreter = ["/bin/bash", "-c"]
    working_dir = "$path.module"
  

下面是它需要运行的 install-istio.sh 文件

#!/bin/sh

# Download and install the Istio istioctl client binary

# Specify the Istio version that will be leveraged throughout these instructions
ISTIO_VERSION=1.7.3

curl -sL "https://github.com/istio/istio/releases/download/$ISTIO_VERSION/istioctl-$ISTIO_VERSION-linux-amd64.tar.gz" | tar xz

sudo mv ./istioctl /usr/local/bin/istioctl
sudo chmod +x /usr/local/bin/istioctl

# Install the Istio Operator on EKS
istioctl operator init

# The Istio Operator is installed into the istio-operator namespace. Query the namespace.
kubectl get all -n istio-operator

# Install Istio components
istioctl profile dump default

# Create the istio-system namespace and deploy the Istio Operator Spec to that namespace.
kubectl create ns istio-system
kubectl apply -f istio-eks.yaml

# Validate the Istio installation
kubectl get all -n istio-system

我收到以下警告:

Warning: Interpolation-only expressions are deprecated
  on .terraform/modules/istio_module/Istio-Operator/main.tf line 10, in resource "null_resource" "install_istio":
  10:     working_dir = "$path.module"
Terraform 0.11 and earlier required all non-constant expressions to be
provided via interpolation syntax, but this pattern is now deprecated. To
silence this warning, remove the "$ sequence from the start and the "
sequence from the end of this expression, leaving just the inner expression.
Template interpolation syntax is still used to construct strings from
expressions when the template includes multiple interpolation sequences or a
mixture of literal strings and interpolations. This deprecation applies only
to templates that consist entirely of a single interpolation sequence.

main.tf 中的上述脚本确实在后台运行命令。

有人可以帮我解决缺少的部分吗?如何使用本地 exec 运行多个命令另外,如何摆脱警告消息?

感谢您的帮助,谢谢!

【问题讨论】:

要摆脱警告,只需从working_dir = "$path.module" 中省略"$",即working_dir = path.module。下一个问题,你是说install-istio.sh 没有被执行?有错误提示吗? 您是否正在使用 GKE? 【参考方案1】:

我认为这里发生了两件独立的事情,实际上是不相关的。

这里的主要问题在于您如何编写 local-exec 脚本:

    command = <<EOT
      "chmod +x install-istio.sh"
      "./install-istio.sh"
    EOT

这将成为以下要运行的 shell 脚本:

"chmod +x install-istio.sh"
"./install-istio.sh"

通过将第一个命令行放在引号中,您是在告诉 shell 尝试运行一个名为 chmod +x install-istio.sh 的程序,该程序不带任何参数。也就是说,shell 将尝试在您的 PATH 中找到一个名为 chmod +x install-istio.sh 的可执行文件,而不是像我认为的那样尝试运行一个名为 chmod 并带有一些参数的命令。

删除命令行周围的引号以使其正常工作。这里不需要引号,因为这些命令都不包含任何需要引用的特殊字符:

    command = <<-EOT
      chmod +x install-istio.sh
      ./install-istio.sh
    EOT

有关仅插值表达式的警告消息与运行这些命令的问题无关。这表明您使用了旧式语法,该语法仍受支持以实现向后兼容性,但不再推荐。

如果您在撰写本文时使用的是最新版本的 Terraform(v0.15 版本之一或更高版本),那么您可以通过切换到此模块目录并运行来解决此问题和其他类似警告terraform fmt,该命令可更新您的配置以匹配预期的样式约定。

或者,您可以手动更改该命令将自动更新的内容,即删除 path.module 周围的冗余插值标记:

    working_dir = path.module

【讨论】:

非常感谢 Martin 的回复和知识分享

以上是关于Terraform - 无法在本地 exec 中运行多个命令的主要内容,如果未能解决你的问题,请参考以下文章

Terraform AZ CLI 本地执行命令限制

exec:“powershell”:在 Terraform 中运行 local-exec 时在 $PATH 中找不到可执行文件

如何在 local-exec 配置程序中从 terraform 继承 aws 凭据

无法使用“terraform init -reconfigure”将 S3 后端中的 Terraform 远程状态转换为本地状态

如何使用 Terraform local-exec 将命名参数传递给 powershell 脚本?

AKS:当进程仍在容器中运行时,kubectl exec 和 kubectl 日志退出