Как выполнить команду PowerShell через Terraform - PullRequest
0 голосов
/ 30 мая 2018

Я пытаюсь создать экземпляр Windows Ec2 из AMI и выполняю команду 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"]
  }

}

, и я сталкиваюсь со следующей ошибкой:

  • 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 'не распознается как имя командлета, функции, файла сценария или работоспособной программы.Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку.В строке: 1 символ: 72
  • C: \ ProgramData \ Amazon \ EC2-Windows \ Launch \ Scripts \ InitializeInstance.ps1 <<<< -Schedule <ul>
  • CategoryInfo: ObjectNotFound: (C:\ ProgramData ... izeInstance.ps1: String) [], CommandNotFoundException
  • FullyQualifiedErrorId: CommandNotFoundException

Ответы [ 3 ]

0 голосов
/ 16 января 2019

FTR: ответ Брэндона является правильным, за исключением того, что пример кода, предоставленного для remote-exec, включает ключи, которые не поддерживаются поставщиком.

Ни command, ни interpreter не поддерживаются.

https://www.terraform.io/docs/provisioners/remote-exec.html

0 голосов
/ 16 апреля 2019

То, что Брайан считает правильным, вы получите «недопустимый или неизвестный ключ: интерпретатор».

Чтобы правильно запустить powershell, вам нужно будет запустить его следующим образом, основываясь на ответе Брэндона:

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"
        ]
      }
0 голосов
/ 30 мая 2018

Вы используете поставщика local-exec, который запускает код PowerShell запроса на рабочей станции, на которой работает Terraform:

Поставщик local-exec вызывает локальный исполняемый файл после ресурсасоздано.Это вызывает процесс на компьютере, на котором работает Terraform, а не на ресурсе.

Звучит так, как будто вы хотите выполнить сценарий powershell в результирующем экземпляре, и в этом случае вам нужно будет использовать remote-exec инициатор, который запустит ваш PowerShell на целевом ресурсе:

Поставщик remote-exec вызывает сценарий на удаленном ресурсе после его создания.Это можно использовать для запуска инструмента управления конфигурацией, начальной загрузки в кластер и т. Д.

Вам также необходимо будет указать соединение подробности, например:

  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}"
    }
  }

Это означает, что этот экземпляр также должен быть готов принимать соединения WinRM.

Хотя есть и другие варианты выполнения этой задачи.Например, используя userdata , , которые Terraform также поддерживает .Это может выглядеть следующим образом:

Пример использования файла пользовательских данных в Terraform

Файл с именем userdata.txt:

<powershell>
C:\\ProgramData\\Amazon\\EC2-Windows\\Launch\\Scripts\\InitializeInstance.ps1 -Schedule
</powershell>

Запуск экземпляра с использованием файла пользовательских данных:

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)}"
}

Интерполяция файла будет считывать содержимое файла userdata в виде строки для передачи в userdata для запуска экземпляра.Как только экземпляр запускается, он должен запустить скрипт так, как вы ожидаете.

...