IaC基础设施即代码:Terraform 使用 dynamic动态内联块 创建docker资源

目录

 一、实验

1.环境

2.Terraform查看版本

3.Linux主机安装Docker

4.Terraform使用本地编译(In-house)的Providers

5.Docker-CE 开启远程API

6. Linux主机拉取镜像

7.Terraform 使用 dynamic动态内联块 创建资源

二、问题

 1.Terraform 计划资源失败 (无效provider)

2.Terraform 申请资源失败 (端口占用)


 一、实验

1.环境

(1)主机

表1-1 主机

主机系统软件备注
pipepointLinuxTerraform 1.6.6

2.Terraform查看版本

(1)查看Terraform版本

terraform -v

3.Linux主机安装Docker

(1)安装Docker

① 阿里云镜像加速将XXXXXXXX改为自己的即可( "https://XXXXXXXX.mirror.aliyuncs.com",)

1)安装
yum -y install wget && wget https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo -O /etc/yum.repos.d/docker-ce.repo
yum -y install docker-ce2)配置cgroup驱动及镜像下载加速器:
cat > /etc/docker/daemon.json << EOF
{"exec-opts": ["native.cgroupdriver=systemd"],"registry-mirrors": ["https://XXXXXXXX.mirror.aliyuncs.com","https://registry.docker-cn.com","https://docker.mirrors.ustc.edu.cn","https://dockerhub.azk8s.cn","http://hub-mirror.c.163.com"]
}
EOF3)自启动
systemctl enable docker && systemctl start docker && systemctl status docker && docker info|grep systemd

② 安装docker

③ 配置镜像加速

④ 开机自启动服务

(2)查看版本

docker -v

4.Terraform使用本地编译(In-house)的Providers

(1)编写配置文件

vim .terraformrcprovider_installation {filesystem_mirror {path    = "/usr/share/terraform/providers"include = ["registry.terraform.io/*/*"]}
}

(2)Terraform模板(docker)

Terraform Registry

USE PROVIDER

terraform {required_providers {docker = {source = "kreuzwerker/docker"version = "3.0.2"}}
}provider "docker" {# Configuration options
}

Example Usage

terraform {required_providers {docker = {source  = "kreuzwerker/docker"version = "3.0.2"}}
}provider "docker" {host = "unix:///var/run/docker.sock"
}# Pulls the image
resource "docker_image" "ubuntu" {name = "ubuntu:latest"
}# Create a container
resource "docker_container" "foo" {image = docker_image.ubuntu.image_idname  = "foo"
}

(3) 下载软件包

https://github.com/kreuzwerker/terraform-provider-docker/releases

(4) 创建目录

mkdir -p  /usr/share/terraform/providers/registry.terraform.io/kreuzwerker/docker/3.0.2/linux_amd64

(5)解压软件包

unzip terraform-provider-docker_3.0.2_linux_amd64.zip

(6)tree递归查看目录 (将软件包按递归目录放置)

tree -s /usr/share/terraform/

5.Docker-CE 开启远程API

(1)修改配置文件

vim /usr/lib/systemd/system/docker.service
……
ExecStart=/usr/bin/dockerd --containerd=/run/containerd/containerd.sock -H tcp://0.0.0.0:2375 -H unix://var/run/docker.sock  -H fd://
……

(2)重新加载配置及重启服务

systemctl daemon-reload  && systemctl restart docker

(3)测试API

curl http://127.0.0.1:2375/version

6. Linux主机拉取镜像

(1)dockerhub 查看镜像

https://hub.docker.com/r/jenkins/jenkins

docker pull jenkins/jenkins

(2)拉取镜像

docker pull jenkins/jenkins

(3)查看镜像

docker images

7.Terraform 使用 dynamic动态内联块 创建资源

(1)查看目录

tree -s ~/tf-meta/dynamic/

(2)主配置文件

