Terraform / OpenTofu 提供的变量不可用于远程执行的脚本

问题描述 投票:0回答:1

我使用 OpenTofu 中的配置程序首先将脚本复制到远程 Linux 计算机:

  provisioner "file" {
    source      = "scripts/base.sh"
    destination = "/tmp/base.sh"

    connection {
      type          = "ssh"
      user          = var.c_user
      password      = var.d_passwd_user
      host          = var.vm_ip
    }
  }

...然后使用remote-exec运行一些有用的命令,然后使用sudo执行脚本(sudo对于'base.sh'中的内容是强制性的)。

  provisioner "remote-exec" {
    inline = [
      "echo 'SSH connection successful' > /tmp/1ssh_test_flag",
      "alias sudo='sudo -S <<< ${var.d_passwd_user}'",
      "sudo chmod +x /tmp/base.sh",
      "sudo /tmp/base.sh",
    ]
    connection {
      type        = "ssh"
      user        = var.c_user
      password    = var.d_passwd_user
      host        = var.vm_ip
    }
  }

您在命令“alias sudo='sudo -S <<< ${var.d_passwd_user}”中看到的变量在“内联”命令执行块中工作得很好,因此它们显然可供该命令使用,但内部的变量我的脚本文件“base.sh”引用了“variables.tf”和“terraform.tfvars”中声明的变量,脚本或bash看不到它们,当它尝试使用它们时,我收到错误(错误的替换)。

我的“base.sh”脚本文件中的内容以及依赖于 terraform.tfvars 中提供的变量和“tofu apply -vars”提供的变量的示例:

#!/bin/bash
echo 'root:${var.new_root_passwd}' | chpasswd
subscription-manager register --org=XXX --activationkey=${var.satellite_key} && echo '${var.satellite_key}' > /opt/activationkey_satellite.txt

opentofu如何成功将变量传递给“alias sudo='sudo -S <<< ${var.d_passwd_user}'", but fail to pass variables to a remotely executing script?

linux bash terraform inline opentofu
1个回答
0
投票

发生这种情况是因为 terraform/tofu 对外部事物一无所知。换句话说,在进行变量替换时,不会考虑 shell 脚本(和其他附带文件)。为了克服这个问题,您可以使用

templatefile
内置函数。例如:

  provisioner "file" {
    source      = templatefile("{path.module}/scripts/base.sh", {
      satelite_key    = var.satellite_key
      new_root_passwd = var.new_root_passwd
    })
    destination = "/tmp/base.sh"

    connection {
      type          = "ssh"
      user          = var.c_user
      password      = var.d_passwd_user
      host          = var.vm_ip
    }
  }

要实现此目的,您仍然需要编辑 shell 脚本以使用以下内容:

#!/bin/bash
echo 'root:${new_root_passwd}' | chpasswd
subscription-manager register --org=XXX --activationkey=${satellite_key} && echo '${satellite_key}' > /opt/activationkey_satellite.txt
© www.soinside.com 2019 - 2024. All rights reserved.