使用Terraform部署NixOS系统实战指南
2025-07-10 03:00:20作者:温玫谨Lighthearted
前言
在现代基础设施即代码(IaC)实践中,Terraform已成为部署云资源的首选工具之一。本文将详细介绍如何结合Terraform和NixOS两大强力工具,在AWS云平台上实现声明式系统部署与管理。
准备工作
环境要求
- 已安装Nix包管理器
- 拥有AWS账户及访问凭证
- 已注册Terraform Cloud账户
基础概念
- Terraform:HashiCorp开发的基础设施即代码工具
- NixOS:基于Nix包管理器的Linux发行版,采用声明式配置
- AWS EC2:亚马逊弹性计算云服务
第一阶段:启动NixOS实例
1. 初始化Terraform环境
nix-shell -p terraform
terraform login
2. 创建Terraform工作区
在Terraform Cloud中:
- 创建组织(如
myorganization
) - 在该组织下创建CLI驱动的工作区(如
myapp
) - 将执行模式设置为"Local"
3. 编写基础设施定义
创建main.tf
文件,核心配置包括:
terraform {
backend "remote" {
organization = "myorganization"
workspaces { name = "myapp" }
}
}
provider "aws" { region = "eu-central-1" }
# NixOS专用镜像模块
module "nixos_image" {
source = "git::https://github.com/tweag/terraform-nixos.git//aws_image_nixos?ref=5f5a0408b299874d6a29d1271e9bffeee4c9ca71"
release = "20.09"
}
# 安全组配置
resource "aws_security_group" "ssh_and_egress" {
ingress { from_port = 22; to_port = 22; protocol = "tcp"; cidr_blocks = ["0.0.0.0/0"] }
egress { from_port = 0; to_port = 0; protocol = "-1"; cidr_blocks = ["0.0.0.0/0"] }
}
# SSH密钥对生成
resource "tls_private_key" "state_ssh_key" { algorithm = "RSA" }
resource "local_file" "machine_ssh_key" {
sensitive_content = tls_private_key.state_ssh_key.private_key_pem
filename = "${path.module}/id_rsa.pem"
file_permission = "0600"
}
resource "aws_key_pair" "generated_key" {
key_name = "generated-key-${sha256(tls_private_key.state_ssh_key.public_key_openssh)}"
public_key = tls_private_key.state_ssh_key.public_key_openssh
}
# EC2实例定义
resource "aws_instance" "machine" {
ami = module.nixos_image.ami
instance_type = "t3.micro"
security_groups = [aws_security_group.ssh_and_egress.name]
key_name = aws_key_pair.generated_key.key_name
root_block_device { volume_size = 50 } # GiB
}
output "public_dns" { value = aws_instance.machine.public_dns }
4. 应用配置
terraform init
terraform apply
第二阶段:部署NixOS配置变更
1. 创建NixOS配置文件
新建configuration.nix
文件:
{ config, lib, pkgs, ... }: {
imports = [ <nixpkgs/nixos/modules/virtualisation/amazon-image.nix> ];
# 在此添加自定义配置
}
2. 扩展Terraform配置
在main.tf
中添加NixOS部署模块:
module "deploy_nixos" {
source = "git::https://github.com/tweag/terraform-nixos.git//deploy_nixos?ref=5f5a0408b299874d6a29d1271e9bffeee4c9ca71"
nixos_config = "${path.module}/configuration.nix"
target_host = aws_instance.machine.public_ip
ssh_private_key_file = local_file.machine_ssh_key.filename
ssh_agent = false
}
3. 部署变更
terraform init
terraform apply
技术细节解析
NixOS镜像模块
aws_image_nixos
模块根据指定的NixOS版本号返回对应的AMI ID,这是整个部署流程的关键。该模块内部会:
- 查询指定版本的NixOS构建
- 返回对应区域的AMI ID
- 确保镜像与AWS服务兼容
部署模块工作原理
deploy_nixos
模块执行以下操作:
- 在本地构建NixOS系统配置
- 通过SSH连接到目标主机
- 将构建结果推送到目标主机
- 激活新配置
注意事项
- 架构兼容性:部署模块要求客户端和目标机架构相同,除非配置了分布式构建
- 内存消耗:每台机器单独评估配置,内存需求随机器数量线性增长
- 变量注入:目前没有优雅的方式将Terraform变量注入Nix表达式
- 依赖要求:
- 目标机必须已安装NixOS
- 主机需要安装Nix
进阶应用
- 多环境管理:通过Terraform工作区管理开发/生产环境
- 配置模块化:将NixOS配置拆分为多个模块文件
- 密钥管理:利用Terraform的敏感变量处理机制管理密钥
- 监控集成:在NixOS配置中添加监控组件
总结
本文介绍了使用Terraform在AWS上部署和管理NixOS系统的完整流程。这种组合提供了以下优势:
- 基础设施的声明式管理
- 系统配置的不可变性和可重现性
- 变更的原子性应用
- 完整的回滚能力
通过将Terraform的基础设施编排能力与NixOS的配置管理能力相结合,可以构建出高度可靠且易于维护的云基础设施。