Skip to content

实战-terraform方式安装jenkins-20220625(测试成功)

实战:Terraform方式安装jenkins(博客分享-泽阳)-2022.6.25

image-20220414085747500

实验环境

bash
win10笔记本
1台虚机 centos7.9 vmworkstation 
jenkins/jenkins:2.332.2-centos7-jdk8
docker 20.10.11
Terraform v1.1.8

实验软件

链接:https://pan.baidu.com/s/15VlZHrinn9kiy8kf9nZkDw?pwd=caih 提取码:caih 2022.4.13-实验软件-使用TF来起一个jenkins容器

image-20220416231435863

前置条件

  • docker环境已安装(本次版本:20.10.11)

0、安装jdk环境

⚠️ 我们测试环境,是在一台虚机上跑了一个jenkins容器。但后面添加一个jenkins agent时,是将这个虚机作为其agent使用,因此这个虚机也要安装java环境的!!!

bash
(1)下载jdk软件
[root@devops ~]#wget https://mirrors.tuna.tsinghua.edu.cn/AdoptOpenJDK/8/jdk/x64/linux/OpenJDK8U-jdk_x64_linux_hotspot_8u322b06.tar.gz --no-check-certificate

image-20220414185032534

image-20220414185225338

bash
(2)配置jdk环境
[root@devops ~]#tar zxf OpenJDK8U-jdk_x64_linux_hotspot_8u322b06.tar.gz -C /usr/local/
[root@devops ~]#cd /usr/local/jdk8u322-b06/
[root@devops jdk8u322-b06]#pwd
/usr/local/jdk8u322-b06
[root@devops jdk8u322-b06]#vim /etc/profile
export JAVA_HOME=/usr/local/jdk8u322-b06
export PATH=$JAVA_HOME/bin:$PATH
[root@devops jdk8u322-b06]#source /etc/profile

(3)验证
[root@devops jdk8u322-b06]#java -version
openjdk version "1.8.0_322"
OpenJDK Runtime Environment (Temurin)(build 1.8.0_322-b06)
OpenJDK 64-Bit Server VM (Temurin)(build 25.322-b06, mixed mode)

1、安装Terraform

1、下载二进制包

https://www.terraform.io/downloads

image-20220412200555892

2、安装步骤

bash
(1)上传下载好的二进制包到服务器
[root@devops ~]#ll -h terraform_1.1.8_linux_amd64.zip 
-rw-r--r-- 1 root root 18M Apr 12 19:59 terraform_1.1.8_linux_amd64.zip
[root@devops ~]#unzip terraform_1.1.8_linux_amd64.zip 
Archive:  terraform_1.1.8_linux_amd64.zip
  inflating: terraform
[root@devops ~]#ll -h terraform

(2)移动二进制文件到PATH路径
-rwxr-xr-x 1 root root 61M Apr  8 00:54 terraform
[root@devops ~]#mv terraform /usr/local/bin/

(3)验证
[root@devops ~]#terraform version
Terraform v1.1.8
on linux_amd64

3、vscode想要对.tf文件语法的话,这里需要安装Terraform插件:

image-20220412202300625

image-20220412202356331

2、定义Jenkins容器的资源tf文件

1️⃣ 创建Jenkins数据目录

bash
[root@devops ~]#mkdir -p /data/devops4/jenkins_home
[root@devops ~]#chmod -R 777 /data/devops4/jenkins_home/

2️⃣ 定义Jenkins容器的资源tf文件

在devops目录下创建如下2个文件:

jenkins.tf

terraform
### 定义docker镜像(jenkins.tf)
resource "docker_image" "jenkins" {
  name         = "jenkins/jenkins:2.332.2-centos7-jdk8"
  keep_locally = true  //资源销毁后不会删除本地镜像
}

resource "docker_container" "jenkins" {
  image = docker_image.jenkins.name
  name  = "devops_tutorial"
  ports {
    internal = 8080
    external = 8080
  }
  ports {
      internal = 50000
      external = 50000
  }

  volumes{
      container_path = "/var/jenkins_home"
      host_path = "/data/devops4/jenkins_home" //这个目录要提前在主机里进行创建
  }
}

main.tf

terraform
# 定义provider(main.tf)
terraform {
  required_providers {
    docker = {
      source = "kreuzwerker/docker"
      version = "~> 2.13.0"
      }
  }
}

provider "docker" {}

3、terraform init 初始化

bash
[root@devops remote-vscode]#terraform init

image-20220414084938622

4、terraform plan 预览

bash
[root@devops remote-vscode]#terraform plan

image-20220414085011712

5、terraform apply 部署

bash
[root@devops remote-vscode]#terraform apply

image-20220414085052383

6、验证

bash
[root@devops remote-vscode]#docker ps |grep jenkins

image-20220414085145859

http://172.29.9.101:8080/

image-20220414085225027

注意事项

📍 注意:trraform的目录结构(providers)

image-20220505102951479

image-20220505103043206

📍 什么是Terraform?

Teffraform:基础设施即代码!

IaC:基础设施即代码。

现在,基本什么都代码,配置即代码,基础设置即代码;

bash
管理docker容器
	- docker命令
	- docker-compose
	- 本地用tf来管理docker环境: tf有一个provider,一个插件,它是支持管docker的。所以,我们后面一个tf模板就把整个实验环境就跑起来了,最终可以一键拉起来。
	
但是TF比较厉害,它的插件支持k8s,就是你不想使用yaml来管理k8s里的资源,那么TF也是可以通过插件来管理k8s里的资源的。此时,就行就需要你来写Tf的provider插件来着,但是还是yaml好使。

