DevOps 面试题大全(六·下):Terraform 高级特性与最佳实践 25 题

前言

Terraform 面试题下篇(26-50 题),涵盖高级特性、故障排查、最佳实践、企业级应用等进阶内容。

三、高级特性题(26-35 题)

26. 函数使用

# 字符串函数
output "upper_name" {
  value = upper(var.name)
}

# 列表函数
output "first_az" {
  value = element(var.azs, 0)
}

# 映射函数
output "merged_tags" {
  value = merge(local.common_tags, var.extra_tags)
}

# 文件函数
user_data = file("${path.module}/script.sh")

27. 类型约束和转换

variable "ports" {
  type = list(number)
}

# 类型转换
for_each = toset(var.instances)
count    = length(var.items)
value    = tonumber(var.port)

28. For 表达式

# 列表转换
output "public_ips" {
  value = [for inst in aws_instance.web : inst.public_ip]
}

# 映射过滤
output "large_instances" {
  value = {
    for k, v in aws_instance.web : k => v
    if v.instance_type == "t2.large"
  }
}

# 分组
output "by_az" {
  value = {
    for inst in aws_instance.web : inst.availability_zone => inst
  }
}

29. Provisioner 配置

resource "aws_instance" "web" {
  # ...
  
  provisioner "file" {
    source      = "config.conf"
    destination = "/etc/app/config.conf"
  }
  
  provisioner "remote-exec" {
    inline = [
      "sudo systemctl start app",
      "sudo systemctl enable app"
    ]
  }
  
  connection {
    type        = "ssh"
    user        = "ec2-user"
    private_key = file("~/.ssh/id_rsa")
  }
}

30. 零信任 Provisioner

使用 cloud-init/user_data 替代,或使用 Configuration Management(Ansible/Chef)。

31. 多 Provider 配置

provider "aws" {
  alias  = "us-east"
  region = "us-east-1"
}

provider "aws" {
  alias  = "us-west"
  region = "us-west-2"
}

resource "aws_instance" "east" {
  provider = aws.us-east
  # ...
}

32. 多账户管理

使用 alias 区分不同 AWS 账户,配合 AssumeRole 实现跨账户访问。

33. 自定义 Provider

使用 Terraform Plugin SDK 开发,支持 REST API、数据库等任意资源。

34. State Locking

DynamoDB 实现分布式锁,防止并发修改,配置 locking 参数。

35. Sentinel 策略

Terraform Enterprise 策略即代码,实现合规性检查、成本限制、安全策略。

四、故障排查题(36-42 题)

36. State 锁定问题

  1. 检查是否有运行中的 terraform 命令
  2. 查看 DynamoDB 锁表
  3. 手动解锁:terraform force-unlock <LOCK_ID>

37. Provider 认证失败

  • 检查 AWS Credentials(~/.aws/credentials)
  • 验证 IAM 权限
  • 检查环境变量(AWS_ACCESS_KEY_ID)
  • 使用 AssumeRole 配置

38. 状态文件损坏

  • 从备份恢复
  • 使用 terraform state 命令修复
  • 重新 import 资源

39. 依赖循环错误

检查资源引用,使用 depends_on 显式声明,重构模块结构。

40. 计划与实际不符

  • 检查 State 是否最新
  • 验证外部变更
  • 刷新状态:terraform refresh

41. 模块版本冲突

使用版本约束,锁定版本,检查依赖树。

42. 性能优化

  • 使用 -parallelism 调整并发
  • 优化 State 后端
  • 减少不必要的依赖
  • 使用 target 指定资源

五、最佳实践题(43-47 题)

43. 项目结构组织

project/
├── modules/
│   ├── vpc/
│   ├── ec2/
│   └── rds/
├── environments/
│   ├── dev/
│   ├── staging/
│   └── prod/
└── backend.tf

44. State 管理策略

  • 使用远程后端(S3+DynamoDB)
  • 启用加密
  • 配置访问权限
  • 定期备份
  • 分 State 文件(按环境/组件)

45. 版本控制

  • .tf 文件纳入 Git
  • .tfstate 加入 .gitignore
  • 使用标签标记版本
  • Code Review 流程
  • CI/CD 集成

46. 安全加固

  • Vault 管理敏感数据
  • 最小权限 IAM 策略
  • 加密 State 文件
  • 审计日志
  • 定期轮换凭据

47. 测试策略

  • terraform validate - 语法检查
  • terraform plan - 预览变更
  • terratest - Go 测试框架
  • kitchen-terraform - 集成测试
  • checkov/tfsec - 安全扫描

六、企业级应用题(48-50 题)

48. 多云架构设计

  • 抽象 Provider 层
  • 统一变量定义
  • 模块复用
  • 混合云部署

49. GitOps 工作流

  1. 代码提交到 Git
  2. CI 触发 terraform plan
  3. PR Review 审批
  4. 合并后自动 apply
  5. 通知和审计

50. 成本优化

  • 使用 spot 实例
  • 自动伸缩配置
  • 资源标签追踪
  • 定期清理未使用资源
  • Infracost 成本估算

总结

Terraform 是多云基础设施管理的标准工具,掌握其核心概念和最佳实践对于 DevOps 工程师至关重要。

学习路线建议

  1. 基础语法和资源
  2. State 管理和后端
  3. Module 开发和复用
  4. 多环境和 Workspace
  5. 企业级实践(GitOps/安全)
  6. 自定义 Provider 开发

发表回复

后才能评论