首页 » Terraform » 正文

Terraform 如何创建自己的 modules

我个人对terraform module的理解是,这个东西更像是我们传统意义上的函数,我们在一个地方定义了一个函数以后,以后相同的功能直接调用函数就可以了,不需要重新copy paste代码,当然我们也可以传递参数,这样函数执行的过程中还有差异化的选择, Terraform module的定义完全相同

我们使用https://github.com/gruntwork-io/intro-to-terraform中代码来做详细的讲解

首先,目录结构,我们要创建一个目录叫modules

目录结构如上,其中,webserver-cluster中的内容就是创建一个包含hello word的简单应用,创建一个ec2 (通过Auto Scaling Group实现)并且创建了elb在前端做负载

这个时候,我们就可以使用我们这个module了,创建test1.tf

注意stage 目录和 modules目录同级别

这样我就可以调用module webserver_cluster来创建我们的cluster了

我们也可以穿入具体参数,如果我们想要传递参数,那么我们必须在module中做了相应的定义,我们看一下如何定义

也就是说,我们在调用module的时候,可以同时传入这些参数,当然也可以不传入,不传入的话module就是用默认值

类似这样

但是使用module的时候有一个小小问题,如果我们想使用module中生成的instance或者asg来做一些操作,例如,自动扩容和自动缩减,这个时候我们就要在test1.tf中增加如下内容

如上内容有一个问题是,他们缺少必要输入autoscaling_group_name,只有知道了我们要对哪个ASG进行操作我们才可以进行真正的扩容,但是,这部分是在module中的,我们需要从module中获取具体数值,例如:

关键点在于asg_name,如果我们想使用这个,必须让module在执行完成后把这个参数赋值,具体操作如下:

我们在module的outputs.tf中定义了这么一个asg_name,也就是谁调用了module,那么这个module执行完就会返回一个asg_name,然后完成的名字就是module.webserver_cluster.asg_name

另外module有一个问题就是如果module发生修改,那么所有调用它的环境在下一次apply的时候都会发生改变,我们可以通过git来解决这个问题,因为module的调用支持github

例如:

 

 

 

Zhiming Zhang

Senior devops at Appannie
一个奔跑在运维路上的胖子
Zhiming Zhang

Latest posts by Zhiming Zhang (see all)