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

上篇文章讲到《企业应用如何解决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与物理资源的各种关系变化。

实例讲解

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

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文件,返回变更差异:

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

terraform apply

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

terraform refresh

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

terraform plan

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

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

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

terraform destroy

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

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

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

时间: 2024-11-06 15:34:19

Infrastractor As Code中Code与物理资源同步的原理分析的相关文章

PHP中使用addslashes函数转义的安全性原理分析_php技巧

本文实例讲述了PHP中使用addslashes函数转义的安全性原理分析.分享给大家供大家参考.具体分析如下: 先来看一下ECshop中addslashes_deep的原型 复制代码 代码如下: function addslashes_deep($value) {     if (empty($value)) {         return $value;  //如为空,直接返回;     } else {         return is_array($value) ? array_map(

PHP中实现中文字符进制转换原理分析_php技巧

一,中文字符转十进制原理分析 GBK编码中一个汉字由二个字符组成,获取汉字字符串的方法如下 复制代码 代码如下: $string = "不要迷恋哥"; $length = strlen($string); for($i=0;$i<$length;$i++){ if(ord($string[$i])>127){ $result[] = ord($string[$i]).' '.ord($string[++$i]); } } var_dump($result); 由于一个汉字为

.Net中如何操作IIS的虚拟目录原理分析及实现方案_实用技巧

.Net中实际上已经为我们在这方面做得很好了.FCL中提供了不少的类来帮助我们完成这项工作,让我们的开发工作变非常简单和快乐.编程控制IIS实际上很简单,和ASP一样,.Net中需要使用ADSI来操作IIS,但是此时我们不再需要GetObject这个东东了,因为Net为我们提供了更加强大功能的新东东. System.DirectoryServices命名空间中包括了些强大的东东--DirectoryEntry, DirectoryEntries,它们为我们提供了访问活动目录的强大功能,在这些类允

jquery中ajax的get post同步请求问题分析

  今天需要用到ajax的get方法,封装到了自己自定义的function name,里面但是发现了一个问题,总是会自己自定义的方法里面的代码全部执行完成后才会去执行get,这样就导致了不同步,这样给我们程序员带了很大的不便,    没有使用同步代码时候的get  function name(){  ret = 'y';  $.get("xx.php", function(data){    ret = data;   });  return ret;  }  获取到的结果总是未y然后

code中的现有项目如何删除?

问题描述 code中的现有项目如何删除? 我尝试着使用csdn的code,创建了测试用的项目,现在我想把测试用的项目删除,在code上找不到删除项目的地方,请问:我该如何删除项目 ? 解决方案 项目创建了是不允许删除的.除非管理员帮你. 解决方案二: 找论坛管理员问问,给他发私信 解决方案三: 覆盖试试,code中的现有项目 解决方案四: 管理页面没有地方删?给管理员发信

vscode 运行环境-求大神告知:如何在 visual studio code中编译运行C/C++代码?

问题描述 求大神告知:如何在 visual studio code中编译运行C/C++代码? 求大神告知:如何在 visual studio code中编译运行C/C++代码,如需配置环境,怎么配置?求详细操作,拜谢! 解决方案 http://stackoverflow.com/questions/30269449/how-do-i-set-up-vscode-to-compile-c-code google下就有答案 解决方案二: 如何在visual studio2015 中配置编写C.C++

前端开发工具-visual studio code中html文档中输入script代码自动补全问题

问题描述 visual studio code中html文档中输入script代码自动补全问题 请问各位大神,怎么配置visual studio code(vsd)才能在html文档中插入script脚步有 自动补全的功能!!!开发工具-visual studio code中html文档中输入script代码自动补全问题-visual studio 补全"> 但是,如何在html中的script标签内实现补全 解决方案 visual studio 代码自动补全 与快捷键如何在Visual

参数传递-【Maven】 maven的参数透传。 测试code中引用pom.xml 的参数

问题描述 [Maven] maven的参数透传. 测试code中引用pom.xml 的参数 需求: 1, code 中有一些参数需要经常改变其指定值. 2, 希望在pom.xml(或地方存储这些值) 3, 在使用mvn 执行时使用 mvn -DXXX=XXXX 替换pom.xm中的参数值. 问题: 查阅资料发现, mvn -DXXX 一般都是替换pom.xml 中的引用值, 且替换的值都是mvn执行插件或功能值.但我在工程code 中该怎么引用pom.xml 中指定的值呢? pom.xml 中设

如何在CODE中使用代码在网页中打开一个新窗口?

问题描述 如何在CODE中使用代码在网页中打开一个新窗口?protectedvoidBtnAddContact_Click(objectsender,EventArgse){if(Page.IsValid){}}备注说明:在HTML中可以直接使用window.open这个我知道 解决方案 解决方案二:Response.Write("<script>window.open</script>");解决方案三:这样啊,我的意思是,还没有别的,不用写<script