如何通过Terraform执行PowerShell命令

Aks*_*kar 1 powershell amazon-ec2 amazon-web-services terraform

我正在尝试从AMI创建Windows Ec2实例,并在该实例上执行powershell命令:

data "aws_ami" "ec2-worker-initial-encrypted-ami" {
    filter {
        name   = "tag:Name"
        values = ["ec2-worker-initial-encrypted-ami"]
    }  
}

resource "aws_instance" "my-test-instance" {
  ami             = "${data.aws_ami.ec2-worker-initial-encrypted-ami.id}"
  instance_type   = "t2.micro"

  tags {
    Name = "my-test-instance"
  }

  provisioner "local-exec" {
    command = "C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1 -Schedule",
    interpreter = ["PowerShell"]
  }

}
Run Code Online (Sandbox Code Playgroud)

而且我面临以下错误:

  • aws_instance.my-test-instance:运行命令'C:\ ProgramData \ Amazon \ EC2-Windows \ Launch \ Scripts \ InitializeInstance.ps1 -Schedule'时出错:退出状态1.输出:术语'C:\ ProgramData \ Amazon \ EC2-Windows \ Launch \ Scripts \ InitializeInstance.ps1'无法识别为cmdlet,函数,脚本文件或可运行程序的名称。检查名称的拼写,或者是否包含路径,请验证路径是否正确,然后重试。在线:1字符:72
  • C:\ ProgramData \ Amazon \ EC2-Windows \ Launch \ Scripts \ InitializeInstance.ps1 <<<<-计划
    • CategoryInfo:ObjectNotFound:(C:\ ProgramData ... izeInstance.ps1:String)[],CommandNotFoundException
    • FullyQualifiedErrorId:CommandNotFoundException

Bra*_*ler 7

您正在使用local-exec供应商,该供应商在运行Terraform的工作站上运行请求Powershell代码:

创建资源后,local-exec提供者将调用本地可执行文件。这将在运行Terraform的计算机上而不是资源上调用一个进程。

听起来您想在结果实例上执行powershell脚本,在这种情况下,您将需要使用remote-exec置备器,该置备器将在目标资源上运行powershell:

远程执行提供者在创建后在远程资源上调用脚本。这可用于运行配置管理工具,引导到集群等。

您还需要包括连接详细信息,例如:

  provisioner "remote-exec" {
    command = "C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1 -Schedule",
    interpreter = ["PowerShell"]
    connection {
      type     = "winrm"
      user     = "Administrator"
      password = "${var.admin_password}"
    }
  }
Run Code Online (Sandbox Code Playgroud)

这意味着该实例还必须准备好接受WinRM连接。

但是,还有其他选项可以完成此任务。例如使用userdataTerraform也支持。这可能类似于以下示例:

在Terraform中使用userdata文件的示例

文件名为userdata.txt

<powershell>
C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1 -Schedule
</powershell>
Run Code Online (Sandbox Code Playgroud)

使用userdata文件启动实例:

resource "aws_instance" "my-test-instance" {
  ami             = "${data.aws_ami.ec2-worker-initial-encrypted-ami.id}"
  instance_type   = "t2.micro"

  tags {
    Name = "my-test-instance"
  }

  user_data = "${file(userdata.txt)}"
}
Run Code Online (Sandbox Code Playgroud)

文件插值将读取用户数据文件作为字符串的内容传递到用户数据的情况下推出的。实例启动后,它将按预期运行脚本。


Pix*_*xel 5

布赖恩声称是正确的,您将收到“无效或未知密钥:解释器”错误。

要正确运行 powershell,您需要根据 Brandon 的回答按如下方式运行它:

provisioner "remote-exec" {
    connection {
      type     = "winrm"
      user     = "Administrator"
      password = "${var.admin_password}"
    }

inline = [
         "powershell -ExecutionPolicy Unrestricted -File C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1 -Schedule"
        ]
      }
Run Code Online (Sandbox Code Playgroud)

编辑 要将文件复制到机器上,请使用以下命令:

  provisioner "file" {
    source      = "${path.module}/some_path"
    destination = "C:/some_path"

    connection {
      host = "${azurerm_network_interface.vm_nic.private_ip_address}"
      timeout  = "3m"
      type     = "winrm"
      https    = true
      port     = 5986
      use_ntlm = true
      insecure = true

      #cacert = "${azurerm_key_vault_certificate.vm_cert.certificate_data}"
      user     = var.admin_username
      password = var.admin_password
    }
  }
Run Code Online (Sandbox Code Playgroud)

更新:目前 hashicorp 不推荐配置器,完整的说明和解释(很长)可以在以下位置找到:terraform.io/docs/provisioners/index.html

  • 这是完全没用的。我们不需要运行 AMI 上已存在的 powershell 脚本。我们需要它来运行运行 terraform 的计算机上存在的 powershell 脚本。换句话说,就是如何将powershell脚本发送到远程机器并执行它。 (2认同)