ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

90DaysOfDevOps 第 59 天:用 Terraform 与 VirtualBox 创建虚拟机,并深入掌握变量与输出

90DaysOfDevOps 第 59 天:用 Terraform 与 VirtualBox 创建虚拟机,并深入掌握变量与输出 文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载在 90DaysOfDevOps 的 IaC基础设施即代码学习路线中本篇文章聚焦一个非常实用的本地实战场景使用 Terraform 配合社区virtualbox提供商在笔记本电脑上的 VirtualBox 中批量创建虚拟机并通过count实现节点数量伸缩、借助 output 导出 IP 地址最后全面梳理 Terraform 变量的多种定义方式与优先级。读完本文你将能够独立编写一份期望状态配置代码走完terraform init → plan → apply → destroy的完整生命周期并把敏感信息用sensitive变量安全地管理起来。为什么在 VirtualBox 里用 TerraformTerraform 最常见的应用场景是管理公有云资源但本文对应仓库文档 2022/vi/Days/day59.md 与英文原版 2022/Days/day59.md选择了一个非常规的演示环境VirtualBox 是工作站级虚拟化方案通常不属于 Terraform 的典型用例。这里用它做演示是因为在本地笔记本上运行比云端更快而且核心概念完全一致——依然是先编写描述期望状态desired state的配置代码再通过指定提供商provider执行这份代码。此前本系列在 VirtualBox 场景中使用过vagrant而本节开头就曾对比过vagrant与terraform的差异vagrant偏重于开发环境的可复现交付terraform则面向基础设施的声明式管理与编排。本文使用的是社区维护的terra-farm/virtualbox提供商代码仓库中对应的完整文件位于 2022/Days/IaC/Virtualbox/virtualbox.tf与文档中展示的代码完全一致可随时对照阅读。在 VirtualBox 中创建虚拟机1. 准备工作目录与配置文件首先新建一个名为VirtualBox的目录并在其中创建VirtualBox.tf文件这就是我们定义资源的地方。下面的代码会在 VirtualBox 中创建2 台虚拟机terraform { required_providers { virtualbox { source terra-farm/virtualbox version 0.2.2-alpha.1 } } } # There are currently no configuration options for the provider itself. resource virtualbox_vm node { count 2 name format(node-%02d, count.index 1) image https://app.vagrantup.com/ubuntu/boxes/bionic64/versions/20180903.0.0/providers/virtualbox.box cpus 2 memory 512 mib network_adapter { type hostonly host_interface vboxnet1 } } output IPAddr { value element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 1) } output IPAddr_2 { value element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 2) }逐段拆解这份配置的核心语义terraform块与required_providers声明所需提供商为terra-farm/virtualbox并固定版本0.2.2-alpha.1。注意这是一个 alpha 版本属于社区实验性提供商也是为什么本文把它定位为纯演示用途的原因。resource virtualbox_vm node定义名为node的虚拟机资源。count 2表示创建 2 个实例这是 Terraform 的元参数meta-argument用于按数量批量生成资源。name format(node-%02d, count.index 1)利用count.index从 0 开始计数配合format函数生成node-01、node-02这样的零填充命名保证节点名称唯一且可排序。image指定虚拟机镜像来源。这里直接引用了一个打包好的 Ubuntu Bionic18.04VirtualBox box 的下载地址provider 会负责把该 box 导入为虚拟机基础镜像。cpus 2与memory 512 mib为每台虚拟机分配 2 个 CPU 和 512 MiB 内存。memory使用单位字符串512 mib这是该 provider 接受的内存表达格式。network_adapter块配置网卡类型为hostonly仅主机网络并绑定到宿主机上的vboxnet1接口。hostonly 网络让虚拟机与宿主机互通、彼此互通同时不占用外部局域网地址非常适合本地演示。两个output块IPAddr与IPAddr_2分别取第 1、2 台机器的network_adapter.0.ipv4_address地址输出。这里的语法virtualbox_vm.node.*.network_adapter.0.ipv4_address是展开所有 count 实例的网卡地址再配合element(list, index)按下标取值Terraform 列表索引从 0 开始因此element(..., 1)对应第二台、element(..., 2)在 count2 时会越界这是该演示脚本中一个值得注意的边界问题实际使用时可改为遍历全部实例或按count.index动态生成。2. 运行 init、plan 与 apply在代码定义好之后进入该目录依次执行三组命令terraform init初始化工作目录并下载 VirtualBox 提供商插件。只有 init 成功后续命令才有可用的 provider。terraform plan读取配置并生成执行计划展示这份代码将创建哪些资源但不实际改动任何东西是 apply 前的安全预览。terraform apply真正执行计划调用 VirtualBox API 创建虚拟机并在最后输出两个output的 IP 地址值。前提条件你的系统上必须已经安装好VirtualBox否则 provider 无法与宿主机虚拟化层通信。下图展示了terraform init下载 provider 的过程。apply 结束后打开 VirtualBox 管理器就能看到刚创建并运行起来的 2 台虚拟机3. 修改配置把 count 从 2 改成 3Terraform 声明式配置的一大优势是改声明、再 apply。想要增加一台节点只需修改count这一行count 3然后再次运行terraform apply。Terraform 会对比状态文件与配置识别出新增了第 3 台机器只增量创建这一台而不会把已有的 2 台推倒重来。apply 完成后VirtualBox 里会看到 3 台虚拟机全部在运行。4. 清理环境terraform destroy演示结束后运行terraform destroy即可按状态文件反序销毁全部资源VirtualBox 中的虚拟机随之被删除。这是一条非常有用的一键清理命令也让本地实验可以反复进行而不留下残留环境。变量Variables与输出Outputs上一节运行hello-world示例时我们已经接触过output本节则系统性地展开变量与输出的完整用法。Output让结果可被机器消费output块的作用是把资源属性如 IP 地址、主机名暴露到命令行与状态中便于人工查看或被其他工具如 CI、脚本消费。本示例中的两个 output 正是为了拿到两台虚拟机的 IPoutput IPAddr { value element(virtualbox_vm.node.*.network_adapter.0.ipv4_address, 1) }terraform output命令可以随时重新读取这些值而不必重新执行 apply。变量的六种定义方式与优先级Terraform 允许用多种途径为变量赋值从底层到顶层依次为命令行交互输入执行terraform plan或terraform apply时若变量未在其他位置赋值Terraform 会提示你手动输入。.tf文件中的variable块在任意.tf文件里用variable name {}声明变量可附带default作为兜底值。环境变量使用TF_VAR_NAME命名格式例如TF_VAR_regionap-south-1 terraform applyTerraform 会自动读取TF_VAR_前缀的环境变量并映射到同名变量。terraform.tfvars文件作者最推荐的方式在项目目录中放置terraform.tfvars内容形如name valueapply 时会自动加载适合存放项目级常规参数。*.auto.tfvars文件任何以*.auto.tfvars命名的文件也会被自动加载适合按用途拆分如dev.auto.tfvars、prod.auto.tfvars。-var与-var-file命令行参数在运行terraform plan或terraform apply时显式传入如terraform apply -var count3或terraform apply -var-fileprod.tfvars优先级最高。优先级规则从底部往上后者的优先级高于前者——即命令行-var/-var-file覆盖*.auto.tfvars*.auto.tfvars覆盖terraform.tfvars再往上覆盖环境变量、variable块中的default。理解这条顺序就能在团队协作时预判谁的赋值最终生效。敏感变量把秘密信息标记为 sensitive状态文件terraform.tfstate中会明文保存资源属性与变量值可能包含敏感信息。Terraform 允许把变量声明为敏感sensitive从而在 CLI 输出中隐藏其真实值variable some resource { description something important type string sensitive true }声明后plan/apply 的输出中该变量的值会显示为(sensitive value)避免密钥、口令等泄露在日志中。注意sensitive只影响 Terraform 的终端展示状态文件本身仍会存储原始值因此生产环境仍需配合远程状态存储如加密的 backend与访问控制。仓库中的变量实践参考在仓库的 Terratest 示例目录 2022/Days/IaC/Terratest/examples/vars.tf 中可以看到更贴近真实项目的变量声明模式密钥类变量如AWS_ACCESS_KEY、AWS_SECRET_KEY不设 default强制通过外部途径注入区域等非敏感参数则给默认值复杂结构用map(string)类型组织variable AWS_ACCESS_KEY { } variable AWS_REGION { default ap-south-1 } variable AMIS { type map(string) default { ap-south-1 ami-0860c9429baba6ad2 } }配套的 2022/Days/IaC/Terratest/examples/terraform.tfvars 展示了terraform.tfvars的标准写法示例中为占位值XXXX实际使用时填入真实凭证这正是文档作者偏好的变量注入方式。此外2022/Days/IaC/Hello-world/main.tf 保留了最简 output 示例可用于快速验证 Terraform 与输出的基本行为。小结本文通过 VirtualBox 本地场景完整演示了 Terraform 的核心工作流用required_providers声明提供商、用resourcecount批量定义虚拟机、用output导出 IP、用terraform init/plan/apply/destroy管理资源生命周期并系统梳理了变量的六种定义途径、优先级顺序以及sensitive敏感变量的用法。这套声明式期望状态 提供商执行 状态跟踪的模型与你在公有云上使用 Terraform 的方式完全同构——本地演示只是更快的验证手段。理解了count的伸缩与变量的分层注入后你已经具备了把同样的方法迁移到云资源管理的基础。后续可继续学习本系列第 60 天内容2022/vi/Days/day60.md进一步深入 Terraform 的进阶能力。赞分享文档/教程【免费下载链接】90DaysOfDevOpsThis repository started out as a learning in public project for myself and has now become a structured learning map for many in the community. We have 3 years under our belt covering all things DevOps, including Principles, Processes, Tooling and Use Cases surrounding this vast topic.项目地址https://gitcode.com/gh_mirrors/90/90DaysOfDevOps点击查看免费下载相关推荐90DaysOfDevOps 第 59 天用 Terraform 与变量在 VirtualBox 中创建虚拟机90DaysOfDevOps 第 59 天用 Terraform 与变量在 VirtualBox 中创建虚拟机 导读 本文是《90DaysOfDevOps》学文档/教程90DaysOfDevOps 实战用 Terraform 与变量在 VirtualBox 中创建虚拟机Day 5990DaysOfDevOps 实战用 Terraform 与变量在 VirtualBox 中创建虚拟机Day 59 在 90DaysOfDevOps 的文档/教程90DaysOfDevOps 实战用 Terraform 与变量在 VirtualBox 上批量创建虚拟机Day 5990DaysOfDevOps 实战用 Terraform 与变量在 VirtualBox 上批量创建虚拟机Day 59 本篇技术指南是 90DaysOfD文档/教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表