活动介绍

以代码方式管理基础设施

立即解锁
发布时间: 2025-08-25 01:27:55 阅读量: 1 订阅数: 2
### 以代码方式管理基础设施 #### 代码下载 可按特定步骤下载代码包,代码包也托管在 GitHub 上,链接如下: - 主要代码包:[https://github.com/PacktPublishing/Implementing-DevOps-on-AWS](https://github.com/PacktPublishing/Implementing-DevOps-on-AWS) - 其他代码包:[https://github.com/PacktPublishing/](https://github.com/PacktPublishing/) #### 模板设计 在开始编码前,有以下规则: - 可将 TF 模板写成单个大文件或多个小文件的组合。 - 模板可用纯 JSON 或 TF 自身格式编写。 - TF 会在指定文件夹中查找扩展名为 `.tf` 或 `.tf.json` 的文件,并按字母顺序加载。 - TF 模板是声明式的,资源出现的顺序不影响执行流程。 TF 模板通常由三部分组成:资源、变量和输出。为提高可读性,建议使用 TF 格式并将每个部分写在单独的文件中,文件名可自定义,但文件扩展名很重要。 #### 资源 资源文件是模板的核心,资源代表最终要配置的实际组件。例如,使用 VPC、RDS、ELB 等资源进行配置。TF 通过检查资源引用确定执行流程,也可使用 `depends_on` 等显式流控制属性。 以下是 `resources.tf` 文件的部分内容: ```hcl # Set a Provider provider "aws" { region = "${var.aws-region}" } # Create a VPC resource "aws_vpc" "terraform-vpc" { cidr_block = "${var.vpc-cidr}" tags { Name = "${var.vpc-name}" } } # Create an Internet Gateway resource "aws_internet_gateway" "terraform-igw" { vpc_id = "${aws_vpc.terraform-vpc.id}" } # Create NAT resource "aws_eip" "nat-eip" { vpc = true } ``` 下面逐行分析 `aws_subnet` 资源块: ```hcl resource "aws_subnet" "public-1" { vpc_id = "${aws_vpc.terraform-vpc.id}" cidr_block = "${cidrsubnet(var.vpc-cidr, 8, 1)}" } ``` - 第一个参数是资源类型,后面是任意名称。 - `vpc_id` 属性引用了 `aws_vpc` 资源的 `id` 属性,隐式定义了执行流程,即 VPC 需先创建。 - `cidr_block` 使用 `cidrsubnet` 函数和 `vpc-cidr` 变量返回一个 CIDR 块。 接着添加 RDS、ELB、EC2 自动扩展组等资源: ```hcl # Add RDS resource "aws_db_instance" "terraform" { identifier = "${var.rds-identifier}" allocated_storage = "${var.rds-storage-size}" storage_type = "${var.rds-storage-type}" engine = "${var.rds-engine}" engine_version = "${var.rds-engine-version}" instance_class = "${var.rds-instance-class}" username = "${var.rds-username}" password = "${var.rds-password}" port = "${var.rds-port}" vpc_security_group_ids = ["${aws_security_group.terraform-rds.id}"] db_subnet_group_name = "${aws_db_subnet_group.rds.id}" } # Add ELB resource "aws_elb" "terraform-elb" { name = "terraform-elb" security_groups = ["${aws_security_group.terraform-elb.id}"] subnets = ["${aws_subnet.public-1.id}", "${aws_subnet.public-2.id}"] listener { instance_port = 80 instance_protocol = "http" lb_port = 80 lb_protocol = "http" } tags { Name = "terraform-elb" } } # Define Launch Configuration resource "aws_launch_configuration" "terraform-lcfg" { image_id = "${var.autoscaling-group-image-id}" instance_type = "${var.autoscaling-group-instance-type}" key_name = "${var.autoscaling-group-key-name}" security_groups = ["${aws_security_group.terraform-ec2.id}"] user_data = "#!/bin/bash \n set -euf -o pipefail \n exec 1> >(logger -s -t $(basename $0)) 2>&1 \n yum -y install nginx; chkconfig nginx on; service nginx start" lifecycle { create_before_destroy = true } } # Define Auto Scaling Group resource "aws_autoscaling_group" "terraform-asg" { name = "terraform" launch_configuration = "${aws_launch_configuration.terraform-lcfg.id}" vpc_zone_identifier = ["${aws_subnet.private-1.id}", "${aws_subnet.private-2.id}"] min_size = "${var.autoscaling-group-minsize}" max_size = "${var.autoscaling-group-maxsize}" load_balancers = ["${aws_elb.terraform-elb.name}"] depends_on = ["aws_db_instance.terraform"] tag { key = "Name" value = "terraform" propagate_at_launch = true } } ``` #### 变量 变量使模板更具可重用性。以下是 `variables.tf` 文件的部分内容: ```hcl variable "aws-region" { type = "string" description = "AWS region" } variable "aws-availability-zones" { type = "string" description = "AWS zones" } variable "vpc-cidr" { type = "string" description = "VPC CIDR" } variable "vpc-name" { type = "string" description = "VPC name" } ``` 变量赋值方式有多种: - 直接在 `variables.tf` 中赋值: ```hcl variable "aws-region" { type = "string" description = "AWS region" default = 'us-east-1' } ``` - 不赋值,运行时 TF 会提示输入。 - 使用 `-var 'key=value'` 参数传递:`-var 'aws-region=us-east-1'` - 将键值对存储在文件中。 - 使用以 `TF_VAR_` 为前缀的环境变量。 示例 `terraform.tfvars` 文件内容: ```hcl autoscaling-group-image-id = "ami-08111162" autoscaling-group-instance-type = "t2.nano" autoscaling-group-key-name = "terraform" autoscaling-group-maxsize = "1" autoscaling-group-minsize = "1" aws-availability-zones = "us-east-1b,us-east-1c" aws-region = "us-east-1" rds-engine = "postgres" rds-engine-version = "9.5.2" rds-identifier = "terraform-rds" rds-instance-class = "db.t2.micro" rds-port = "5432" rds-storage-size = "5" rds-storage-type = "gp2" rds-username = "dbroot" rds-password = "donotusethispassword" vpc-cidr = "10.0.0.0/16" vpc-name = "Terraform" ``` #### 输出 输出部分主要用于在测试、部署或部署后向用户返回选定的值。以下是 `outputs.tf` 文件内容: ```hcl output "VPC ID" { value = "${aws_vpc.terraform-vpc.id}" } output "NAT EIP" { value = "${aws_nat_gateway.terraform-nat.public_ip}" } output "ELB URI" { value = "${aws_elb.terraform-elb.dns_name}" } output "RDS Endpoint" { value = "${aws_db_instance.terraform.endpoint}" } ``` #### 操作流程 主要的 TF 操作有五个: 1. 验证模板 2. 测试(预演) 3. 初始部署 4. 更新部署 5. 删除部署 以下是操作步骤的 mermaid 流程图: ```mermaid graph LR A[验证模板] --> B[测试(预演)] B --> C[初始部署] C --> D[更新部署] D --> E[删除部署] ``` #### TF 操作详细说明 | 操作 | 命令 | 说明 | | --- | --- | --- | | 验证模板 | `terraform validate` | 进行基本语法检查 | | 测试(预演) | `terraform plan` | 显示实际部署时会发生的情况 | | 初始部署 | `terraform apply` | 部署模板 | | 更新部署 | 修改模板后执行 `terraform plan` 和 `terraform apply` | 更新部署 | | 删除部署 | `terraform destroy` | 删除部署的资源 | ### 以代码方式管理基础设施 #### 验证操作 在进行任何进一步的操作之前,需要使用 `terraform validate` 命令对模板进行基本的语法检查。例如,当在 `resources.tf` 中重命名一个变量后,运行验证命令会返回未知变量错误: ```bash $ terraform validate Error validating: 1 error(s) occurred: * provider config 'aws': unknown variable referenced: 'aws-region-1'. define it with 'variable' blocks ``` 当变量名被修正后,再次运行验证命令没有输出,这意味着验证通过。 #### 预演操作 接下来,使用 `terraform plan` 命令进行测试或预演执行,该命令会显示实际部署时会发生的情况。命令返回一个按字母顺序排列的资源及其属性的彩色列表,具体如下: ```bash $ terraform plan Resources are shown in alphabetical order for quick scanning. Green resources will be created (or destroyed and then created if an existing resource exists), yellow resources are being changed in-place, and red resources will be destroyed. ``` 若想直观了解待部署的基础设施的样子,可以使用 `terraform graph` 命令: ```bash $ terraform graph > my_graph.dot ``` DOT 文件可以使用 Graphviz 开源软件(请参考 [Graphviz 官网](http://www.graphviz.org))或许多在线阅读器/转换器进行处理。 #### 部署操作 如果对预演和图形结果满意,就可以使用 `terraform apply` 命令部署模板: ```bash $ terraform apply aws_eip.nat-eip: Creating... allocation_id: "" => "<computed>" association_id: "" => "<computed>" domain: "" => "<computed>" instance: "" => "<computed>" network_interface: "" => "<computed>" private_ip: "" => "<computed>" public_ip: "" => "<computed>" vpc: "" => "1" aws_vpc.terraform-vpc: Creating... cidr_block: "" => "10.0.0.0/16" default_network_acl_id: "" => "<computed>" default_security_group_id: "" => "<computed>" dhcp_options_id: "" => "<computed>" enable_classiclink: "" => "<computed>" enable_dns_hostnames: "" => "<computed>" Apply complete! Resources: 22 added, 0 changed, 0 destroyed. ``` 部署成功后,会显示输出信息和状态文件的路径。TF 会存储管理的基础设施的状态,默认存储在本地的 `terraform.tfstate` 文件中,也可以远程存储,这在团队环境中更适用。在团队环境中,如果遇到太多合并冲突,可以将状态文件存储在替代位置,如 S3(请参考 [TF 状态远程存储文档](https://www.terraform.io/docs/state/remote/index.html))。 #### 更新操作 根据墨菲定律,部署模板后往往需要进行更改。例如,需要向 ELB 安全组添加新规则,操作步骤如下: 1. **更新资源块**:在 `resources.tf` 中更新 `aws_security_group` "terraform-elb" 资源块: ```hcl resource "aws_security_group" "terraform-elb" { name = "terraform-elb" description = "ELB security group" vpc_id = "${aws_vpc.terraform-vpc.id}" ingress { from_port = "80" to_port = "80" protocol = "tcp" cidr_blocks = ["0.0.0.0/0"] } ingress { from_port = "443" to_port = "443" 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"] } } ``` 2. **验证更改**:运行 `terraform plan` 命令验证即将发生的更改: ```bash $ terraform plan ... ~ aws_security_group.terraform-elb ingress.#: "1" => "2" ingress.2214680975.cidr_blocks.#: "1" => "1" ingress.2214680975.cidr_blocks.0: "0.0.0.0/0" => "0.0.0.0/0" ingress.2214680975.from_port: "80" => "80" ingress.2214680975.protocol: "tcp" => "tcp" ingress.2214680975.security_groups.#: "0" => "0" ingress.2214680975.self: "0" => "0" ingress.2214680975.to_port: "80" => "80" ingress.2617001939.cidr_blocks.#: "0" => "1" ingress.2617001939.cidr_blocks.0: "" => "0.0.0.0/0" ingress.2617001939.from_port: "" => "443" ingress.2617001939.protocol: "" => "tcp" ingress.2617001939.security_groups.#: "0" => "0" ingress.2617001939.self: "" => "0" ingress.2617001939.to_port: "" => "443" Plan: 0 to add, 1 to change, 0 to destroy. ``` 3. **部署更改**:运行 `terraform apply` 命令部署更改: ```bash $ terraform apply ... aws_security_group.terraform-elb: Modifying... ingress.#: "1" => "2" ingress.2214680975.cidr_blocks.#: "1" => "1" ingress.2214680975.cidr_blocks.0: "0.0.0.0/0" => "0.0.0.0/0" ingress.2214680975.from_port: "80" => "80" ingress.2214680975.protocol: "tcp" => "tcp" ingress.2214680975.security_groups.#: "0" => "0" ingress.2214680975.self: "0" => "0" ingress.2214680975.to_port: "80" => "80" ingress.2617001939.cidr_blocks.#: "0" => "1" ingress.2617001939.cidr_blocks.0: "" => "0.0.0.0/0" ingress.2617001939.from_port: "" => "443" ingress.2617001939.protocol: "" => "tcp" ingress.2617001939.security_groups.#: "0" => "0" ``` #### 删除操作 若要删除部署的资源,可以使用 `terraform destroy` 命令。该命令会删除之前通过 `terraform apply` 部署的所有资源。 #### 总结 通过以上步骤,可以使用 Terraform 以代码方式管理基础设施,包括模板设计、变量定义、输出设置以及各种操作(验证、预演、部署、更新和删除)。使用代码管理基础设施可以提高效率、减少人为错误,并方便团队协作。 以下是整个操作流程的详细 mermaid 流程图: ```mermaid graph LR classDef startend fill:#F5EBFF,stroke:#BE8FED,stroke-width:2px; classDef process fill:#E5F6FF,stroke:#73A6FF,stroke-width:2px; classDef decision fill:#FFF6CC,stroke:#FFBC52,stroke-width:2px; A([开始]):::startend --> B(验证模板):::process B --> C{验证是否通过?}:::decision C -->|是| D(预演操作):::process C -->|否| B D --> E{预演是否满意?}:::decision E -->|是| F(初始部署):::process E -->|否| D F --> G(更新操作):::process G --> H(删除操作):::process H --> I([结束]):::startend ``` 通过这个流程图,可以清晰地看到整个以代码方式管理基础设施的操作流程,从开始的验证到最终的删除操作,每个步骤都紧密相连。同时,表格和代码示例也帮助我们更详细地了解每个操作的具体内容和实现方式。
corwn 最低0.47元/天 解锁专栏
赠100次下载
点击查看下一篇
profit 400次 会员资源下载次数
profit 300万+ 优质博客文章
profit 1000万+ 优质下载资源
profit 1000万+ 优质文库回答
复制全文

