使用terraform v0.12 生成gitlab repo 创建部署tf 文件
以前写过一个使用模版引擎+ rest 接口的模式,生成tf 文件,v0.12 直接提供了方便的json 处理函数
我们可以直接结合http 以及templatefile providers 方便的生成文件
rest api 格式
因为有一个数据格式的问题,在rest 接口中直接就暴露了parent 的tf 信息,后边在说明出有一个解决方法
{
"data": {
"projects": [
{
"name": "firstrong",
"path":"firstrong",
"description":"firstrong",
"group" : "firstrong"
},
{
"name": "secondrong",
"path":"secondrong",
"description":"secondrong",
"group": "secondrong"
},
{
"name": "thirdrong",
"path":"thirdrong",
"description":"thirdrong",
"group": "thirdrong"
}
],
"groups_parent":[
{
"name":"firstrong",
"path":"firstrong",
"description":"firstrong"
},
{
"name":"secondrong",
"path":"secondrong",
"description":"secondrong"
},
{
"name":"thirdrong",
"path":"thirdrong",
"description":"thirdrong"
}
],
"subgroups":[
{
"name":"demoapp",
"path":"demoapp",
"parent":"${gitlab_group.firstrong.id}"
},
{
"name":"demoapp2",
"path":"demoapp2",
"parent":"${gitlab_group.secondrong.id}"
},
{
"name":"demoapp3",
"path":"demoapp3",
"parent":"${gitlab_group.thirdrong.id}"
}
]
}
}
tf 配置
- main.tf 文件
data "http" "example" {
url = "http://localhost:8080/app.json"
}
resource "local_file" "foo2" {
content = "${templatefile("backends.tmpl", "${jsondecode(data.http.example.body)}")}"
filename = "init2.sh"
}
- 模版文件
provider "gitlab" {
base_url = "http://gitserver/api/v4/"
token = "xxxxxx"
}
%{ for item in data.projects ~}
resource "gitlab_group" "${item.name}" {
name = "${item.name}"
path = "${item.path}"
description = "${item.description}"
}
%{ endfor ~}
%{ for item in data.groups_parent ~}
resource "gitlab_group" "${item.name}" {
name = "${item.name}"
path = "${item.path}"
description = "${item.description}"
}
%{ endfor ~}
%{ for item in data.subgroups ~}
resource "gitlab_group" "${item.name}" {
name = "${item.name}"
path = "${item.path}"
parent_id = "${item.parent}"
}
%{ endfor ~}
生成文件
- init
terraform init
效果
Initializing the backend...
Initializing provider plugins...
The following providers do not have any version constraints in configuration,
so the latest version was installed.
To prevent automatic upgrades to new major versions that may contain breaking
changes, it is recommended to add version = "..." constraints to the
corresponding provider blocks in configuration, with the constraint strings
suggested below.
* provider.http: version = "~> 1.1"
* provider.local: version = "~> 1.2"
Terraform has been successfully initialized!
You may now begin working with Terraform. Try running "terraform plan" to see
any changes that are required for your infrastructure. All Terraform commands
should now work.
If you ever set or change modules or backend configuration for Terraform,
rerun this command to reinitialize your working directory. If you forget, other
commands will detect it and remind you to do so if necessary.
- pan
terraform plan
效果
Refreshing Terraform state in-memory prior to plan...
The refreshed state will be used to calculate this plan, but will not be
persisted to local or remote state storage.
data.http.example: Refreshing state...
local_file.foo2: Refreshing state... [id=98c83d090df2e6559c0225e00f2419dc4c554701]
------------------------------------------------------------------------
No changes. Infrastructure is up-to-date.
This means that Terraform did not detect any differences between your
configuration and real physical resources that exist. As a result, no
actions need to be performed.
- apply
terraform apply
效果
data.http.example: Refreshing state...
local_file.foo2: Refreshing state... [id=98c83d090df2e6559c0225e00f2419dc4c554701]
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
+ create
Terraform will perform the following actions:
# local_file.foo2 will be created
+ resource "local_file" "foo2" {
+ content = "\nprovider \"gitlab\" {\n base_url = \"http://gitserver/api/v4/\"\n token = \"xxxxxx\"\n}\n\nresource \"gitlab_group
\" \"firstrong\" {\n name = \"firstrong\"\n path = \"firstrong\"\n description = \"firstrong\"\n}\nresource \"gitlab_group\" \"second
rong\" {\n name = \"secondrong\"\n path = \"secondrong\"\n description = \"secondrong\"\n}\nresource \"gitlab_group\" \"thirdrong\" {
\n name = \"thirdrong\"\n path = \"thirdrong\"\n description = \"thirdrong\"\n}\n\nresource \"gitlab_group\" \"firstrong\" {\n nam
e = \"firstrong\"\n path = \"firstrong\"\n description = \"firstrong\"\n}\nresource \"gitlab_group\" \"secondrong\" {\n name = \"seco
ndrong\"\n path = \"secondrong\"\n description = \"secondrong\"\n}\nresource \"gitlab_group\" \"thirdrong\" {\n name = \"thirdrong\"\
n path = \"thirdrong\"\n description = \"thirdrong\"\n}\n\nresource \"gitlab_group\" \"demoapp\" {\n name = \"demoapp\"\n path = \
"demoapp\"\n parent_id = \"${gitlab_group.firstrong.id}\"\n}\nresource \"gitlab_group\" \"demoapp2\" {\n name = \"demoapp2\"\n path =
\"demoapp2\"\n parent_id = \"${gitlab_group.secondrong.id}\"\n}\nresource \"gitlab_group\" \"demoapp3\" {\n name = \"demoapp3\"\n pa
th = \"demoapp3\"\n parent_id = \"${gitlab_group.thirdrong.id}\"\n}\n"
+ filename = "init2.sh"
+ id = (known after apply)
}
Plan: 1 to add, 0 to change, 0 to destroy.
Do you want to perform these actions?
Terraform will perform the actions described above.
Only 'yes' will be accepted to approve.
Enter a value: yes
local_file.foo2: Creating...
local_file.foo2: Creation complete after 0s [id=98c83d090df2e6559c0225e00f2419dc4c554701]
Apply complete! Resources: 1 added, 0 changed, 0 destroyed.
说明
以上只是一个简单的v0.12 的试用,注意当前gitlab 插件不支持v0.12 ,后边估计会好吧,对于模版包含特殊字符的处理
参考如下:
provider "gitlab" {
base_url = "http://gitserver/api/v4/"
token = "xxxxxx"
}
%{ for item in data.projects ~}
resource "gitlab_group" "${item.name}" {
name = "${item.name}"
path = "${item.path}"
description = "${item.description}"
}
%{ endfor ~}
%{ for item in data.groups_parent ~}
resource "gitlab_group" "${item.name}" {
name = "${item.name}"
path = "${item.path}"
description = "${item.description}"
}
%{ endfor ~}
%{ for item in data.subgroups ~}
resource "gitlab_group" "${item.name}" {
name = "${item.name}"
path = "${item.path}"
parent_id = "$${gitlab_group.${item.parent}.id}"
}
%{ endfor ~}
参考资料
https://www.terraform.io/docs/configuration/functions/templatefile.html
https://www.terraform.io/docs/configuration/functions/jsondecode.html
https://www.terraform.io/docs/configuration/expressions.html#string-templates
https://github.com/rongfengliang/terraform-gtilab-demo.git
使用terraform v0.12 生成gitlab repo 创建部署tf 文件的更多相关文章
- sqler 集成 terraform v0.12 生成资源部署文件
terraform v0.12 发布了,有好多新功能的添加,包括语法的增强,新函数的引入,更好的开发提示 只是当前对于一些老版本的provider 暂时还不兼容,但是大部分官方的provider 都是 ...
- terraform v0.12.0 发布了
v0.12.0 相比以前的有好多新的特性,包括语法,以及函数增强,昨天还在折腾的一个json解码的问题,直接使用 v0.12.0 就可以解决了,同时也包含了for 操作处理同时官方文档对于v0.12. ...
- Node.js V0.12 新特性之性能优化
v0.12悠长的开发周期(已经过去九个月了,并且还在继续,是有史以来最长的一次)让核心团队和贡献者们有充分的机会对性能做一些优化. 本文会介绍其中最值得注意的几个. http://www.infoq. ...
- 【译】 Node.js v0.12的新特性 -- Cluster模式采用Round-Robin负载均衡
原文:https://strongloop.com/strongblog/whats-new-in-node-js-v0-12-cluster-round-robin-load-balancing 本 ...
- 【译】 Node.js v0.12的新特性 -- 性能优化
原文: https://strongloop.com/strongblog/performance-node-js-v-0-12-whats-new/ January 21, 2014/in Comm ...
- Node.js V0.12新特性之性能优化
v0.12悠长的开发周期(已经过去九个月了,并且还在继续,是有史以来最长的一次)让核心团队和贡献者们有充分的机会对性能做一些优化.本文会介绍其中最值得注意的几个. 支持塞住模式的可写流 现在可写流可以 ...
- Node v0.12.5 稳定版发布
Node v0.12.5 稳定版发布了,该版本改进记录主要包括: openssl: upgrade to 1.0.1o (Addressing multiple CVEs) npm: upgrade ...
- 从GitLab上创建分支本地拉取项目和提交项目详解
很多公司前端项目都是部署在GitLab上的,今天我要分享的就是如何从GitLab上创建新的分支并在本地拉取和提交项目 一.在GitLab上面创建自己新的分支 首先你得注册一个账号,登陆之后进入项目Pr ...
- GraphScope v0.12.0 版本发布
GraphScope 每月进行常规版本的迭代与发布,GraphScope v0.12.0 全新版本在四月如期而至.v0.12.0 为交互式图查询 GAIA 引入全新的 IR 层以及新增 Giraph ...
随机推荐
- ubuntu Docker安装部署Rancher
一.Rancher简介 Rancher是一个开源的企业级容器管理平台.通过Rancher,企业再也不必自己使用一系列的开源软件去从头搭建容器服务平台.Rancher提供了在生产环境中使用的管理Dock ...
- 九校联考-DL24凉心模拟Day2总结
T1 锻造 forging 题目描述 "欢迎啊,老朋友." 一阵寒暄过后,厂长带他们参观了厂子四周,并给他们讲锻造的流程. "我们这里的武器分成若干的等级,等级越高武器就 ...
- 2、在NET中实现多线程
1.System.Threading命名空间 System.Threading命名空间提供了使得可以多线程编程的类和接口 其中 (1)Thread类构成了C#多线程编程的支柱,他用于创建并控制线程 ( ...
- C# 读取Oracle数据库视图数据异常问题处理
会出现类似现在这种提示的错误 System.Data.OracleClient 需要 Oracle 客户端软件 version 8.1.7 或更高版本 情况1.开发过程中遇到这种问题解决 由于.net ...
- C# vb .net图像合成-合成星形
在.net中,如何简单快捷地实现图像合成呢,比如合成文字,合成艺术字,多张图片叠加合成等等?答案是调用SharpImage!专业图像特效滤镜和合成类库.下面开始演示关键代码,您也可以在文末下载全部源码 ...
- Go defer 会有性能损耗,尽量不要用?
上个月在 @polaris @轩脉刃 的全栈技术群里看到一个小伙伴问 “说 defer 在栈退出时执行,会有性能损耗,尽量不要用,这个怎么解?”. 恰好前段时间写了一篇 <深入理解 Go def ...
- SQLServer更新数据库每行一个随机数
代码: ) DECLARE user_extension_cursor CURSOR FOR SELECT UserCode FROM Users OPEN user_extension_cursor ...
- 2019 汇量科技java面试笔试题 (含面试题解析)
本人5年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.汇量科技等公司offer,岗位是Java后端开发,因为发展原因最终选择去了汇量科技,入职一年时间了,也成为了面 ...
- Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器
Python进阶(三)----函数名,作用域,名称空间,f-string,可迭代对象,迭代器 一丶关键字:global,nonlocal global 声明全局变量: 1. 可以在局部作用域声明一 ...
- aria2 资料
https://www.jianshu.com/p/8124b5b6ef95https://quan.ithome.com/0/331/853.htmhttp://www.360doc.com/con ...