Terraform:创建 Azure 虚机
笔者在前文《Terraform 简介》中简单介绍了 Terraform 相关的概念,本文让我们使用 Terraform 在 Azure 上创建一个虚机,以此来直观体验一下 Terraform 强大威力。说明:本文的演示环境为 ubuntu 16.04。
provider 与 resource
在 Terraform 的配置文件中,比较常见的配置类型有 provider 和 resource。
provider 在 Terraform 中负责管理资源的生命周期:创建、读取、更新、删除。比如访问 AWS 中的资源需要使用 AWS 的 provider,访问 Azure 中的资源需要使用 Azure 的 provider。
resource 是基础设施的一个组件。它可能是一些低级组件,例如物理服务器、虚拟机或容器。也可以是更高级别的组件,如电子邮件提供程序、DNS记录或数据库提供程序。
指定 provider
provider "azurerm" {
}
访问 Azure 中的资源需要使用 Azure 的 provider,即这里的 "azurerm"。这里没有把访问 azure 的认证信息写进来,还是以前文《Terraform 简介》中设置环境变量的方式来提供认证信息。
创建 Resource Group
下面的配置文件在 eastasia 的数据中心创建名称为 NickResourceGroup 的 Resource Group:
resource "azurerm_resource_group" "nicktfrg" {
name = "NickResourceGroup"
location = "eastasia"
tags {
environment = "My Terraform Demo"
}
}
在配置文件的其他部分中,可以使用 ${azurerm_resource_group.nicktfrg.name} 引用该 Resource Group。
创建虚拟网络
下面的配置在 Resource Group NickResourceGroup 中创建名为 NickVnet 的虚拟网络,其网络空间为 10.0.0.0/16:
resource "azurerm_virtual_network" "nicktfnetwork" {
name = "NickVnet"
address_space = ["10.0.0.0/16"]
location = "eastasia"
resource_group_name = "${azurerm_resource_group.nicktfrg.name}"
tags {
environment = "My Terraform Demo"
}
}
然后在 NickVnet 虚拟网络中创建名称为 NickSubnet 的子网:
resource "azurerm_subnet" "nicktfsubnet" {
name = "NickSubnet"
resource_group_name = "${azurerm_resource_group.nicktfrg.name}"
virtual_network_name = "${azurerm_virtual_network.nicktfnetwork.name}"
address_prefix = "10.0.2.0/24"
}
创建公共 IP 地址
如果要通过网络访问 Azure 云端的虚机,需要创建公共的 IP 地址并分配给虚机。下面的配置创建名为 nickPublicIP 的公共 IP 地址:
resource "azurerm_public_ip" "nicktfpublicip" {
name = "NickPublicIP"
location = "eastasia"
resource_group_name = "${azurerm_resource_group.nicktfrg.name}"
public_ip_address_allocation = "dynamic"
tags {
environment = "My Terraform Demo"
}
}
创建网络安全组
网络安全组控制出入虚机的网络流量。 下面的配置创建名为 NickNetworkSecurityGroup 的网络安全组并定义规则放行 TCP 端口 22 上的 SSH 数据包:
resource "azurerm_network_security_group" "nicktfnsg" {
name = "NickNetworkSecurityGroup"
location = "eastasia"
resource_group_name = "${azurerm_resource_group.nicktfrg.name}"
security_rule {
name = "SSH"
priority =
direction = "Inbound"
access = "Allow"
protocol = "Tcp"
source_port_range = "*"
destination_port_range = ""
source_address_prefix = "*"
destination_address_prefix = "*"
}
tags {
environment = "My Terraform Demo"
}
}
创建虚拟网卡
虚拟网卡(NIC)将虚机连接到指定的虚拟网络、公共 IP 地址和网络安全组。下面的 Terraform 配置信息创建名为 NickNIC 的虚拟 NIC,并连接到已创建的虚拟网络资源:
resource "azurerm_network_interface" "nicktfnic" {
name = "NickNIC"
location = "eastasia"
resource_group_name = "${azurerm_resource_group.nicktfrg.name}"
network_security_group_id = "${azurerm_network_security_group.nicktfnsg.id}"
ip_configuration {
name = "NickNicConfiguration"
subnet_id = "${azurerm_subnet.nicktfsubnet.id}"
private_ip_address_allocation = "dynamic"
public_ip_address_id = "${azurerm_public_ip.nicktfpublicip.id}"
}
tags {
environment = "My Terraform Demo"
}
}
创建存储账户
若要为新建的虚机存储启动诊断日志,需要一个存储帐户。这些启动诊断日志有助于排查故障和监视虚机状态。这里创建的存储帐户仅用于存储启动诊断数据。由于每个存储帐户必须具有唯一名称,下面的配置会先生成一些随机文本:
resource "random_id" "randomId" {
keepers = {
# Generate a new ID only when a new resource group is defined
resource_group = "${azurerm_resource_group.nicktfrg.name}"
}
byte_length =
}
接下来就可以创建存储帐户了。 下面的配置会创建一个存储帐户,其名称基于上一步中生成的随机文本:
resource "azurerm_storage_account" "nicktfstorageaccount" {
name = "nicksa${random_id.randomId.hex}"
resource_group_name = "${azurerm_resource_group.nicktfrg.name}"
location = "eastasia"
account_replication_type = "LRS"
account_tier = "Standard"
tags {
environment = "My Terraform Demo"
}
}
创建虚机
准备好上面的资源后就可以开始创建虚机了,下面的配置创建名为 NickVM 的虚机,并添加虚拟网卡 NickNIC。 新的虚机基于 Ubuntu 16.04 LTS 映像并禁止通过密码登录,同时会创建一个可以通过秘钥登录的名称为 nick 的用户。注意,ssh_keys 部分提供了 SSH 密钥数据,key_data 字段需要提供用户的有效 SSH 公钥:
resource "azurerm_virtual_machine" "nicktfvm" {
name = "NickVM"
location = "eastasia"
resource_group_name = "${azurerm_resource_group.nicktfrg.name}"
network_interface_ids = ["${azurerm_network_interface.nicktfnic.id}"]
vm_size = "Standard_DS1_v2"
storage_os_disk {
name = "NickOsDisk"
caching = "ReadWrite"
create_option = "FromImage"
managed_disk_type = "Premium_LRS"
}
storage_image_reference {
publisher = "Canonical"
offer = "UbuntuServer"
sku = "16.04.0-LTS"
version = "latest"
}
os_profile {
computer_name = "phoenix"
admin_username = "nick"
}
os_profile_linux_config {
disable_password_authentication = true
ssh_keys {
path = "/home/nick/.ssh/authorized_keys"
key_data = "xxxxxxxxxxxxxxxxxx"
}
}
boot_diagnostics {
enabled = "true"
storage_uri = "${azurerm_storage_account.nicktfstorageaccount.primary_blob_endpoint}"
}
tags {
environment = "My Terraform Demo"
}
}
到这里配置文件就完成了,完整的配置文件内容请参考这里。
执行部署
创建 Terraform 配置文件(也被称为模板)后,第一步是初始化 Terraform。这一步会安装 配置文件中用到的所有 Terraform 插件:
$ terraform init
然后执行 plan 验证配置文件的正确性(关于登录 Azure 的认证信息,请参考前文《Terraform 简介》):
$ . azureEnv.sh
$ terraform plan
检查 plan 的输出,如果符合预期,就可以通过 apply 执行实际的部署了:
$ terraform apply -auto-approve
检查结果
从 portal 上登录 Azure 查看我们创建的 Resouce Group NickResourceGroup,其中的资源包括虚拟机 NickVM 及其相关的网卡、Public IP 地址、虚拟网络、网络安全组、存储等组件:

