首页 理论教育 在Packer和Terraform中添加REX-Ray

在Packer和Terraform中添加REX-Ray

时间:2023-11-06 理论教育 版权反馈
【摘要】:我们已经尝试了REX-Ray的手动设置,所有将其添加到Packer和Terraform的配置中还是相对容易的。我们将不依赖运行时资源的静态部分加到Packer中,其余部分加到Terraform。这意味着,Packer将创建安装了REX-Ray的AMI,Terraform将创建它的配置并启动服务。Terraform很快就会用到该ID。然而,在本章开始时,我们需要一个带有REX-Ray的集群,而不想维护两个几乎一样的配置。让我们登录其中一个服务器并确认是否安装了REX-Ray:rexray version命令的输出如下:REX-Ray和libStorage都已经安装好。

在Packer和Terraform中添加REX-Ray

我们已经尝试了REX-Ray的手动设置,所有将其添加到Packer和Terraform的配置中还是相对容易的。我们将不依赖运行时资源的静态部分加到Packer中,其余部分加到Terraform。这意味着,Packer将创建安装了REX-Ray的AMI,Terraform将创建它的配置并启动服务。

让我们看看terraform/aws-full/packer-ubuntu-docker-rexray.json文件(https:// github.com/vfarcic/cloud-provisioning/blob/master/terraform/aws-full/packer-ubuntudocker-rexray.json):

与我们之前使用过的配置terraform/aws-full/packer-ubuntu-docker.json(https://github.com/vfarcic/cloud-provisioning/blob/master/terraform/aws-full/packer-ubuntu-docker.json)相比,唯一的区别是shell provisioner中多了一个命令:

当创建一个VM(稍后将成为AMI)时,Packer将执行与手动安装REX-Ray相同的命令。

让我们构建AMI:

我们构建了AMI并将ID存储在环境变量TF_VAR_swarm_ami_id中。Terraform很快就会用到该ID。

定义REX-Ray设置的Terraform部分要复杂一些,因为它的配置是动态的,是在运行时决定的。

配置定义在terraform/aws-ull/rexray.tpl模板中(https://github.com/vfarcic/ cloud-provisioning/blob/master/terraform/aws-full/rexray.tpl):

输出如下:

如你所见,AWS密钥、区域和安全组被定义为变量。神奇之处在terraform/ aws-full/common.tf文件中(https://github.com/vfarcic/cloud-provisioning/blob/master/ terraform/aws-full/common.tf):

输出的相关部分是template_file数据源。内容如下:

模板的内容位于之前讨论过的文件rexray.tpl中(https://github.com/vfarcic/ cloud-provisioning/blob/master/terraform/aws-full/rexray.tpl)。模板中的变量在vars部分定义。最后一个变量aws_security_group的值将在aws_security_group中的docker创建之后在运行时确定。

最后,拼图的最后一部分是terraform/aws-full/swarm.tf文件(https://github.com/vfarcic/cloud-provisioning/blob/master/terraform/aws-full/swarm.tf):

swarm-manager和swarm-worker AWS实例在remote-exec provisioner中都有额外两行。它们是:

命令在if语句中。这允许我们在运行时决定是否应该配置和启动REX-Ray。通常不需要if语句。你要么选择使用REX-Ray,要么不使用。然而,在本章开始时,我们需要一个带有REX-Ray的集群,而不想维护两个几乎一样的配置(一个有REX-Ray,另一个没有)。

重要的部分在if语句中。第一行将模板的内容放入/etc/rexray/config.yml中(https://github.com/vfarcic/cloud-provisioning/blob/master/terraform/aws-full/swarm.tf)。第二行用于启动服务。现在对在Terraform配置中如何定义REX-Ray已经清楚了,是时候用它自动创建集群了:

创建了初始化Swarm群集的第一个节点,可以再添加两个manager节点:

检索第一个manager的令牌和IP,并使用该信息创建其余节点。(www.xing528.com)

让我们登录其中一个服务器并确认是否安装了REX-Ray:

rexray version命令的输出如下:

REX-Ray和libStorage都已经安装好。最后,在检查它是否正常工作之前,让我们先看一下配置。

输出如下:

众所周知,我们隐藏了AWS账户的细节。尽管如此,配置看起来没有问题,可以试一下REX-Ray。

我们将部署vfarcic/docker-flow-proxy/docker-compose-stack.yml栈(https:// github.com/vfarcic/docker-flow-proxy/blob/master/docker-compose-stack.yml),并像手工安装REX-Ray时所做的那样创建jenkins服务:

只需几分钟,脚本就完成了。现在可以检查Docker卷:

输出如下:

正如预期的那样,jenkins服务使用相同的名字创建了rexray卷。我们应该等到Jenkins运行并在浏览器中打开它:

给Windows用户的说明

Git Bash可能无法使用open命令。如果是这样,则请执行terraform output swarm_manager_1_public_ip来查找manager的IP,并在你选择的浏览器中直接打开URL。例如,上面的命令应该替换为以下命令:

如果输出为1.2.3.4,则应该在浏览器中打开http://1.2.3.4/jenkins。

唯一剩下的就是恢复管理员的初始密码,并使用它来设置Jenkins:

剩下的事情就交给你了。完成设置,销毁容器,等待Swarm重新调度容器,确认状态被保留,等等。花点时间去试试这些。

除非你已经离不开Jenkins和REX-Ray了,否则请删除服务和卷。我们不再需要它了:

Prometheus、ElasticSearch和Mongo只是存储状态服务的几个例子。我们应该为所有这些加上REX-Ray挂载吗?不一定。有些有状态的服务已经有了保存其状态的机制。在REXRay挂载之前,应该先检查服务是否已经具有数据复制机制。

免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。

我要反馈