main.tf,  Docker Provider用于与 Docker 容器和镜像进行交互,它使用 Docker API 来管理 Docker 容器的生命周期。

vim main.tfprovider "docker" {host = "tcp://127.0.0.1:2375"
}resource "docker_image" "jenkins" {name         = "jenkins/jenkins:latest"keep_locally = true //销毁时不删除本地镜像
}locals {jenkins_ports = [ {   internal = 8085external = 8085},  {   internal = 50000external = 50000}   ]
}resource "docker_container" "jenkins" {image = docker_image.jenkins.namename  = "jenkins123"user  = "root"dynamic "ports" {for_each = local.jenkins_portscontent {internal = ports.value.internalexternal = ports.value.externalip       = "0.0.0.0"protocol = "tcp"}   }volumes {container_path = "/var/jenkins_home"host_path      = "/tmp/jenkinshome"}depends_on = [ docker_image.jenkins]
}

(3)版本配置文件

versions.tf

vim versions.tfterraform {required_providers {docker = { source  = "kreuzwerker/docker"version = "3.0.2"}   }
}

(4) 格式化代码

terraform fmt

(5) 初始化

terraform init

(6) 验证

terraform validate

(7)计划与预览

 terraform plan

(8) 申请资源

terraform apply

yes

(9)展示资源

terraform show

(11)查看docker进程

docker ps

(12) 检查容器

 docker inspect 924c951bff60

(13)查看容器日志

docker logs -f jenkins123

(14) 查看监听端口

http://192.168.204.233:50000/

(15) 销毁资源

terraform destroy

yes

(16) 查看docker进程

docker ps

资源已删除

二、问题

 1.Terraform 计划资源失败 (无效provider)

(1)报错