这个TF太牛了!!(tf:管理你的基础设施的。)
但这个工具也存在一定的危险性,我可以一键去创建,也可以一键去销毁。
老师大力推荐!

📍 ansible和terraform的区别?

答:ansible和TF他们不是一个级别的东西: TF它管理的是你的服务器,其实TF主要是针对这个云供应商的,创建这些机器、网络、vpc…… ansible是实现基础设置之上的,应用部署这块的; 他两之间可以结合去用;

📍 待提问:provider "docker" {……} 2375端口问题

image-20220412201923930

如果是本机的话,provider "docker" {……}这里可以省略!

🍀 老师这里有监听到这个包2375端口,但是为什么我自己的没有呢?但是可以可以成功部署jenkins容器。

老师说是docker服务默认监听的端口。。。。;😥

老师现象:

image-20230921084156036

自己现象:

image-20220416101003652

📍 搁置问题:如何在terraform里添加env,老师当时添加时报错了。。。

image-20220412215808332

📍 这个terraform网站是真的慢。。。

image-20220412213831635

📍 terraform命令

bash
terraform init  初始化
terraform plan 预览 //看下它的变更
terraform apply 部署

🍀 初始化

bash
terraform init

image-20220412210533578

插件下载后存放位置:

image-20220412211501990

🍀 预览

bash
terraform plan

image-20220412211629951

image-20220412211710758

🍀 部署

bash
terraform apply

image-20220412211745866

image-20220412211840282

⚠️ 可以指定单个文件来来部署:

image-20220605093308741

🍀 销毁资源命令

bash
terraform destroy

image-20220412210437676

📍 terraform使用方法

registry.terraform.io是terraform的仓库

image-20220412204044454

点击Browse Provider

image-20220412204132272

搜索docker

image-20220412204221416

image-20220412204251325

image-20220412204316200

使用文档:

image-20220412204405864

📍 测试:测试使用terraform命令销毁容器后,宿主机上的数据还在吗?-2022.5.5

bash
terraform destroy

🍀 测试问题

  1. 使用terraform命令销毁容器后,宿主机上的数据还在吗
  2. 如果在的话,那么如果更新了gitlab.tf文件后,再次执行terraform apply后,需要提前删除宿主机上持久上的数据吗?-->猜测:应该是不需要的!

🍀 已经部署成功的gitlab实例

image-20220505094539389

image-20220505094551797

image-20220505094623822

查看下宿主机上持久了gitlab容器的目录:

image-20220505094725739

可以看到,当前是存在数据的!

🍀 此时,直接销毁刚才那个gitlab.tf那个资源

image-20220505094852590

image-20220505094915856

🍀 验证

可以看到之前创建的资源被删除了,但是持久到宿主机上的数据都还在;

image-20220505095005390

image-20220505095039951

📍 注意:如果镜像很大,可先用docker拉取下下来,再执行terraroem命令!

image-20220505100138221

image-20220505100125352

📍 测试:使用terradorm安装时应该不需要先在宿主机上创建相应目录把…?

image-20220524074010285

  • 开始测试:

image-20220524074834654

image-20220524074845484

  • 总结:

奇怪,没有自动在宿主机上创建相应应用目录,也是可以把这个应用跑起来的!!!

这个就感觉有点奇怪了……

之前的应用都是有手动创建宿主机上目录的;

image-20220524075037673

image-20220524075050585

本次就先放这里吧,作为一个遗留问题,后续统一学习terradrom时再研究;

📍 方法:terraform里这种用法!

image-20220524081646990

yaml
locals {
  volumes = [
    {
      container_path = "/data/devops4/sonarqube/sonarqube_conf"
      host_path      = "/opt/sonarqube/conf"
    },
    {
      container_path = "/data/devops4/sonarqube/sonarqube_extensions"
      host_path      = "/opt/sonarqube/extension"
    },
    {
      container_path = "/data/devops4/sonarqube/sonarqube_logs"
      host_path      = "/opt/sonarqube/logs"
    },
    {
      container_path = "/data/devops4/sonarqube/sonarqube_data"
      host_path      = "/opt/sonarqube/data"
    }
  ]
}

resource "docker_image" "sonar" {
  name         = "sonarqube:8.9.8-community"
  keep_locally = true //销毁时不删除本地镜像
}

resource "docker_container" "sonarqube" {
  image = docker_image.sonar.name
  name  = "sonarqube"
  ports {
    internal = 9000
    external = 9000
  }

  dynamic "volumes" {
    for_each = local.volumes
    content {
      container_path = volumes.value["container_path"]
      host_path      = volumes.value["host_path"]
    }
  }
}

关于我

我的博客主旨:

  • 排版美观,语言精炼;
  • 文档即手册,步骤明细,拒绝埋坑,提供源码;
  • 本人实战文档都是亲测成功的,各位小伙伴在实际操作过程中如有什么疑问,可随时联系本人帮您解决问题,让我们一起进步!

🍀 微信二维码 x2675263825 (舍得), qq:2675263825。

image-20230107215114763

🍀 微信公众号 《云原生架构师实战》

image-20230107215126971

🍀 个人博客站点

http://47.97.48.237/ (即将上线域名:onedayxyy.cn)

image-20230917111843405

🍀 语雀

https://www.yuque.com/xyy-onlyone

image-20230912072007284

🍀 csdn https://blog.csdn.net/weixin_39246554?spm=1010.2135.3001.5421

image-20230107215149885

🍀 知乎 https://www.zhihu.com/people/foryouone

image-20230107215203185

最后

好了,关于本次就到这里了,感谢大家阅读,最后祝大家生活快乐,每天都过的有意义哦,我们下期见!

最近更新