【问题标题】:How can I provision IIS on EC2 Windows with a resource?如何使用资源在 EC2 Windows 上配置 IIS?
【发布时间】:2020-09-02 18:57:31
【问题描述】:

我刚刚开始处理一个托管在带有 IIS 的 AWS EC2 Windows 实例上的项目。我想将此设置移动到更可靠的地方,我想做的第一件事就是远离手动设置和配置的雪花服务器。

于是开始研究 Hashicorp 的 Terraform。我的想法是我可以在 Terraform 中定义包括网络等在内的整个设置,并确保它配置正确。

我想我会从定义服务器开始。安装了 IIS 的简单 Windows Server 实例。但这是我遇到的第一个问题。我以为我可以从 Terraform 配置 IIS。我想你不能。所以我的下一个想法是将 Terraform 与 Powershell Desired State Configuration 结合起来。

我可以使用 DSC 在机器上设置 IIS 服务器。但我被困在从 Terraform 调用 DSC。我可以很容易地配置一个香草服务器。我曾尝试寻找一篇关于如何将 DSC 与 Terraform 结合使用的好博文,但找不到解释如何使用的博文。

谁能给我指出一个阅读这个的好地方?或者,如果我找不到这个的原因是它只是一种不好的做法,我应该以另一种方式来做,那么请教育我。

谢谢

如何在 EC2 Windows 上使用资源配置 IIS?

【问题讨论】:

  • 是的,您应该将 Terraform 链接到软件供应商,并且 Terraform 本身不应该用于软件供应。例如,您可以通过 provisioner 块直接从 Terraform 执行此操作,也可以使用 null 资源执行此操作。您在寻找 DSC 示例时面临的问题是因为它不是常用工具。通常人们为此使用 Ansible,或者有时使用 Puppet 或 Chef。将有许多与 Terraform 结合使用的工具的指南和示例。或者,通过 Packer 和软件配置程序将 IIS 烘焙到自定义 AMI。
  • 谢谢马特!我一定会关注 Ansible、Puppet 和 Chef。我之前的一个项目使用了 Chef,但当时我与该工具没有任何关系。我听说过关于 DSC 的好消息。但是你会说现在采用它可能为时过早吗?

标签: amazon-web-services iis amazon-ec2 terraform powershell-dsc


【解决方案1】:

您可以在启动时运行任意 PowerShell 脚本,如下所示:

resource "aws_instance" "windows_2016_server" {
//...
user_data = <<-EOF
<powershell>
$file = $env:SystemRoot + "\Temp\${var.some_variable}" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>
EOF
//...
}

你需要一个像这样定义的变量来使用它(我提供了一个更复杂的例子,所以有一个更有用的起点)

variable "some_variable" {
    type = string
    default = "UserDataTestFile"
}

您可以调用 DSC 来设置 IIS,就像您通常在服务器上的 PowerShell 中以交互方式一样。

您可以在此处阅读有关 Windows 上的 user_data 的更多信息: https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2-windows-user-data.html

user_data 将直接包含您的 PowerShell。

您可以使用 templatefile("${module.path}/user-data.ps1, {some_variable = var.some_variable}) 代替上面的内联脚本。

将 user-data.ps1 与引用它的 TF 文件放在同一目录中:

<powershell>
$file = $env:SystemRoot + "\Temp\${some_variable}" + (Get-Date).ToString("MM-dd-yy-hh-mm")
New-Item $file -ItemType file
</powershell>

您仍然需要在脚本源代码周围添加&lt;powershell&gt;&lt;/powershell&gt; 标签。这是 EC2 上的 Windows 如何期望 PowerShell 用户数据脚本的要求。

然后更新你的TF文件如下:

resource "aws_instance" "windows_2016_server" {
//...
user_data = templatefile("${module.path}/user-data.ps1, {
  some_variable = var.some_variable
})

//...
}

请注意,templatefile 读取的文件中包含 some_variable 和 NOT var.some_variable 等变量。

在此处阅读有关 模板文件 的更多信息:

https://www.terraform.io/docs/configuration/functions/templatefile.html

【讨论】:

  • 谢谢 Alain 所以我会使用File Provisioner 将我的 DSC 文件上传到服务器,然后使用用户数据调用它们。只是一个愚蠢的问题。它被称为用户数据,所以当我第一次看到它时,我认为它会在登录时运行而不是启动。但事实并非如此吗?最好我不想登录实例。
  • 我通过在用户数据中的 powershell 脚本中创建一个用户并使用该用户首先上传 DSC 文件,然后使用 remote-exec 执行 DSC 配置来使其工作。但是在我完成所有工作之后,我可以看到这并不是一个真正的好方法,就像你也说 Alain 一样。我喜欢 DSC 设置服务器的方式。所以我想我会继续沿着这条路走下去。但我会改为在用户数据中设置 DSC Pull,并尝试查看是否可以直接从 S3 存储桶中提取。
  • 非常感谢。我会试试看。
  • 所以我做了一点挖掘,发现您需要设置一个 DSC Pull 服务器,而这不能是一个简单的 S3 存储桶。哦,好吧... Azure 有一项名为 Azure 自动化的廉价服务可以实现此目的。这可以连接到我的 GitHub 存储库,在那里我可以在版本控制下存储我的 DSC 配置。然后我要做的是使用用户数据将我新配置的 EC2 实例注册到 Azure 自动化......并且我很快就将它全部启动并运行。如果您在 Azure 中运行 VM,则有 Terraform 模块,但我们没有。我将把它清理干净,然后在这里提供一步一步的运行。
  • 感谢您将我指向用户数据@alain-odea。它大大简化了设置。
猜你喜欢
  • 2021-07-05
  • 2021-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-31
  • 1970-01-01
  • 2010-09-16
  • 1970-01-01
相关资源
最近更新 更多