相关推荐

SW_孙维

开发技术专家
知名科技公司工程师,开发技术领域拥有丰富的工作经验和专业知识。曾负责设计和开发多个复杂的软件系统,涉及到大规模数据处理、分布式系统和高性能计算等方面。
最低0.47元/天 解锁专栏
赠100次下载
百万级 高质量VIP文章无限畅学
千万级 优质资源任意下载
千万级 优质文库回答免费看

最新推荐

【高级图像识别技术】:PyTorch深度剖析,实现复杂分类

![【高级图像识别技术】:PyTorch深度剖析,实现复杂分类](https://www.pinecone.io/_next/image/?url=https%3A%2F%2Fsiteproxy.ruqli.workers.dev%3A443%2Fhttps%2Fcdn.sanity.io%2Fimages%2Fvr8gru94%2Fproduction%2Fa547acaadb482f996d00a7ecb9c4169c38c8d3e5-1000x563.png&w=2048&q=75) # 摘要 随着深度学习技术的快速发展,PyTorch已成为图像识别领域的热门框架之一。本文首先介绍了PyTorch的基本概念及其在图像识别中的应用基础,进而深入探讨了PyTorch的深度学习

未知源区域检测与子扩散过程可扩展性研究

### 未知源区域检测与子扩散过程可扩展性研究 #### 1. 未知源区域检测 在未知源区域检测中,有如下关键公式: \((\Lambda_{\omega}S)(t) = \sum_{m,n = 1}^{\infty} \int_{t}^{b} \int_{0}^{r} \frac{E_{\alpha,\alpha}(\lambda_{mn}(r - t)^{\alpha})}{(r - t)^{1 - \alpha}} \frac{E_{\alpha,\alpha}(\lambda_{mn}(r - \tau)^{\alpha})}{(r - \tau)^{1 - \alpha}} g(\

分布式应用消息监控系统详解

### 分布式应用消息监控系统详解 #### 1. 服务器端ASP页面:viewAllMessages.asp viewAllMessages.asp是服务器端的ASP页面,由客户端的tester.asp页面调用。该页面的主要功能是将消息池的当前状态以XML文档的形式显示出来。其代码如下: ```asp <?xml version="1.0" ?> <% If IsObject(Application("objMonitor")) Then Response.Write cstr(Application("objMonitor").xmlDoc.xml) Else Respo

分布式系统中的共识变体技术解析

### 分布式系统中的共识变体技术解析 在分布式系统里,确保数据的一致性和事务的正确执行是至关重要的。本文将深入探讨非阻塞原子提交(Nonblocking Atomic Commit,NBAC)、组成员管理(Group Membership)以及视图同步通信(View - Synchronous Communication)这几种共识变体技术,详细介绍它们的原理、算法和特性。 #### 1. 非阻塞原子提交(NBAC) 非阻塞原子提交抽象用于可靠地解决事务结果的一致性问题。每个代表数据管理器的进程需要就事务的结果达成一致,结果要么是提交(COMMIT)事务,要么是中止(ABORT)事务。

【PJSIP高效调试技巧】:用Qt Creator诊断网络电话问题的终极指南

![【PJSIP高效调试技巧】:用Qt Creator诊断网络电话问题的终极指南](https://www.contus.com/blog/wp-content/uploads/2021/12/SIP-Protocol-1024x577.png) # 摘要 PJSIP 是一个用于网络电话和VoIP的开源库,它提供了一个全面的SIP协议的实现。本文首先介绍了PJSIP与网络电话的基础知识,并阐述了调试前所需的理论准备,包括PJSIP架构、网络电话故障类型及调试环境搭建。随后,文章深入探讨了在Qt Creator中进行PJSIP调试的实践,涵盖日志分析、调试工具使用以及调试技巧和故障排除。此外,

以客户为导向的离岸团队项目管理与敏捷转型

### 以客户为导向的离岸团队项目管理与敏捷转型 在项目开发过程中,离岸团队与客户团队的有效协作至关重要。从项目启动到进行,再到后期收尾,每个阶段都有其独特的挑战和应对策略。同时,帮助客户团队向敏捷开发转型也是许多项目中的重要任务。 #### 1. 项目启动阶段 在开发的早期阶段,离岸团队应与客户团队密切合作,制定一些指导规则,以促进各方未来的合作。此外,离岸团队还应与客户建立良好的关系,赢得他们的信任。这是一个奠定基础、确定方向和明确责任的过程。 - **确定需求范围**:这是项目启动阶段的首要任务。业务分析师必须与客户的业务人员保持密切沟通。在早期,应分解产品功能,将每个功能点逐层分

C#并发编程:加速变色球游戏数据处理的秘诀

![并发编程](https://img-blog.csdnimg.cn/1508e1234f984fbca8c6220e8f4bd37b.png) # 摘要 本文旨在深入探讨C#并发编程的各个方面,从基础到高级技术,包括线程管理、同步机制、并发集合、原子操作以及异步编程模式等。首先介绍了C#并发编程的基础知识和线程管理的基本概念,然后重点探讨了同步原语和锁机制,例如Monitor类和Mutex与Semaphore的使用。接着,详细分析了并发集合与原子操作,以及它们在并发环境下的线程安全问题和CAS机制的应用。通过变色球游戏案例,本文展示了并发编程在实际游戏数据处理中的应用和优化策略,并讨论了

深度学习 vs 传统机器学习:在滑坡预测中的对比分析

![基于 python 的滑坡地质灾害危险性预测毕业设计机器学习数据分析决策树【源代码+演示视频+数据集】](https://opengraph.githubassets.com/f6155d445d6ffe6cd127396ce65d575dc6c5cf82b0d04da2a835653a6cec1ff4/setulparmar/Landslide-Detection-and-Prediction) 参考资源链接:[Python实现滑坡灾害预测:机器学习数据分析与决策树建模](https://wenku.csdn.net/doc/3bm4x6ivu6?spm=1055.2635.3001.

多项式相关定理的推广与算法研究

### 多项式相关定理的推广与算法研究 #### 1. 定理中 $P_j$ 顺序的优化 在相关定理里,$P_j$ 的顺序是任意的。为了使得到的边界最小,需要找出最优顺序。这个最优顺序是按照 $\sum_{i} \mu_i\alpha_{ij}$ 的值对 $P_j$ 进行排序。 设 $s_j = \sum_{i=1}^{m} \mu_i\alpha_{ij} + \sum_{i=1}^{m} (d_i - \mu_i) \left(\frac{k + 1 - j}{2}\right)$ ,定理表明 $\mu f(\xi) \leq \max_j(s_j)$ 。其中,$\sum_{i}(d_i

嵌入式平台架构与安全:物联网时代的探索

# 嵌入式平台架构与安全:物联网时代的探索 ## 1. 物联网的魅力与挑战 物联网(IoT)的出现,让我们的生活发生了翻天覆地的变化。借助包含所有物联网数据的云平台,我们在驾车途中就能连接家中的冰箱,随心所欲地查看和设置温度。在这个过程中,嵌入式设备以及它们通过互联网云的连接方式发挥着不同的作用。 ### 1.1 物联网架构的基本特征 - **设备的自主功能**:物联网中的设备(事物)具备自主功能,这与我们之前描述的嵌入式系统特性相同。即使不在物联网环境中,这些设备也能正常运行。 - **连接性**:设备在遵循隐私和安全规范的前提下,与同类设备进行通信并共享适当的数据。 - **分析与决策