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

本文涉及的产品
云服务器 ECS,每月免费额度280元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: 上篇文章讲到《企业应用如何解决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中提问。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
8月前
|
Java 测试技术 API
Java RESTful中的PATCH请求:局部更新与资源修改
在RESTful架构中,PATCH请求是一种用于局部更新已有资源的操作。PATCH请求允许客户端将部分数据发送到服务器,以便对资源进行局部修改,而不必替换整个资源。本文将引导您深入了解Java中使用PATCH请求构建RESTful API,探讨其特点、实现方式、用例以及在实际应用中的优势。
|
6月前
|
存储 JSON 运维
《服务器无状态设计:为什么&如何实现无状态API?》
《服务器无状态设计:为什么&如何实现无状态API?》
77 0
|
10月前
|
运维 前端开发 中间件
Go 项目分层下的最佳 error 处理方式
本文对 Go 项目分层下的最佳 `error` 处理方式进行介绍,并通过使用 github.com/pkg/errors 库中的一些实用函数来提供实现示例。
109 1
Go 项目分层下的最佳 error 处理方式
|
Android开发
跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo
跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo
|
数据库 Android开发
跨程序共享数据——Content Provider 之 创建自己的内容提供器
跨程序共享数据——Content Provider 之 创建自己的内容提供器
VS Code项目中共享自定义的代码片段方案
VS Code项目中共享自定义的代码片段方案
|
Web App开发 存储
SAP UI5 应用的调试标志位的本地存储逻辑 - local storage 使用的一个例子
We know that once we enable debug mode via “Ctrl+Alt+Shift+P”, this setting will be persisted: even if you turn off your laptop and launch the application tomorrow, the debug mode will still be there.
SAP UI5 应用的调试标志位的本地存储逻辑 - local storage 使用的一个例子
|
缓存 监控 JavaScript
VS Code 是如何优化启动性能的?
本文主要是对 CovalenceConf 2019: Visual Studio Code – The First Second 这次分享的介绍,CovalenceConf 是一个以 Electron 构建桌面软件为主题的技术会议,这也是 VS Code 团队为数不多的对外分享之一(质量较高),主要分享了 VS Code 是如何优化启动性能的。
VS Code 是如何优化启动性能的?
|
Android开发
跨程序共享数据——Content Provider 之 ContentResolver基本用法 & 一个读取系统联系人的Demo
本模块共有四篇文章,参考郭神的《第一行代码》,对Content Provider的学习做一个详细的笔记,大家可以一起交流一下: 跨程序共享数据——Content Provider 之 运行时权限解析以及申请的实现(可完美解决java.
1308 0
|
Oracle 关系型数据库 数据库