Terraform模块Module管理,聚合资源的抽取与复用
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶!
1 简介
最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人。
Terraform系列文章如下:
Terraform入门教程,示例展示管理Docker和Kubernetes资源
Terraform插件Provider管理,搜索、定义、下载
Terraform模块Module管理,聚合资源的抽取与复用
模块是为了便为管理与复用,就跟函数是一样的。一个模块大概有以下文件:
main.tf
:就像是函数入口;README.md
:如函数的声明;variables.tf
: 变量说明,就像函数的入参;outputs.tf
: 输出,如函数的返回值;examples
: 使用示例;
另外,模块也是可以嵌套的,即模块里有子模块,但不建议嵌套太深。
2 创建及使用自定义模块
2.1 创建模块
我们来通过一个简单示例讲解如何自己创建一个模块。这个模块的功能是在Kubernetes上部署一个nginx,就是创建一个Deployment和一个Service。
这个模块共有两个文件,一个是main.tf
,用来定义Resource,即Deployment和Service。另一个文件是variables.tf
,用来定义这个模块所需要的输入变量。这两个文件都放在当前目录的nginx-kubernetes文件夹下。目录结果如下:
main.tf
文件如下:
resource "kubernetes_deployment" "test" {
metadata {
name = var.applicationName
namespace = var.namespace
}
spec {
replicas = var.replicas
selector {
match_labels = {
app = var.applicationName
}
}
template {
metadata {
labels = {
app = var.applicationName
}
}
spec {
container {
image = var.image
name = "nginx-container"
port {
container_port = 80
}
}
}
}
}
}
resource "kubernetes_service" "test" {
metadata {
name = var.applicationName
namespace = var.namespace
}
spec {
selector = {
app = var.applicationName
}
type = "NodePort"
port {
node_port = var.nodePort
port = 80
target_port = 80
}
}
depends_on = [kubernetes_deployment.test]
}
它就是资源定义,然后把一些变量用var.xxx
的形式替换,这样Terraform解析的时候就会找对应的变量进行赋值。
variables.tf
文件如下:
variable "namespace" {
description = "k8s namespace"
}
variable "applicationName" {
description = "applicationName"
}
variable "image" {
description = "image"
}
variable "replicas" {
description = "deployment replicas"
}
variable "nodePort" {
description = "nodePort"
}
在main.tf
文件使用的变量,都在这里有定义。
2.2 使用模块
现在我们已经创建好了模块,接下来要引用它。我们就在当前目录引用即可。代码如下:
provider "kubernetes" {
config_path = "~/.kube/config"
}
module "pkslow-nginx" {
source = "./nginx-kubernetes"
namespace = "pkslow"
applicationName = "pkslow-nginx"
image = "nginx:1.19.5"
replicas = 3
nodePort = 30301
}
source
: 模块来源的地址;namespace
: 命令空间,模块定义的入参;applicationName
: 应用名,模块定义的入参;image
: 镜像,模块定义的入参;replicas
: Pod的数目,模块定义的入参;nodePort
: 端口,模块定义的入参;
引用模块还是很简单的,跟调用函数差不多,就是告诉别人名字和入参。
3 使用外部模块
模块的source支持多种类型,如本地路径、Terraform官方仓库、GitHub等。
本地路径:
module "pkslow" {
source = "./pkslow"
}
Terraform仓库:
module "consul" {
source = "hashicorp/consul/aws"
version = "0.1.0"
}
GitHub地址:
module "pkslow" {
source = "github.com/larrydpk/pkslow"
}
如果是用SSH,如下:
module "pkslow" {
source = "git@github.com:larrydpk/pkslow.git"
}
压缩包:
module "vpc" {
source = "https://pkslow.com/vpc-module?archive=zip"
}
4 总结
代码请查看:https://github.com/LarryDpk/pkslow-samples
欢迎关注微信公众号<南瓜慢说>,将持续为你更新...
多读书,多分享;多写作,多整理。
Terraform模块Module管理,聚合资源的抽取与复用的更多相关文章
- Terraform插件Provider管理,搜索、定义、下载
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...
- Terraform状态State管理,让变更有记录
我最新最全的文章都在南瓜慢说 www.pkslow.com,欢迎大家来喝茶! 简介 最近工作中用到了Terraform,权当学习记录一下,希望能帮助到其它人. Terraform系列文章如下: Ter ...
- 玩转IDEA项目结构Project Structure,打Jar包、模块/依赖管理全搞定
前言 你好,我是A哥(YourBatman). 如何给Module模块单独增加依赖? 如何知道哪些Module模块用了Spring框架,哪些是web工程? IDEA如何打Jar包?打War包? 熟练的 ...
- 在IDEA中通过Module管理多个项目
你身边有没有这种顽固的Eclipse忠实用户:IDEA不能一个窗口管理多个项目!太不方便了! 对于一个窗口同时管理多个项目的需求,在我们日常开发时候是经常需要的.尤其当我们在分布式环境下,在一个窗口中 ...
- python模块module package
python模块module package module package 常用模块 模块与包的区别 模块分为内置模块.第三方模块,自定义模块 程序会先从内置到第三方再到当前工作目录下去找你导入的 ...
- webpack新版本4.12应用九(配置文件之模块(module))
这些选项决定了如何处理项目中的不同类型的模块. module.noParse RegExp | [RegExp] RegExp | [RegExp] | function(从 webpack 3.0. ...
- 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 百篇博客分析OpenHarmony源码 | v24.01
百篇博客系列篇.本篇为: v24.xx 鸿蒙内核源码分析(进程概念篇) | 进程在管理哪些资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内 ...
- 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 百篇博客分析OpenHarmonyOS | v2.07
百篇博客系列篇.本篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核资源 | 51.c.h .o 进程管理相关篇为: v02.xx 鸿蒙内核源码分析(进程管理篇) | 谁在管理内核 ...
- XAF新手入门 - 模块(Module)
模块概述 谈到模块大家应该都不会感到陌生,不管是前端还是后端都有模块的概念,XAF中的模块概念与大多数框架中的模块概念是相通的.XAF模块首先是一个.NET类库,同时它还包含一个继承自ModuleBa ...
随机推荐
- [bug] CDH安装中断 再次安装显示当前受管 无法选择
参考 https://blog.csdn.net/JacksonKing/article/details/104350313 重装 https://blog.csdn.net/simle168/art ...
- Ansible_使用文件模块将修改文件复制到受管主机
一.描述常用文件模块 1.常用文件模块 模块名称 模块说明 blockinfile 插入.更新或删除由可自定义标记线包围的多行文本块 copy 将文件从本地或远程计算机复制到受管主机上的某个位置.类似 ...
- SSH 远程控制
本文以 Ubuntu 20.04(客户端) 控制 Kali Linux 2020.2(服务端)为例 1.安装SSH(secure Shell) SSH分为客户端oppenssh-client和服务端o ...
- k8s 管理存储资源(10)
一.Kubernetes 如何管理存储资源 理解Volume 我们经常会说:容器和 Pod 是短暂的. 其含义是它们的生命周期可能很短,会被频繁地销毁和创建.容器销毁时,保存在容器内部文件系统中的数据 ...
- nosql数据库之Redis持久化、备份和主从配置
一.持久化方式 Redis提供了两种数据备份的方式,一种是RDB,另外一种是AOF. RDB AOF 开启/关闭 开启:默认开启:关闭:把配置文件中所有的save注释就是关闭了 开启:在配置文件中 ...
- Java 值类型和引用类型
现实世界中的值和引用 假定你在读一份非常棒的东西,希望一个朋友也去读它.为了避免被人投诉支持盗版,进一步假定它是公共领域中的一份文档.那么,需要为朋友提供什么才能让他读到文档呢? 这完全取决于阅读的内 ...
- CGI开发-(转自 jemofh159)
随着Internet技术的兴起,在嵌入式设备的管理与交互中,基于Web方式的应用成为目前的主流,这种程序结构也就是大家非常熟悉的B/S结构,即在嵌入式设备上运行一个支持脚本或CGI功能的Web服务器, ...
- visual studio code 快捷键-(转自 浅笑千寻)
Visual Studio Code之常备快捷键 官方快捷键大全:https://code.visualstudio.com/docs/customization/keybindings Visual ...
- java基础之8种基本数据类型
简单往往是最重要的,在刚刚学java的时候老师会给我们先讲这8种基本数据类型,今天再来做一个温习,[本文大部分参考了 https://zhuanlan.zhihu.com/p/25439066,在上面 ...
- MySQL之数据操纵语言(DML)
数据操纵语言(DML) 数据操纵语(Data Manipulation Language),简称DML. DML主要有四个常用功能. 增 删 改 查 insert delete update sele ...