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中提问。

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
前端开发
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
若依修改,配置了一个接口路径出现了,如何放通接口{ “msg“: “请求访问:/code/list,认证失败,无法访问系统资源“, “code“: 401}
若依修改,路径{“msg“:“请求访问:/code/selectById/2,认证失败,无法访问系统资源“,“code“:401}
若依修改,路径{“msg“:“请求访问:/code/selectById/2,认证失败,无法访问系统资源“,“code“:401}
|
存储 分布式计算 大数据
Spark 原理_物理图_Task 设计 | 学习笔记
快速学习 Spark 原理_物理图_Task 设计
116 0
Spark 原理_物理图_Task 设计 | 学习笔记
VS Code项目中共享自定义的代码片段方案
VS Code项目中共享自定义的代码片段方案
|
缓存 监控 JavaScript
VS Code 是如何优化启动性能的?
本文主要是对 CovalenceConf 2019: Visual Studio Code – The First Second 这次分享的介绍,CovalenceConf 是一个以 Electron 构建桌面软件为主题的技术会议,这也是 VS Code 团队为数不多的对外分享之一(质量较高),主要分享了 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 使用的一个例子
|
SQL 测试技术 API
State Processor API:如何读取,写入和修改 Flink 应用程序的状态
Apache Flink 1.9.0引入了状态处理器(`State Processor`)API,它是基于DataSet API的强大扩展,允许读取,写入和修改Flink的保存点和检查点(checkpoint)中的状态。
|
NoSQL
随笔:sending data状态包含了使用内部临时表
这是一个我的随笔记录,这些过程非常有用,也非常明显。 欢迎关注我的《深入理解MySQL主从原理 32讲 》,如下: 语句如下: mysql> desc select id,count(*) from t110 group by id; +----+-------------+-------+...
881 0