基础设施即代码 (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,获取一系列强大的开发者工具。