使用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 ...
随机推荐
- 工信部要求应用商店上新 App 检查 IPv6,这里有一份 IPv6 快速部署指南
7 月 25 日,工业和信息化部信息通信发展司组织召开部署推进 IPv6 网络就绪专项行动电视电话会议.会议指出,加快推进 IPv6 规模部署,构建高速率.广普及.全覆盖.智能化的下一代互联网,是互联 ...
- GridControl单元格编辑验证的方法
本文实例演示了DevExpress实现GridControl单元格编辑验证的方法,比较实用的功能,具体方法如下: 主要功能代码如下: /// <summary> /// 自定义单元格验证 ...
- 小米9安装charles证书
一.打开你 mac 中对应的 charles 二.点击右上角的help按钮,打开帮助弹窗 三.点击帮助弹窗中的SSL Proxying,选择save charles root certificatio ...
- 全栈项目|小书架|微信小程序-点赞功能实现
微信小程序端的点赞功能其实没什么好介绍的,无非就是调用接口改变点赞状态和点赞数量.需要注意的是取消点赞时的处理,我这里为了减少服务器接口的调用,直接本地存一个变量,修改这里的变量值即可. 由于源码都相 ...
- yii框架无限极分类的做法
用yii框架做了一个无限极分类,主要的数组转换都是粘贴的别人的代码,但还是不要脸的写出来,方便以后自己看 用的是递归,不是path路径 控制器: protected function subtree( ...
- 【C#】 获取计算机的硬件信息
添加引用:System.Management /// <summary> /// 获取本机的MAC地址 /// </summary> /// <returns>&l ...
- 异常来自 HRESULT:0x8007000B
这个是64位应用32位产生的问题.相信大家搜索的时候很多都是建议改把项目的AnyCPU改成X86,可是很不幸我的改不了. 终于搜索了半天后发现,IIS里解决才是根本办法: .在IIS配置里面启用32位 ...
- 2019 汽车之家java面试笔试题 (含面试题解析)
本人3年开发经验.18年年底开始跑路找工作,在互联网寒冬下成功拿到阿里巴巴.今日头条.汽车之家等公司offer,岗位是Java后端开发,最终选择去了汽车之家. 面试了很多家公司,感觉大部分公司考察的点 ...
- eclipse中启动tomcat后, 无法访问localhost:8080
问题: 今天老师讲了Servlet路径问题, 做了个测试在eclipse中启动tomcat后,在浏览器地址栏输入 http://localhost8080无法访问, 提示404错误, 正常情况是可以访 ...
- C++STL—map的使用
最近写的一道题用到了STL中的map,这部分内容之前没有系统学过,这里就简单归纳一下吧. 资料来源: https://www.w3cschool.cn/cpp/cpp-fu8l2ppt.html ht ...