从 Terraform local-exec 配置程序运行 python 脚本

Gre*_*uff 3 terraform

版本

\n
    \n
  • VS代码:v1.74.3
  • \n
  • Python:v3.9.1
  • \n
  • 地形 v1.3.6
  • \n
\n

设置

\n

我有以下文件夹结构

\n
.\n\xe2\x94\x9c\xe2\x94\x80\xe2\x94\x80 main.tf\n\xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 scripts\n    \xe2\x94\x94\xe2\x94\x80\xe2\x94\x80 my_script.py\n
Run Code Online (Sandbox Code Playgroud)\n

主要.tf:

\n
locals {\n  python = (substr(pathexpand("~"), 0, 1) == "/") ? "python3" : "python.exe"\n}\n\nresource "null_resource" "custom_objects" {\n  for_each = local.custom_objects\n\n  triggers = {\n    name        = each.key\n  }\n\n  provisioner "local-exec" {\n    command = <<-EOT\n      python3 -m my_script \'{"key_1": "value_1"}\'\n    EOT\n    interpreter = [\n      local.python\n    ]\n    working_dir = "${path.module}/scripts"\n  }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

./scripts/my_script.py:

\n
if __name__ == \'__main__\':\n    print(\'my_script executed.\')\n
Run Code Online (Sandbox Code Playgroud)\n

问题\n当我运行时terraform plan/apply,出现以下错误:

\n
\n

运行命令 \'python3 -m my_script \'{"key_1": "value_1"}\'\n\xe2\x94\x82 \' 时出错:退出状态 2。输出:/home_path/.pyenv/versions/3.9.1 /bin/python3: 无法打开文件 \'/path_to_repo/scripts/python3 -m my_script \'{"key_1": "value_1"}\'\n\xe2\x94\x82 \': [Errno 2]没有这样的文件或目录

\n
\n

疑问

\n
    \n
  • 鉴于错误消息显示了脚本的绝对路径,为什么 local-exec 配置程序无法找到我的脚本?
  • \n
  • 应该如何配置才能从 local-exec 配置程序将 python 脚本作为模块执行?
  • \n
\n

Mar*_*o E 6

看来当interpreter提供参数时,它会附加到 中定义的路径working_dir,这解释了此错误:

'/path_to_repo/scripts/python3 -m my_script '{"key_1": "value_1"}'

正如您所看到的,路径的结尾python3可能不存在。

我设法使用以下语法获得结果:

resource "null_resource" "custom_objects" {
  for_each = local.custom_objects

  triggers = {
     name = each.key
  }

  provisioner "local-exec" {
    command = <<-EOT
      ${local.python} -m my_script '{"key_1": "value_1"}'
    EOT
    working_dir = "${path.module}/scripts" # works with ${path.root} as well
  }
}
Run Code Online (Sandbox Code Playgroud)

您可能还会发现terraform_data它是null_resource.