获取虚机的公共 IP 地址
在 portal 上的 Cloud Shell 中执行下面的命令获得新建虚机的 IP 地址:
$ az vm show --resource-group NickResourceGroup --name NickVM -d --query [publicIps] --o tsv
或者是直接在 portal 上查看虚机的信息:

通过 SSH 登录虚机
$ ssh nick@13.70.0.72

这就可以开始工作了(当然对于一个系统管理员来说,所谓的工作就常常是指以自动化的方式在虚机上部署各种应用)!
总结
如果你看过笔者的《Azure 基础:使用 powershell 创建虚拟机》一文,你会发现本文的结构与其高度相似。其实不管是通过 PowerShell 还是 Azure CLI,或者是本文介绍的 Terraform(当然,Terraform 强大的功能让它具有非常大的优势),我们操作的资源对象都是一样的。当你手中有多个工具时,你就可以根据具体的场景选择最佳的方式完成任务。
参考:
在 Azure 中使用 Terraform 创建 Linux 虚机
Terraform:创建 Azure 虚机的更多相关文章
- Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机显示Ip Not found
Docker-machine创建虚机时停在虚机启动的提示上,并且创建的虚机用docker-machine ls 列出来的时候显示Ip Not found, 是什么原因那? [答案] 看这个帖子: ht ...
- 给Azure 虚机的硬盘扩充容量[转]
接到用户的需求,需要给Azure 上虚机的硬盘扩充空间,网上找到下面的资源,做个备忘: https://github.com/azure-contrib/WindowsAzureDiskResizer
- Azure虚机磁盘容量警报(邮件提醒)
上周有个客户提出这样的需求:根据虚拟机磁盘的实际使用量,当达到某一阈值时设置邮件提醒. 在这个需求中我们只需要解决两点问题: 计算虚拟机磁盘实际使用量 发送邮件 使用VS新建一个名为Calculate ...
- Azure: 给 ubuntu 虚机挂载数据盘
在 azure 上创建的虚机默认会分配两个磁盘,分别是系统盘和一个临时磁盘.如果我们要在系统中安装使用 mysql 等软件,需要再创建并挂载单独的数据盘用来保存数据库文件.这是因为临时磁盘被定义为:用 ...
- 在Azure Ubunt Server 14.04虚机中使用Deep-Visualization-Toolbox
参考网站 a) https://zhuanlan.zhihu.com/p/24833574?utm_source=tuicool&utm_medium=referral b) ht ...
- OpenStack 虚机网卡的创建过程
原文链接:https://www.cnblogs.com/potato-chip/p/9127083.html OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机. ...
- OpenStack虚机网卡的创建过程
OpenStack虚机网卡的创建过程 OpenStack最基本和常用的操作就是启动虚机.虚机启动的过程中涉及很多内容,其中非常重要的一个环节就是创建并绑定虚机的虚拟网卡.虚机的创建和管理是Nova的任 ...
- 【Azure 环境】在Windows系统中 使用Terraform创建中国区Azure资源步骤(入门级)
Terraform(全称:Hashicorp Terraform )是一种开源工具,用于预配和管理云基础结构. 它将基础结构编入描述云资源拓扑的配置文件中. 这些资源包括虚拟机.存储帐户和网络接口等. ...
- 用 Docker Machine 创建 Azure 虚拟主机
搭建环境向来是一个重复造轮子的过程,Docker Machine 则把用户搭建 Docker 环境的各种方案汇集在了一起.笔者在<Docker Machine 简介>一文中演示了使用 Do ...
随机推荐
- element-ui的回调函数Events的用法
做轮播的时候想用这个change回调函数,但是官方文档上竟然就只列了这么一行东西,完全没有示例代码(也可能我没找到哈) 鼓捣了半天,东拼西凑终于找到了靠谱的使用方法,其实很简单 在轮播组件上加上@ch ...
- owncloud 实现私有云进行多端文件同步
研究生生涯开始了,事情逐渐多了起来.都没时间写博客了... 开学实验室配了台电脑,我把主机装上了Fedora 作为我的服务器.平时有些实验室的材料,经常几个电脑一起看,使用U盘拷来拷去很是麻烦.今天重 ...
- Django学习---快速搭建搜索引擎(haystack + whoosh + jieba)
Django下的搜索引擎(haystack + whoosh + jieba) 软件安装 haystack是django的开源搜索框架,该框架支持Solr,Elasticsearch,Whoosh, ...
- 团队Alpha博客链接目录
Dipper团队Alpha博客链接目录 团队Alpha冲刺博客 第一次冲刺 第二次冲刺 第三次冲刺 第四次冲刺 第五次冲刺 第六次冲刺 第七次冲刺 第八次冲刺 第九次冲刺 第十次冲刺 第十一次冲刺 第 ...
- FusionCharts参数说明——3D饼图属性(Pie3D.swf )
animation 是否显示加载图表时的动画palette 内置的图表样式,共5个paletteColors 自定义图表元素颜色(为多个,如过过少会重复)showAboutMenuItem 右键是否显 ...
- Java链式方法
http://blog.csdn.net/lemon_shenzhen/article/details/6358537 有两种情况可运用链式方法: 第一种 除最后一个方法外,每个方法都返回一个对象 ...
- 【数据库】事务,ACID,CAP和一致性
什么是事务 事务是指由一系列数据库操作组成的一个完整的逻辑过程,这个过程中的所有操作要么都成功,要么都不成功.比如:常见的例子就是银行转账的例子,一次转账操作会包含多个数据库操作,而这些数据库操作需要 ...
- Scout YYF I POJ - 3744(矩阵优化)
题意:一条路上有n个地雷,给出地雷的位置.某人从起点(位置1)出发,走一步的概率是p,走两步的概率是(1-p),然后问有多少概率走过这个雷区. 思路: 只要走过最后一个地雷就代表走过雷区了. 而每到 ...
- Excel各种条件求和的公式汇总
经常和Execl打交道的人肯定觉得求和公式是大家时常用到的.Excel里有哪几路求和公式呢?他们的使用方式又是怎样?我为大家汇总一下. 使用SUMIF()公式的单条件求和: 如要统计C列中的数据,要求 ...
- 转载 AutoFac常见用法总结
第二节:框架前期准备篇之AutoFac常见用法总结 一. 说在前面的话 凡是大约工作在两年以上的朋友们,或多或少都会接触到一些框架搭建方面的知识,只要一谈到框架搭建这个问题或者最佳用法这个问题,势 ...