使用 Terraform 与 A​​zure VM 的 SSH 连接

2024-03-04

我已使用 Terraform 成功创建了一个 VM,作为 Azure 上资源组的一部分。下一步是在新机器中使用 ssh 并运行一些命令。为此,我创建了一个配置程序作为 VM 资源的一部分,并设置了 SSH 连接:

resource "azurerm_virtual_machine" "helloterraformvm" {
    name = "terraformvm"
    location = "West US"
    resource_group_name = "${azurerm_resource_group.helloterraform.name}"
    network_interface_ids = ["${azurerm_network_interface.helloterraformnic.id}"]
    vm_size = "Standard_A0"

    storage_image_reference {
        publisher = "Canonical"
        offer = "UbuntuServer"
        sku = "14.04.2-LTS"
        version = "latest"
    }


    os_profile {
        computer_name = "hostname"
        user     = "some_user"
        password = "some_password"
    }

    os_profile_linux_config {
        disable_password_authentication = false
    }

    provisioner "remote-exec" {
        inline = [
          "sudo apt-get install docker.io -y"
        ]
        connection {
          type     = "ssh"
          user     = "some_user"
          password = "some_password"
        }
    }

}

如果我运行“terraform apply”,它似乎会进入无限循环,尝试 ssh 失败,一遍又一遍地重复此日志:

azurerm_virtual_machine.helloterraformvm (remote-exec): Connecting to remote host via SSH...
azurerm_virtual_machine.helloterraformvm (remote-exec):   Host:
azurerm_virtual_machine.helloterraformvm (remote-exec):   User: testadmin
azurerm_virtual_machine.helloterraformvm (remote-exec):   Password: true
azurerm_virtual_machine.helloterraformvm (remote-exec):   Private key: false
azurerm_virtual_machine.helloterraformvm (remote-exec):   SSH Agent: true

