首页
/ 使用Terraform部署NixOS系统实战指南

使用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中:

  1. 创建组织(如myorganization
  2. 在该组织下创建CLI驱动的工作区(如myapp
  3. 将执行模式设置为"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,这是整个部署流程的关键。该模块内部会:

  1. 查询指定版本的NixOS构建
  2. 返回对应区域的AMI ID
  3. 确保镜像与AWS服务兼容

部署模块工作原理

deploy_nixos模块执行以下操作:

  1. 在本地构建NixOS系统配置
  2. 通过SSH连接到目标主机
  3. 将构建结果推送到目标主机
  4. 激活新配置

注意事项

  1. 架构兼容性:部署模块要求客户端和目标机架构相同,除非配置了分布式构建
  2. 内存消耗:每台机器单独评估配置,内存需求随机器数量线性增长
  3. 变量注入:目前没有优雅的方式将Terraform变量注入Nix表达式
  4. 依赖要求
    • 目标机必须已安装NixOS
    • 主机需要安装Nix

进阶应用

  1. 多环境管理:通过Terraform工作区管理开发/生产环境
  2. 配置模块化:将NixOS配置拆分为多个模块文件
  3. 密钥管理:利用Terraform的敏感变量处理机制管理密钥
  4. 监控集成:在NixOS配置中添加监控组件

总结

本文介绍了使用Terraform在AWS上部署和管理NixOS系统的完整流程。这种组合提供了以下优势:

  • 基础设施的声明式管理
  • 系统配置的不可变性和可重现性
  • 变更的原子性应用
  • 完整的回滚能力

通过将Terraform的基础设施编排能力与NixOS的配置管理能力相结合,可以构建出高度可靠且易于维护的云基础设施。