Infrastractor As Code中Code与物理资源同步的原理分析

简介: 上篇文章讲到《企业应用如何解决Multi-Cloud的基础设施管理及应用部署问题》,其核心是使用Terraform的模板管理基础设施,虽然Terraform的中文资料较少,好在Aliyun官方仓库的Example目录中提供了大量的模板参考,参考这些模板将能够管理常用的云服务。 什么是Infrast

上篇文章讲到《企业应用如何解决Multi-Cloud的基础设施管理及应用部署问题》,其核心是使用Terraform的模板管理基础设施,虽然Terraform的中文资料较少,好在阿里云Terraform官方仓库的Example目录中提供了大量的模板参考,参考这些模板将能够管理常用的云服务。

什么是Infrastractor As Code(IaC)

基础设施即代码(IaC)的概念已经被人们所熟知,其核心就是“告别手工配置基础设施的时代,用自定义脚本来配置基础设施”。目前也有很多的自动化工具来实现自定义脚本,如Terraform、Ansible、Chef、Puppet、SaltStack等等。IaC的好处是可以将脚本做为基础设施的文档,可以做版本管理,每次的变更都有历史记录,还有些人基于这些脚本生成任何人都能看懂的基础设施关系图、图表等等。

但在实践中很多人在后续的变更中不再使用脚本变更,而是直接在管理系统中或其他方式手动修改基础设施,导致脚本丧失了作为追溯依据的价值。所以对于IaC其重中之重是通过脚本再次更新资源、以及物理资源的变更与脚本的同步问题,本文将深入讲解Terraform的核心之一State的原理,通过其原理对其运作机制有更进一步的认识,从而达到灵活创建/更新/同步云资源的目的。

state的原理

Terraform可以轻松的做到通过Code(下面统称为模板)更新物理资源,以及物理资源更新后与模板的差异对比,这些都源于其State文件(运行apply命令后生成的tfstate文件)。下图是各个命令运行后模板与State与物理资源的各种关系变化。

state

实例讲解

下面就以一台云服务器的全生命周期管理来讲解创建、更新、物理资源变更、释放时的各种变化。

1.创建一台经典网络下的云服务器模板如下:


resource "alicloud_instance" "webserver" {
    count = 1
    availability_zone = "cn-beijing-b"
    security_groups = ["****"]
    allocate_public_ip = true
    instance_charge_type = "PostPaid"
    instance_type = "ecs.n1.small"
    internet_charge_type = "PayByTraffic"
    internet_max_bandwidth_out = 5
    system_disk_category = "cloud_efficiency"
    image_id = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
    instance_name = "tf_snat"
    tags {
        role = "webserver"
    }
}

运行


terraform apply

在阿里云的ECS控制台可以看到新创建的云服务器。

2.修改Tag:添加一个标签,模板tags部分增加如下内容:


datacenter = "beijing"

完整的模板如下:


resource "alicloud_instance" "webserver" {
    count = 1
    availability_zone = "cn-beijing-b"
    security_groups = ["****"]
    allocate_public_ip = true
    instance_charge_type = "PostPaid"
    instance_type = "ecs.n1.small"
    internet_charge_type = "PayByTraffic"
    internet_max_bandwidth_out = 5
    system_disk_category = "cloud_efficiency"
    image_id = "ubuntu_140405_64_40G_cloudinit_20161115.vhd"
    instance_name = "tf_snat"
    tags {
        role = "webserver"
        datacenter = "beijing"
    }
}

运行


terraform plan

会对比tfstate文件,返回变更差异:

2

如果确认要变更物理资源,执行


terraform apply

3.如果物理资源有变更,比如其他管理员使用控制台或其他工具更新了标签,增加了标签"renew = 2018",执行


terraform refresh

将会根据物理资源更新tfstate文件,再次运行:


terraform plan

将会看到模板与state文件的差异:

3

此时有两个选择:如果想以物理资源的变更为基准,可以更新模板,添加tag;如果想以模板为基准,可以直接执行terraform apply命令更新物理资源。

4.如果想释放这台云服务器,执行


terraform destroy

将根据state文件的记录删除这台云服务器。

本文详细讲解了terraform使用状态逼近的方法使得IaC中的Code和物理环境一致,使用状态文件tfstate来描述状态的变更,了解了这点之后大家可以灵活运用此文件做到模板与物理资源的同步问题,基于此基础设施的管理会更有序,其上的应用部署也会更有序。

大家有问题也可以在https://github.com/alibaba/terraform-provider的Issue中提问。

相关实践学习
2分钟自动化部署人生模拟器
本场景将带你借助云效流水线Flow实现人生模拟器小游戏的自动化部署
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
Java 测试技术 API
Java RESTful中的PATCH请求:局部更新与资源修改
在RESTful架构中,PATCH请求是一种用于局部更新已有资源的操作。PATCH请求允许客户端将部分数据发送到服务器,以便对资源进行局部修改,而不必替换整个资源。本文将引导您深入了解Java中使用PATCH请求构建RESTful API,探讨其特点、实现方式、用例以及在实际应用中的优势。
|
4月前
|
SQL DataWorks 关系型数据库
DataWorks操作报错合集之离线同步任务时,如何解决资源组报错:errormessage:Render instance failed
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
5月前
|
前端开发
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
若依修改,路径{“msg“:“请求访问:/code/selectById/2,认证失败,无法访问系统资源“,“code“:401}
若依修改,路径{“msg“:“请求访问:/code/selectById/2,认证失败,无法访问系统资源“,“code“:401}
|
运维 前端开发 中间件
Go 项目分层下的最佳 error 处理方式
本文对 Go 项目分层下的最佳 `error` 处理方式进行介绍,并通过使用 github.com/pkg/errors 库中的一些实用函数来提供实现示例。
162 1
Go 项目分层下的最佳 error 处理方式
VS Code项目中共享自定义的代码片段方案
VS Code项目中共享自定义的代码片段方案
|
缓存 监控 JavaScript
VS Code 是如何优化启动性能的?
本文主要是对 CovalenceConf 2019: Visual Studio Code – The First Second 这次分享的介绍,CovalenceConf 是一个以 Electron 构建桌面软件为主题的技术会议,这也是 VS Code 团队为数不多的对外分享之一(质量较高),主要分享了 VS Code 是如何优化启动性能的。
10639 4
VS Code 是如何优化启动性能的?
|
Oracle 关系型数据库 数据库