我确信我做错了什么,但我不知道那是什么:(

EDIT:

我尝试在没有配置程序的情况下设置这台机器,并且使用给定的用户名/密码可以通过 SSH 连接到它,没有任何问题。但是,我需要在 Azure 门户中查找主机名,因为我不知道如何从 Terraform 检索它。怀疑日志中的“Host:”行为空,所以我想知道这是否与此有关?

UPDATE:

我尝试过不同的事情,例如在连接中指示主机名

host = "${azurerm_public_ip.helloterraformip.id}" 

and

host = "${azurerm_public_ip.helloterraformips.ip_address}"

如文档中所示,但没有成功。

我也尝试过使用 ssh-keys 而不是密码,但结果相同 - 连接尝试无限循环,没有明确的错误消息说明为什么不连接。


我已经成功地完成了这项工作。我改变了几件事:

  • 将主机名提供给connection.
  • 正确配置 SSH 密钥 - 它们需要未加密。
  • 拿走了connection元素出provisioner元素。

这是完整的工作 Terraform 文件,替换了 SSH 密钥等数据:

# Configure Azure provider
provider "azurerm" {
  subscription_id = "${var.azure_subscription_id}"
  client_id       = "${var.azure_client_id}"
  client_secret   = "${var.azure_client_secret}"
  tenant_id       = "${var.azure_tenant_id}"
}

# create a resource group if it doesn't exist
resource "azurerm_resource_group" "rg" {
    name = "sometestrg"
    location = "ukwest"
}

# create virtual network
resource "azurerm_virtual_network" "vnet" {
    name = "tfvnet"
    address_space = ["10.0.0.0/16"]
    location = "ukwest"
    resource_group_name = "${azurerm_resource_group.rg.name}"
}

# create subnet
resource "azurerm_subnet" "subnet" {
    name = "tfsub"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    virtual_network_name = "${azurerm_virtual_network.vnet.name}"
    address_prefix = "10.0.2.0/24"
    #network_security_group_id = "${azurerm_network_security_group.nsg.id}"
}

# create public IPs
resource "azurerm_public_ip" "ip" {
    name = "tfip"
    location = "ukwest"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    public_ip_address_allocation = "dynamic"
    domain_name_label = "sometestdn"

    tags {
        environment = "staging"
    }
}

# create network interface
resource "azurerm_network_interface" "ni" {
    name = "tfni"
    location = "ukwest"
    resource_group_name = "${azurerm_resource_group.rg.name}"

    ip_configuration {
        name = "ipconfiguration"
        subnet_id = "${azurerm_subnet.subnet.id}"
        private_ip_address_allocation = "static"
        private_ip_address = "10.0.2.5"
        public_ip_address_id = "${azurerm_public_ip.ip.id}"
    }
}

# create storage account
resource "azurerm_storage_account" "storage" {
    name = "someteststorage"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    location = "ukwest"
    account_type = "Standard_LRS"

    tags {
        environment = "staging"
    }
}

# create storage container
resource "azurerm_storage_container" "storagecont" {
    name = "vhd"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    storage_account_name = "${azurerm_storage_account.storage.name}"
    container_access_type = "private"
    depends_on = ["azurerm_storage_account.storage"]
}



# create virtual machine
resource "azurerm_virtual_machine" "vm" {
    name = "sometestvm"
    location = "ukwest"
    resource_group_name = "${azurerm_resource_group.rg.name}"
    network_interface_ids = ["${azurerm_network_interface.ni.id}"]
    vm_size = "Standard_A0"

    storage_image_reference {
        publisher = "Canonical"
        offer = "UbuntuServer"
        sku = "16.04-LTS"
        version = "latest"
    }

    storage_os_disk {
        name = "myosdisk"
        vhd_uri = "${azurerm_storage_account.storage.primary_blob_endpoint}${azurerm_storage_container.storagecont.name}/myosdisk.vhd"
        caching = "ReadWrite"
        create_option = "FromImage"
    }

    os_profile {
        computer_name = "testhost"
        admin_username = "testuser"
        admin_password = "Password123"
    }

    os_profile_linux_config {
      disable_password_authentication = false
      ssh_keys = [{
        path     = "/home/testuser/.ssh/authorized_keys"
        key_data = "ssh-rsa xxx [email protected] /cdn-cgi/l/email-protection"
      }]
    }

    connection {
        host = "sometestdn.ukwest.cloudapp.azure.com"
        user = "testuser"
        type = "ssh"
        private_key = "${file("~/.ssh/id_rsa_unencrypted")}"
        timeout = "1m"
        agent = true
    }

    provisioner "remote-exec" {
        inline = [
          "sudo apt-get update",
          "sudo apt-get install docker.io -y",
          "git clone https://github.com/somepublicrepo.git",
          "cd Docker-sample",
          "sudo docker build -t mywebapp .",
          "sudo docker run -d -p 5000:5000 mywebapp"
        ]
    }

    tags {
        environment = "staging"
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 Terraform 与 A​​zure VM 的 SSH 连接 的相关文章

  • 如何使用GDB修改内存内容?

    我知道我们可以使用几个命令来访问和读取内存 例如 print p x 但是如何更改任何特定位置的内存内容 在 GDB 中调试时 最简单的是设置程序变量 参见GDB 分配 http sourceware org gdb current onl
  • linux perf:如何解释和查找热点

    我尝试了linux perf https perf wiki kernel org index php Main Page今天很实用 但在解释其结果时遇到了困难 我习惯了 valgrind 的 callgrind 这当然是与基于采样的 pe
  • nslookup 报告“无法解析 '(null)': 名称无法解析”,尽管它成功解析了 DNS 名称

    我在 ubuntu 上 并且正在运行 docker 默认桥接网络 我有 Zookeeper kafka 的容器化版本 以及我编写的与 kafka 对话的应用程序 I do a docker exec it
  • 如何将图像和 POST 数据上传到 Azure 移动服务 ApiController 终结点?

    我正在尝试上传图片and POST表单数据 尽管理想情况下我希望它是json 到我的端点Azure 移动服务应用 我有ApiController method HttpPost Route api upload databaseId sea
  • 在天蓝色辅助角色中使用 QueueClient.OnMessage

    我有一个 Azure 辅助角色 负责检查 4 个服务总线队列 目前 我只是使用循环方法来手动检查队列 while true loop through my queues to check for messages Azure SDK 2 0
  • Bot Framework Node.js 发送给特定用户的临时消息

    我已经盯着这个问题好几个小时了 找不到解决方案 即使根据所有建议 它应该很容易 https learn microsoft com en us bot framework nodejs bot builder nodejs proactiv
  • NPTL 和 POSIX 线程有什么区别?

    NPTL 和 POSIX 线程之间的基本区别是什么 这两者是如何演变的 POSIX 线程 pthread 不是一个实现 它是几个函数的 API 规范 纸上的标准 英文 其名称以pthread 以及定义在
  • Linux:如何从特定端口发送TCP数据包?

    如何打开原始套接字以从特定 TCP 端口发送 我希望所有连接始终来自临时端口以下的一系列端口 如果您正在使用raw套接字 然后只需在数据包标头中填写正确的 TCP 源端口即可 相反 如果您使用 TCP 套接字接口 socket connec
  • 使用 Adal 代表用户访问 Azure KeyVault

    以下是控制台应用程序和 ClientID RedirectUri 来自 azure Active Directory 中创建的本机应用程序 var authContext new AuthenticationContext string F
  • 如何在shell中输出返回码?

    我正在尝试通过调用自定义 shell 脚本sh bin sh c myscript sh gt log txt 2 gt 1 echo 该命令的输出是创建的后台进程的 PID 我想指导 bin sh保存返回码myscript sh到某个文件
  • 在 Linux 上使用多处理时,TKinter 窗口不会出现

    我想生成另一个进程来异步显示错误消息 同时应用程序的其余部分继续 我正在使用multiprocessingPython 2 6 中的模块来创建进程 我试图用以下命令显示窗口TKinter 这段代码在Windows上运行良好 但在Linux上
  • iptables通过注释删除特定规则

    我需要删除一些具有相同评论的规则 例如 我有带有 comment test it 的规则 所以我可以像这样获得它们的列表 sudo iptables t nat L grep test it 但是我怎样才能删除所有带有注释 测试它 的 PR
  • Azure 共享计划上的 SSL?

    我有 1 个网站 1 个数据库和 1 个 SSL 托管在 azure 上 我曾经拥有 基本 托管套餐 但每个月要支付 70 美元才能获得基本设置 并且所有内容都具有最小的缩放比例 我意识到我的低流量站点不需要专用计算机 因此我尝试转向共享计
  • ubuntu:升级软件(cmake)-版本消歧(本地编译)[关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 我的机器上安装了 cmake 2 8 0 来自 ubuntu 软件包 二进制文件放置在 usr bin cmake 中 我需要将 cmake 版本至少
  • SSE:跨页边界的未对齐加载和存储

    我在页面边界旁边执行未对齐加载或存储之前读过某处 例如使用 mm loadu si128 mm storeu si128内在函数 代码应首先检查整个向量 在本例中为 16 个字节 是否属于同一页 如果不属于同一页 则切换到非向量指令 我知道
  • 如何在 Microsoft Azure Function 中创建类?

    可能这是一个错误的问题 但我需要创建一个模型 类并在天蓝色函数中访问相同的模型 类 我无法找到如何创建课程 类可以内联创建 因为它通常会在常规 C 项目中定义类 这是一个例子 https github com Azure azure web
  • Azure VM 上的 MongoDb 连接超时

    将我的 Azure Web 应用程序连接到 Azure VM 上托管的 MongoDb 时 我遇到一些超时问题 2015 12 19T15 57 47 330 0100 I NETWORK Socket recv errno 10060 A
  • 查找哪个程序运行另一个程序

    我有一个 NAS 运行在 Redhat Linux 的有限版本上 我按照指示破解了它 这样我就可以访问 shell 这很有帮助 我还做了一些修改 其他人也做过修改 除了一个问题之外 它们似乎都工作得很好 不知何故 每隔 22 天 系统就会关
  • 在脚本内使用不带密码的 sudo

    由于某种原因 我需要作为用户在没有 sudo 的情况下运行脚本 script sh 该脚本需要 root 权限才能工作 我认为将 sudo 放入 script sh 中是唯一的解决方案 让我们举个例子 script sh bin sh su
  • Azure 事件中心 - 按顺序接收事件

    我使用下面的代码从 Azure Event Hub 接收事件 https learn microsoft com en us azure event hubs event hubs dotnet framework getstarted s

随机推荐

  • Docker 公开所有端口或从 7000 到 8000 的端口范围

    我可以在 Dockerfile 中指定端口范围吗 EXPOSE 7000 8000 当运行容器时 将所有这些暴露的端口绑定到主机上的相同端口 docker run p 7000 8000 7000 8000 从 Docker 1 5 开始
  • 从多个设备同时在多个轨道上录制音频

    我目前正在使用 JavaScript 中的 Web Audio API 开发音频 Web 应用程序 但我发现了一个问题 我需要从不同的设备同时录制到不同的轨道 想象一下 例如 一个具有 8 个输入的声卡独立地录制在 8 个缓冲区中 以便录制
  • 如何通过宁静向druid插入数据

    通过以下教程http druid io docs latest tutorials tutorial loading streaming data html http druid io docs latest tutorials tutor
  • matlab从数组中随机选择数字及其索引

    我有一个数组 c 1 2 3 4 5 可能有多个重复数字 我想从数组中随机选择一个元素及其索引 有谁能够帮助我 你可以find http in mathworks com help matlab ref find html refresh
  • Common Lisp 的 Man 或 javadoc 风格的文档

    是否有任何类型的常见 lisp 文档 例如 javadoc man 甚至类似智能感知的弹出窗口 我刚刚开始学习common lisp 手上记忆力不够 我正在使用 emacs 和 slime 它有制表符补全功能 但看起来信息量不大 Thank
  • 如果我在代码中犯了一个错误并导致JavaScript中出现无限循环并且它不断调用alert(),有没有办法停止循环?

    有时我使用调试代码来警告 javascript 中的某些内容 例如 匹配正则表达式中的某些内容 但忘记了修饰符 并且警报处于无限循环中 或者如果循环与模式匹配 300 次 如果使用 Firefox 警报会不断出现 甚至无法关闭选项卡 窗口或
  • 将 PDF 转换为图像,无需非 python 依赖项

    我想创建一个可以部署到其他计算机上的exe 该程序需要能够读取 pdf 并将其转换为图像 但我不希望其他用户必须下载依赖项 我的理解是 py2image 和 wand 都需要外部依赖项 如果您转换为 exe 其他用户也需要自己下载依赖项 还
  • Spring Remoting 序列化和反序列化

    我们在项目中使用 Spring Remoting 一段时间了 它与其他一些系统一起使用来访问我们的网络服务 我们目前正在研究网络服务采用的参数 但与此同时 我们正在努力独立于消费者 所以 目前我的问题是关于序列化和反序列化在 Spring
  • 将 Objective-C (#define) 宏转换为 Swift

    简而言之 我正在尝试转换 define宏转换为某种原生 Swift 数据结构 只是不确定如何或何种类型 Details 我想尝试并复制以下内容 define从 Objective C 到 Swift 资料来源 JoeKun FileMD5H
  • As3 复制对象

    有时我们需要克隆一个对象 但是如果一个显示对象有一些子对象并使用如下函数 function clone source var b ByteArray new ByteArray b writeObject source b position
  • Socket.io 1.0.5:如何保存会话变量?

    不幸的是 socket io 开发团队决定弃用函数 set 和 get 问题是这两个函数允许我们将变量保存到会话中 所以我的问题是 socket io 1 0 5 上的以下代码等效于什么 socket set mySessionVar my
  • 为什么 R 计算在我的虚拟机中不一致?

    我正在尝试构建一个新的虚拟机R以及下面的软件包作为R server根据我的计算 this is how I install my R packages function install packages folder dir create
  • 删除带有条件的
    标记的多个实例

    正如我在帖子中所说 我只是一个正则表达式学徒 一切都从这个线程开始 Stackoverflow 从预标记内部删除 br https stackoverflow com questions 30577912 remove br from in
  • 列表框多值选择

    我已经根据查询输出创建了表单 我使用了三个组合框和一个列表框 第一个组合框为我提供了部门列表 选择第二个组合框为我提供了该部门的位置 不同 第三个组合框为我提供了该位置的 不同 项目 然后下一个是显示该项目的一些代码的列表框 问题是我只能从
  • QCoreApplication 带有 WMI 的 QApplication

    我在MSDN网站上找到了一些WMI C 应用示例 我已经尝试过以下链接中的代码 http msdn microsoft com en us library aa390423 28v VS 85 29 aspx http msdn micro
  • R - 将 R 模型序列化为 JSON [关闭]

    Closed 此问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 是否有一些好的 R 包可以将预测模型和其他复杂对象与 JSON 相互转换 我从这个例子中得到了线性回归模
  • 如果下一个元素为空则隐藏该元素

    我有以下代码 h3 class hideIfDivEmpty title h3 div div 我想当 div 为空时隐藏 h3 元素 我愿意更改 html 结构 但 h3 必须位于 div 之外 因为它的内容是动态更改的 有没有办法在 C
  • 您可以从另一个线程访问 UI 元素吗? (未设置)

    我在 google here 上看到很多关于从另一个线程更新 UI 元素的线程 如果我只想获取复选框的值怎么办 我可以做到这一点而不需要做任何特别的事情吗 Edit 看来我得收回之前写的东西了 尝试了以下方法 添加了一个名为的文本框myTe
  • C++ 模板只是伪装的宏吗?

    我已经用 C 编程几年了 并且经常使用 STL 并且多次创建了自己的模板类来看看它是如何完成的 现在 我正在尝试将模板更深入地集成到我的面向对象设计中 一个挥之不去的想法不断浮现在我的脑海中 它们只是一个宏 真的 你可以使用 defines
  • 使用 Terraform 与 A​​zure VM 的 SSH 连接

    我已使用 Terraform 成功创建了一个 VM 作为 Azure 上资源组的一部分 下一步是在新机器中使用 ssh 并运行一些命令 为此 我创建了一个配置程序作为 VM 资源的一部分 并设置了 SSH 连接 resource azure