IaC Terraform Ansible Vagrant Pulumi DevOps

基础设施即代码 (IaC) 配置指南:Terraform、Ansible 及更多

一份全面的 IaC 配置模板指南,包括 terraform main.tf、ansible playbook 和 Pulumi 配置,适用于云端和本地环境。

2026-04-11

基础设施即代码 (IaC) 配置指南

基础设施即代码 (IaC) 彻底改变了我们管理和配置计算资源的方式。通过代码定义环境,而不是手动配置,可以确保一致性、可扩展性和可复用性。本指南为最流行的 IaC 工具(Terraform、Ansible、Vagrant 和 Pulumi)提供了基础配置模板。

1. Terraform 配置模板

Terraform 是配置云基础设施的行业标准。它使用 HCL (HashiCorp 配置语言) 来定义资源。

Terraform main.tf 模板

main.tf 文件是定义主要资源的地方。典型的 terraform main.tf 模板 包含实例、网络和存储的资源块。

# terraform main.tf 模板示例
resource "aws_instance" "web_server" {
  ami           = "ami-0c55b159cbfafe1f0"
  instance_type = "t2.micro"

  tags = {
    Name = "Web-Server-01"
  }
}

resource "aws_vpc" "main_vpc" {
  cidr_block = "10.0.0.0/16"
}

Terraform Provider 配置 (Provider Config)

terraform provider config 块告诉 Terraform 使用哪个云服务商(如 AWS、Azure、GCP 等)以及如何进行身份验证。

# terraform provider 配置
provider "aws" {
  region = "us-east-1"
  # 身份验证通常通过环境变量或 AWS CLI 配置文件处理
}

provider "google" {
  project = "my-project-id"
  region  = "us-central1"
}

Terraform Backend 配置

terraform backend config 决定了 Terraform 存储其状态文件(state file)的位置。对于团队协作,使用 S3 或 GCS 等远程后端至关重要。

# terraform backend 配置
terraform {
  backend "s3" {
    bucket         = "my-terraform-state-bucket"
    key            = "prod/terraform.tfstate"
    region         = "us-east-1"
    encrypt        = true
    dynamodb_table = "terraform-lock"
  }
}

2. Ansible Playbooks 与 Inventory

虽然 Terraform 负责配置基础设施,但 Ansible 在配置管理和应用部署方面表现出色。

Ansible Playbook 模板

ansible playbook template 定义了要在主机组上执行的任务。

---
# ansible playbook 模板
- name: 配置 Web 服务器
  hosts: webservers
  become: yes
  tasks:
    - name: 确保安装了 Apache
      apt:
        name: apache2
        state: present

    - name: 启动 Apache 服务
      service:
        name: apache2
        state: started
        enabled: yes

    - name: 复制 index.html
      copy:
        src: files/index.html
        dest: /var/www/html/index.html

Ansible Inventory 文件

ansible inventory file 列出了 Ansible 管理的主机和主机组。

# ansible inventory 文件 (INI 格式)
[webservers]
192.168.1.10
192.168.1.11

[dbservers]
db.example.com ansible_user=admin

[all:vars]
ansible_python_interpreter=/usr/bin/python3

3. Vagrant 与 Pulumi 配置

对于本地开发和现代编程式 IaC,Vagrant 和 Pulumi 是必不可少的。

Vagrantfile 模板与示例

Vagrantfile template 用于定义和配置虚拟开发环境。

# Vagrantfile 示例
Vagrant.configure("2") do |config|
  config.vm.box = "ubuntu/bionic64"
  config.vm.network "forwarded_port", guest: 80, host: 8080
  
  config.vm.provider "virtualbox" do |vb|
    vb.memory = "2048"
    vb.cpus = 2
  end

  config.vm.provision "shell", inline: <<-SHELL
    apt-get update
    apt-get install -y nginx
  SHELL
end

Pulumi 配置 (Pulumi Config)

Pulumi config 允许你使用熟悉的编程语言(如 TypeScript、Python 或 Go)来管理基础设施。

// Pulumi 配置示例 (TypeScript)
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const size = "t2.micro";
const ami = aws.ec2.getAmi({
    filters: [{ name: "name", values: ["amzn-ami-hvm-*"] }],
    owners: ["137112412989"], // Amazon Linux 的所有者 ID
    mostRecent: true,
}).then(ami => ami.id);

const server = new aws.ec2.Instance("web-server", {
    instanceType: size,
    ami: ami,
});

export const publicIp = server.publicIp;

4. 常见问题 (FAQ)

Q: 为什么在 Terraform 中会出现 "provider configuration not found" 错误?

A: 这通常是因为在添加新 provider 后没有运行 terraform init,或者在 .tf 文件中缺少 provider 块。确保在使用特定版本时包含 required_providers 块。

Q: 如何修复 "ansible unreachable" 错误?

A: 检查你的 ansible inventory file,确保 IP 地址或主机名正确。手动验证 SSH 连接,并确保 SSH 密钥已添加到 agent 或在 inventory 中指定。

Q: Terraform 和 Pulumi 有什么区别?

A: Terraform 使用 HCL(一种领域特定语言),而 Pulumi 使用标准编程语言。Pulumi 为复杂逻辑提供了更多灵活性,但 Terraform 拥有更大的生态系统和社区。

Q: 什么时候应该使用 Vagrant?

A: 当你需要一个与生产环境一致的、可复用的本地开发环境时(例如在笔记本上运行虚拟机),请使用 Vagrant。

结论

掌握 IaC 配置模板是构建现代、高可用基础设施的关键。无论你是使用 Terraform 进行资源配置,使用 Ansible 进行配置管理,还是使用 Pulumi 进行代码驱动的云管理,这些模板都为你开启 DevOps 之旅提供了坚实的基础。

需要帮助格式化 JSON 或 YAML 文件吗?访问 Tool3M,获取一系列强大的开发者工具。