建议和反馈

请填写你的反馈内容

带有Terraform的Azure VM自定义脚本扩展

2019-12-03 ·777次阅读 ·读完需要4分钟

Terraform提供对Azure虚拟机自定义脚本扩展的支持,该扩展通常用于配置新创建的虚拟机并对其进行准备,以使其准备执行其角色。这些自定义脚本中执行的典型任务包括安装其他软件包,配置系统服务,创建用户等。

在非常简单的情况下,可以将自定义脚本定义为简单脚本commandToExecute,例如,如果仅需要安装软件包即可。但是,在大多数情况下,需要运行更复杂的脚本来执行配置。您可以使用来指定要从网络位置下载的脚本fileUris,但是会创建对外部组件的依赖关系,并且可能导致某些问题,例如,如果网络位置不可达,或者您想确切地找到哪个位置在过去的部署中使用并执行了该脚本的版本。

如自定义脚本文档中所述,您还可以在扩展设置中将整个脚本作为script属性中的Base64编码的字符串传递这是一个不错的解决方案,其中脚本包含在部署中,没有外部依赖项。

Terraform提供了几种以script非常简单的方式组装此属性的方法。

最简单的方法是使用该filebase64功能,功能将读取文件,并使用Base64对其进行编码,然后将结果包括在资源配置中。

resource "azurerm_virtual_machine_extension" "test" {
  name                 = "hostname"
  location             = "${azurerm_resource_group.test.location}"
  resource_group_name  = "${azurerm_resource_group.test.name}"
  virtual_machine_name = "${azurerm_virtual_machine.test.name}"
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"
  settings = <<SETTINGS
    {
        "script": "${filebase64("custom_script.sh")}"
    }SETTINGS}

如果需要向脚本传递一些值,另一种选择是使用templatefileTerraform 0.12和更高版本中提供的新功能。这使您可以读取文件的内容,并使用一组提供的变量将其呈现为模板。使用此功能,您可以使用通常的${ ... }序列将Terraform配置中的任何变量传递给脚本您还必须使用该base64encode函数对结果进行显式Base64编码。

resource "azurerm_virtual_machine_extension" "test" {
  name                 = "hostname"
  location             = "${azurerm_resource_group.test.location}"
  resource_group_name  = "${azurerm_resource_group.test.name}"
  virtual_machine_name = "${azurerm_virtual_machine.test.name}"
  publisher            = "Microsoft.Azure.Extensions"
  type                 = "CustomScript"
  type_handler_version = "2.0"
  settings = <<SETTINGS
    {
        "script": "${base64encode(templatefile("custom_script.sh", {
          vmname="${azurerm_virtual_machine.test.name}"
        }))}"
    }SETTINGS}

在此示例中,我们传递了一个vmname变量,变量使用的值进行了初始化azurerm_virtual_machine.test.name可以使用以下语法在脚本中使用此变量:

#!/bin/shecho "This is a test script."echo "This machine name is: ${vmname}"

我发现这是一种使配置脚本与Terraform配置分开的非常干净,简单的方法,但是最终仍然得到了一个完整的资源定义,而没有外部依赖性。


评论(0)问答(0)
请先登录或注册

请先登陆或注册

相关推荐

Jenkins系列:Jenkins构建常见错误

Jenkins构建常见问题项目构建失败常见原因iOS项目:检查编译日志。(注:编译日志等同于XCode的编译日志)android项目:检查编译日志。(注:编译日志等同于Android Studio的编......
moondesign · 2019-12-09
193阅读 · 0赞赏 · 0问答

使用Python和Keras的有关命名实体识别(NER)的完整教程

假设您是报纸行业的编辑,每天都会收到数千个故事。您将如何找到与体育,政治等特定领域相关的故事?您会讲完所有这些故事吗?无权利?一个可以帮助您划分为不同类别的系统怎么样?该系统还可以执行复杂的任务,例如......
三地 · 2019-12-09
251阅读 · 0赞赏 · 0问答

C#中的智能合约入门

在上一篇文章NEO区块链简介中,我们讨论了NEO区块链及其用途,在本文中,我们学习了如何使用Visual Studio和C#为NEO区块链智能合约设置开发机器。在下一篇文章中,我将更详细地讨论智能合约......
区块技术花 · 2019-12-07
498阅读 · 0赞赏 · 0问答

如何使用Metamask和Remix在Ropsten TestNet上部署和测试智能合约

想象一下要去一家冰淇淋店,品尝一些口味的冰淇淋,然后再选择要支付的口味。以太坊测试网就是这样。在将智能合约部署到实际花费真实以太币的真实以太坊网络之前,您需要通过将其部署在只是模拟真实以太坊网络的测试......
比特币论坛 · 2019-12-06
544阅读 · 0赞赏 · 0问答

在.NET Core中构建基本区块链

区块链技术是比特币的基础,比特币是世界上最受欢迎的加密货币。随着比特币的流行,区块链也获得了很大的曝光。人们现在也开始在非加密货币类型的应用程序中使用区块链。看看中本聪(Satoshi Nakamot......
btc论坛 · 2019-12-06
579阅读 · 0赞赏 · 0问答

去中心化应用程序堆栈

目前,Intranet处于隔离状态,无法相互通信和共享信息。现在基于区块链的网络也是如此。甚至对所有人开放的公共网络(例如比特币网络)也可以在其他公共网络之间独立运行,而无法在它们之间直接进行通信。在......
开发者小白 · 2019-12-05
503阅读 · 0赞赏 · 0问答

VeelDiana

2153

LK币

7

粉丝

36

笔记

感谢"VeelDiana"

这篇精彩的笔记,目前已经帮助

  • 0
  • 0
  • 7
  • 7
  • 7
喜欢0
链客社群 加入

微博进入

商务合作>

广告投放>

公司名称:北京链客行科技有限公司

联系方式:010-67707199

ICP备案号:京ICP备18032136号

Copyright:链客区块链技术问答社区 版权所有

感谢您的提问,问题被社区永久收入以便新人查看。一定要记得采纳最佳答案哦!加油!

感谢您的善举,每一次解答会成为新人的灯塔,回答被采纳后获得20算力和相应的LK币奖励

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!

您将赞赏给对方2LK币的奖励哦!感谢您的赞赏!