Planning failed. Terraform encountered an error while generating this plan.?
│ Error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
│ 
│   with provider["registry.terraform.io/kreuzwerker/docker"],
│   on main.tf line 1, in provider "docker":
│    1: provider "docker" {

Planning failed. Terraform encountered an error while generating this plan.╷
│ Error: Invalid provider configuration
│ 
│ Provider "registry.terraform.io/kreuzwerker/docker" requires explicit configuration. Add a provider block to the root module and configure the provider's
│ required arguments as described in the provider documentation.
│ 
╵
╷
│ Error: Error pinging Docker server: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?
│ 
│   with provider["registry.terraform.io/kreuzwerker/docker"],
│   on <empty> line 0:
│   (source code not available)

(2)原因分析

未配置docker的provider

(3)解决方法

配置docker的provider

成功

2.Terraform 申请资源失败 (端口占用)

(1)报错

申请容器为8080端口


│ Error: Unable to start container: Error response from daemon: driver failed programming external connectivity on endpoint jenkins123 (7b6aea49d069b5eb7693528fd8754026960ea22381ec2ccc2927a0029709d552): Error starting userland proxy: listen tcp4 0.0.0.0:8080: bind: address already in use
│ 
│   with docker_container.jenkins,
│   on main.tf line 23, in resource "docker_container" "jenkins":
│   23: resource "docker_container" "jenkins" {

申请容器为8081端口

Error: Unable to start container: Error response from daemon: driver failed programming external connectivity on endpoint jenkins123 (31e491b5ce1eeaf0e4a87864d694073f67c470f4f1b7fd41f6ec5e5a48353934): Error starting userland proxy: listen tcp4 0.0.0.0:8081: bind: address already in use
│ 
│   with docker_container.jenkins,
│   on main.tf line 23, in resource "docker_container" "jenkins":
│   23: resource "docker_container" "jenkins" {

(2)原因分析

端口被占用。

(3)解决方法

查看当前占用端口命令。

netstat -tanlp

方法一:杀死进程(注意不是杀死端口,而是pid的端口)

8080 端口的进程为64353

8081端口的进程为63265

kill 64353进程 (自己的pid端口)kill 63265进程 (自己的pid端口)

方法二:(这里采用此方法)

更改Terraform配置文件端口为8085。

成功

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/634344.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL 8.0中已过时的选项和变量

以下系统变量、状态变量和选项在 MySQL 8.0 版本中已过时&#xff1a; 以下系统变量、状态变量和选项在 MySQL 8.0 版本中已被废弃。 • Compression&#xff1a;客户端连接是否使用压缩的客户端/服务器协议。在 MySQL 8.0.18 版本中废弃。 • Slave_open_temp_tables&#x…

精品基于Uniapp+springboot校园学校趣事管理系统app

《[含文档PPT源码等]精品基于Uniappspringboot趣事管理系统app》该项目含有源码、文档、PPT、配套开发软件、软件安装教程、项目发布教程、包运行成功&#xff01; 软件开发环境及开发工具&#xff1a; 开发语言&#xff1a;Java 后台框架&#xff1a;springboot、ssm 安卓…

Webpack5入门到原理2:基本使用

Webpack 是一个静态资源打包工具。 它会以一个或多个文件作为打包的入口&#xff0c;将我们整个项目所有文件编译组合成一个或多个文件输出出去。 输出的文件就是编译好的文件&#xff0c;就可以在浏览器段运行了。 我们将 Webpack 输出的文件叫做 bundle。 功能介绍 Webp…

Unity vs Godot :哪个游戏引擎更适合你?

Unity vs Godot &#xff1a;哪个游戏引擎更适合你&#xff1f; 游戏引擎的选择对开发过程和最终产品质量有着重大影响。近年来&#xff0c;Godot和Unity这两款引擎受到广泛关注。本文将从多个维度对两者进行比较&#xff0c;以期为开发者提供正确的选择建议。 Godot和Unity都有…

Backtrader 文档学习-Indicators混合时间框架

Backtrader 文档学习-Indicators混合时间周期 1.不同时间周期 如果数据源在Cerebro引擎中具有不同的时间范围和不同的长度&#xff0c;指示器将会终止。 比如&#xff1a;data0是日线&#xff0c;data1是月线 。 pivotpoint btind.PivotPoint(self.data1) sellsignal self…

IMDB电影评论的情感分析——paddle

项目地址&#xff1a;IMDB电影评论的情感分析 - 飞桨AI Studio星河社区 (baidu.com) 1. 实验介绍 1.1 实验目的 理解并掌握循环神经网络的基础知识点&#xff0c;包括模型的时序结构、模型的前向传播、反向传播等掌握长短时记忆网络LSTM和门控循环单元网络GRU的设计原理熟悉如…

Halcon基于形变的模板匹配

Halcon基于形变的模板匹配 形变分为两种&#xff0c;一种是基于目标局部的形变&#xff0c;另一种是由于透视关系而产生的形变。基于形变的模板匹配也是一种基于形状的匹配方法&#xff0c;但不同的是&#xff0c;其返回结果中不仅包括轻微形变的形状.形变的位置和参数&#x…

Node.js基础知识点(五)- http

一.request 请求事件处理函数 var http require(http)var server http.createServer() request 请求事件处理函数&#xff0c;需要接收两个参数&#xff1a; Request 请求对象 请求对象可以用来获取客户端的一些请求信息&#xff0c;例如请求路径 Response 响应对象 响应对…

神器yakit之web fuzzer功能

前言 yakit并不像burp一样单独设置爆破模块&#xff0c;但是yakit也是可以爆破的&#xff0c;并且更好用&#xff08;个人感觉&#xff09;。 手工测试场景中需要渗透人员对报文进行反复的发送畸形或者特定的payload进行查看服务器的反馈并以此来进行下一步的判断。 Fuzz标签便…

Verilog基础:强度建模(二)

相关阅读 Verilog基础https://blog.csdn.net/weixin_45791458/category_12263729.html?spm1001.2014.3001.5482 三、拥有单个强度和确定值的net型信号的线与组合&#xff08;线网多驱动&#xff09; 首先来说明一下什么叫信号拥有单个强度和确定值&#xff0c;其实如果一个ne…

开箱即用之MyBatisPlus XML 自定义分页

调用方法 import com.baomidou.mybatisplus.extension.plugins.pagination.Page;public Page<User> queryListByPage(User user) { Page<User> page new Page<>(1, 12); return userMapper.queryListByPage(page, user); } mapper接口 import co…

Vue中的日历组件 Calendar 实现 考勤打卡记录

日历组件 Calendar 可以自定义在页面添加内容。 实现效果图 1.由于Calendar没有右上角月份切换的API事件&#xff0c;可以给组件源码添加自定义添加一个事件 2.也可以通过自带的input事件来获取日历 3.vue页面完整代码 注释&#xff1a;this.$m(this.beginTime).format(…

手撕java必备

刚需import import java.util.Scanner; import java.util.Arrays; import java.util.LinkedList; import java.util.Queue; import java.util.ArrayList; import java.util.List; import java.lang.System; import java.io.*; import java.util.*; input场景 场景一&#…

Halcon 一维测量

文章目录 算子矩形算子弧形算子移动到新的参考点 Halcon 案例测量保险丝的宽度&#xff08;边缘对测量&#xff09;使用助手进行测量 halcon 案例获取芯片引脚的个数平均宽度距离&#xff0c;连续两个边缘的距离&#xff08;measure_pos &#xff09;halcon 定位测量Halcon 测量…

科普:大语言模型中的量化是什么意思?

大语言模型是指能够处理大规模文本数据的深度学习模型&#xff0c;例如GPT-3、BERT等。这些模型通常有数十亿甚至数百亿个参数&#xff0c;占用大量的存储空间和计算资源。为了提高这些模型的效率和可移植性&#xff0c;一种常用的方法是模型量化。 1&#xff1a;什么是模型量化…

代码随想录算法训练营第三十七天|738.单调递增的数字、968.监控二叉树、总结

题目&#xff1a;738.单调递增的数字 文章链接&#xff1a;代码随想录 视频链接&#xff1a;LeetCode:738.单调递增的数字 题目链接&#xff1a;力扣题目链接 图释&#xff1a; 从后向前遍历&#xff0c;当后一位数大于前一位位数时&#xff0c;前一位数减减&#xff0c;后…

Java基础面试题-2day

面向对象 创建一个对象用什么运算符&#xff0c;对象实体和对象引用有什么不同&#xff1f; 创建对象使用new String A new String(); A即为对象引用&#xff0c;通过new运算符&#xff0c;创建String()类型的对象实体。 对象引用的存储位置在栈内存 对象实体的存储位置在堆…

【算法】使用优先级队列(堆)解决算法题(TopK等)(C++)

文章目录 1. 前言2. 算法题1046.最后一块石头的重量703.数据流中的第K大元素 2.5 如何选择大根堆 与 小根堆&#xff1f; 为什么选择大根堆&#xff08;小根堆&#xff09;&#xff1f;692.前K个高频单词295.数据流的中位数 1. 前言 我们知道&#xff1a;优先级队列是一种常用…

Maven 基础安装配置及使用

大家好我是苏麟 , 今天聊聊Maven . Maven Maven , 是Apache公司下基于Java开发的开源项目 . 我们构建一个项目需要用到很多第三方的类库&#xff0c;需要引入大量的jar包。一个项目Jar包的数量之多往往让我们瞠目结舌&#xff0c;并且Jar包之间的关系错综复杂&#xff0c;一…

高并发缓存问题分析以及分布式锁的实现

一,场景概述: 在高并发的环境下,比如淘宝,京东不定时的促销活动,大量的用户访问会导致数据库的性能下降,进而有可能数据库宕机从而不能产生正常的服务,一般一个系统最大的性能瓶颈&#xff0c;就是数据库的io操作,如果发生大量的io那么他的问题也会随之而来。从数据库入手也是…