首页 文章 精选 留言 我的

精选列表

搜索[一键安装包],共10000篇文章
优秀的个人博客,低调大师

​微软开源 TRELLIS.2,一键将图片转为高精度 3D 模型

微软正式开源了其最新的图像到3D 模型生成工具 ——TRELLIS.2。 该工具在生成高质量、带材质的3D 模型方面表现出色,仅需输入一张图片,便可迅速生成可供 Blender、Unity、Unreal 等平台使用的.glb 格式三角形网格文件。 TRELLIS.2使用了一种名为4B 的模型,能够处理分辨率在512³ 到1536³ 之间的图像。在 NVIDIA H100显卡的支持下,生成512³ 分辨率的3D 模型仅需约3秒,1024³ 分辨率的模型则需约17秒,而生成1536³ 分辨率的模型则约需1分钟。 TRELLIS.2不仅能生成3D 模型,还附带了 PBR 四件套贴图,包括颜色、粗糙度、金属度和透明度,这些特性对于电商场景尤为重要。商家只需拍摄产品图片,上传至 TRELLIS.2,即可在1分钟内获得适合上架的3D 模型,大幅简化了电商产品展示的流程。

优秀的个人博客,低调大师

Visual Studio 的中一键打开当前代码 Gitee.com 的 Web 页面

Open on GitHub 是一个Visual Studio 的扩展, 用于将当前编辑器中的代码在托管网站上打开, 目前支持 GitHub, GitLab, Gitea,Gitee, Bitbucket 和AzureDevOps (dev.azure.com, visualstudio.com, tfs) 在编辑器中右键, 如果仓库托管在 前面提到的网站上, 你可以跳转至 master/当前分支/当前版本的在线代码查看页面,如果在编辑器中选择了行或区域, 将会跳转至指定指定代码所在的页面位置。 从 2.0.4 版本开始 ,开始支持了 Gitee。 详情了解 https://github.com/neuecc/Open-on-GitHub/releases/tag/2.0.4 如何安装? 1. 打开VS扩展商店https://marketplace.visualstudio.com/items?itemName=neuecc.OpenonGitHub 2. VS的扩展管理中搜索Open on GitHub 并安装。

优秀的个人博客,低调大师

一键生成数据库文档,堪称数据库界的Swagger

本文收录在 GitHub 地址 https://github.com/chengxy-nds/Springboot-Notebook 最近部门订单业务调整,收拢其他业务线的下单入口,做个统一大订单平台。需要梳理各业务线的数据表,但每个业务线库都有近百张和订单相关的表,挨个表一个一个字段的弄脑瓜子嗡嗡的。 为了不重复 CV 操作,抱着一丝希望开始在GitHub里找,看看有没有什么工具可以用,结果就真的发现了宝藏,screw(螺丝钉),居然可以生成数据库文档,优秀啊~。 一、数据库支持 [x] MySQL [x] MariaDB [x] TIDB [x] Oracle [x] SqlServer [x] PostgreSQL [x] Cache DB 二、配置 1、pom文件 引入screw核心包,HikariCP数据库连接池,HikariCP号称性能最出色的数据库连接池。 <!-- screw核心 --> <dependency> <groupId>cn.smallbun.screw</groupId> <artifactId>screw-core</artifactId> <version>1.0.3</version> </dependency> <!-- HikariCP --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.4.5</version> </dependency> <!--mysql driver--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> 2、配置数据源 配置数据源,设置 useInformationSchema 可以获取tables注释信息。 spring.datasource.url=jdbc:mysql://45.93.1.5:3306/fire?useUnicode=true&characterEncoding=UTF-8&useSSL=false spring.datasource.username=root spring.datasource.password=123456 spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver spring.datasource.xa.properties.useInformationSchema=true 3、screw 核心配置 screw有两种执行方式,第一种是pom文件配置,另一种是代码执行。 <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> <plugin> <groupId>cn.smallbun.screw</groupId> <artifactId>screw-maven-plugin</artifactId> <version>1.0.3</version> <dependencies> <!-- HikariCP --> <dependency> <groupId>com.zaxxer</groupId> <artifactId>HikariCP</artifactId> <version>3.4.5</version> </dependency> <!--mysql driver--> <dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <version>8.0.20</version> </dependency> </dependencies> <configuration> <!--username--> <username>root</username> <!--password--> <password>123456</password> <!--driver--> <driverClassName>com.mysql.cj.jdbc.Driver</driverClassName> <!--jdbc url--> <jdbcUrl>jdbc:mysql://41.92.6.5:3306/fire</jdbcUrl> <!--生成文件类型--> <fileType>HTML</fileType> <!--打开文件输出目录--> <openOutputDir>false</openOutputDir> <!--生成模板--> <produceType>freemarker</produceType> <!--文档名称 为空时:将采用[数据库名称-描述-版本号]作为文档名称--> <!--<docName>测试文档名称</docName>--> <!--描述--> <description>数据库文档生成</description> <!--版本--> <version>${project.version}</version> <!--标题--> <title>fire数据库文档</title> </configuration> <executions> <execution> <phase>compile</phase> <goals> <goal>run</goal> </goals> </execution> </executions> </plugin> </plugins> </build> 配置完以后在 maven project->screw 双击执行ok。 代码生成方式也非常简单。 @SpringBootTest public class ScrewApplicationTests { @Autowired ApplicationContext applicationContext; @Test void contextLoads() { DataSource dataSourceMysql = applicationContext.getBean(DataSource.class); // 生成文件配置 EngineConfig engineConfig = EngineConfig.builder() // 生成文件路径,自己mac本地的地址,这里需要自己更换下路径 .fileOutputDir("D:/") // 打开目录 .openOutputDir(false) // 文件类型 .fileType(EngineFileType.HTML) // 生成模板实现 .produceType(EngineTemplateType.freemarker).build(); // 生成文档配置(包含以下自定义版本号、描述等配置连接) Configuration config = Configuration.builder() .version("1.0.3") .description("生成文档信息描述") .dataSource(dataSourceMysql) .engineConfig(engineConfig) .produceConfig(getProcessConfig()) .build(); // 执行生成 new DocumentationExecute(config).execute(); } /** * 配置想要生成的表+ 配置想要忽略的表 * * @return 生成表配置 */ public static ProcessConfig getProcessConfig() { // 忽略表名 List<String> ignoreTableName = Arrays.asList("a", "test_group"); // 忽略表前缀,如忽略a开头的数据库表 List<String> ignorePrefix = Arrays.asList("a", "t"); // 忽略表后缀 List<String> ignoreSuffix = Arrays.asList("_test", "czb_"); return ProcessConfig.builder() //根据名称指定表生成 .designatedTableName(Arrays.asList("fire_user")) //根据表前缀生成 .designatedTablePrefix(new ArrayList<>()) //根据表后缀生成 .designatedTableSuffix(new ArrayList<>()) //忽略表名 .ignoreTableName(ignoreTableName) //忽略表前缀 .ignoreTablePrefix(ignorePrefix) //忽略表后缀 .ignoreTableSuffix(ignoreSuffix).build(); } } 4、文档格式 screw 有 HTML、DOC、MD 三种格式的文档。 代码中的修改 .fileType(EngineFileType.HTML) 或者pom文件 <fileType>MD</fileType> DOC文档样式 HTML文档样式 MD文档样式 不得不说这个工具是真TM好用,提前完成任务,有点傲娇有木有! 整理了几百本各类技术电子书,送给小伙伴们。关注公号回复【666】自行领取。和一些小伙伴们建了一个技术交流群,一起探讨技术、分享技术资料,旨在共同学习进步,如果感兴趣就加入我们吧! 无论你是刚入行、还是已经有几年经验的程序员,相信这份面试提纲都会给你不少助力,长按二维码关注 『 程序员内点事 』 ,回复 『 offer 』 自行领取,祝大家 offer 拿到手软

优秀的个人博客,低调大师

OpenYurt 开箱测评 | 一键让原生 K8s 集群具备边缘计算能力

作者| 郑超 阿里云高级开发工程师 随着物联网技术以及 5G 技术的高速发展,将云计算的能力延伸至边缘设备端,并通过中心进行统一交付、管控,已成为云计算的重要发展趋势。为服务更多开发者把握这一趋势,5 月 29 日,阿里巴巴正式对外开源了基于 ACK@Edge(边缘集群托管服务)的云原生边缘计算框架—— OpenYurt。 自 OpenYurt 开源以来受到了开发者的关注,今天这篇文章将带大家快速上手 OpenYurt ,介绍如何使用 OpenYurt 提供的命令行管理工具 Yurtctl, 高效快速地部署 OpenYurt 集群。 OpenYurt 介绍 OpenYurt 主打“云边一体化”概念,依托 Kubernetes 强大的容器应用编排能力,满足了云-边一体化的应用分发、交付、和管控的诉求。相较于其他基于 Kubernetes

优秀的个人博客,低调大师

混合云容灾服务之本地恢复功能如何助力“云备胎”一键转正

前文 介绍了如何利用阿里云的混合云容灾服务对本地的数据中心做保护,并在本地虚拟机出现故障的时候以秒级RPO,分钟级RTO在阿里云ECS上进行恢复。但是对于对于一个完整的容灾场景来讲,云上恢复出来的ECS只能算是一个“云备胎”,只有把这个“云备胎”转正回到用户本地,才算是一次真正的“灾难恢复”。本文主要介绍如何在VMware虚拟化环境(vSphere)中,利用阿里云关键业务型容灾(Business Critical Disaster Recovery, BCDR)服务,把本地虚拟机出现问题后在云上恢复出来的ECS回切到本地的vCenter中。 环境准备 先参照前文 ,在vCenter中部署一台BCDR 容灾网关,并在一台被保护的Windows服务器上安装复制程序,启动复制: 模拟本地故障,启动云上恢复 在进入实时复制的阶段后,直接把被保护服务器电源关闭,我们可以立刻在控制台上看到一个异常的状态: 此时点击“故障切换”: 恢复点选择默认的“当前时间”即可: 等待几分钟后,可以看到恢复的ECS已经成功拉起,可以通过下图到ECS详情页的链接去检查机器的状态: 确认无误后,点击“完成故障切换”,清理掉复制相关的数据: “云备胎”本地恢复(failback) 在我们确认本地的环境正常可以把恢复出来的ECS回切的时候,点击“反向注册”: 然后在“站点对信息”的tab下,点击添加计算平台: 输入要恢复到的vCenter的地址以及一个有足够权限的用户名和密码: 添加成功后,我们在受保护服务器页面启动反向复制,并配置相应的复制信息: 需要注意的是,复制存储(Datastore)和复制网络(Network)的选择是依赖于计算资源的,而计算资源(Compute Resource)的选择是依赖于复制位置(Location)所在的Datacenter,这一过程和利用vSphere client创建虚拟机是几乎一一对应的,熟悉vSphere的同学对这个过程肯定会非常熟悉 在进入“反向实时复制”的阶段后,我们就可以随时进行转正(恢复)操作了: 耐心等待几分钟看到故障恢复完成后,就可以去vCenter里检查已经转正的“备胎”啦: 闭环 当然,这个时候我们在确认恢复成功了之后,可以继续把它保护起来(复制到云上): 这样,我们就回到了一个最初的保护状态(本地->云上),形成了一个完整的闭环,就再也不用担心本地出现故障导致业务长时间中断造成的损失了!

优秀的个人博客,低调大师

利用Packer和Terraform,一键创建即拿即用的迷你并行计算集群

俗话说的话,没有完整使用过ECS产品的程序员不是好的程序员(好吧,其实是我说的)。当然,控制台操作或者用OpenAPI也没有必要去写一篇文章,所以那就来点儿有意思的。我们来说说,怎么用Packer和Terraform,这两个开源基础架构自动化编排工具,来快速搭建一个即拿即用的迷你并行计算集群(当然,这里的并行计算集群的网络知识普通的以太网互联啦)。 暂时先不说Packer和Terraform这两个工具到底是干什么的,我们先来看看一个迷你并行计算集群应该具备的条件是什么,然后从这个角度出发,具体说明怎么使用这两个工具,快速构建,开箱即用。 一、迷你并行计算集群条件: 集群中包括一台以上的计算节点 集群中的任意两个节点间SSH可以免密登录且不需要远程SSH主机的公钥检查 所有节点之间有共享目录(如,基于NFS) 只有一个节点作为跳板机提供公网出口IP,其他节点不提供公网出口IP,只使私有IP互联 每个节点上包含一些基本的软件或者库(如用于搭建NFS服务的rpc,nfs包,以及基本的并行计算库,如openMPI库等) 只要满足了以上这五点,你就可以用这个计算机群去跑一些简单的并行计算任务啦,比如说一些简单的MPI应用,一个开箱即用,用完销毁的并行计算集群对于一个MPI应用的测试和开发都是非常方便的。 二、说说Packer与Terraform两兄弟: Packer和Terraform是两个很流行的用于云上基础设施管理的自动化工具。更直接的说法就是“基础设施即代码(Infrastracture as Code)”,通过代码的方式来管理基础设施从构建到销毁整个生命周期。 Packer:为快速制作镜像而生 Packer通过一个模板文件来创建基于云平台一致的自定义镜像,通过用户定义的个性化镜像,实现快速创建新的虚拟机运行实例。就和Docker中的Dockerfile类似,通过文件的方式来定义一个自定义镜像,并且Packer可以帮助用户去验证镜像可用性。 Packer的工作流程很简单: 先启动实例 上传并运行用户的脚本或者通过其他Puppet/Chef配置管理工具,定制实例的环境 对实例打快照 最后再根据快照生成镜像。 有了Packer做的镜像之后,当然就是在用这个镜像来创建可用的实例啦。 Terraform:为把控云服务生命周期而生 操作云服务,其中一种方法就是利用云平台提供的各类API来进行操作,这个时候Terraform出现了,他的出现帮助你省去了写大量复杂的操作云平台代码的过程,取而代之的是通过目的式的操作,通过模板编排的方法,维护了一份云服务状态的模板,而不需要在意到底用什么API命令来做到。 三、进入实战环节 关于Packer和Terraform的安装,十分简单,自行google即可。 1.创建免密登录且不需要远程SSH主机的公钥检查的基础镜像 对于MPI程序来说,比较重要的一点就是主机间需要SSH免密登录(因为MPI程序在启动的时候需要主机间的免密登录)。所以这里先简单科普一下SSH的两种登录机制。一个是口令机制(即用密码登录),另一个是公钥机制。两种机制本质都是利用了不对称加密机制中公钥加密私钥解密原理,不同点就是谁用谁的公钥加密什么东西,听起来似乎有点儿绕,那我这么来解释,假设现在有两个机器,机器A使用SSH登录到机器B: 口令机制:认证过程是,A用B的公钥加密登录密码,并发给B,B用其自己的私钥解密,核对密码正确性。下图是一个使用口令机制登录的完整流程。 公钥机制:认证工程是,B用A的公钥加密随机字符串R,并发给A,A用自己的私钥解密R,并将R和本次会话的SessionKey用MD5加密得到D1,再发回给B,B比对收到的D1和自己用R和SessionKey生成的D2是否相同。下图是一个使用公钥机制登录的完整流程。 (注意:验证成功后的后续通信,都是通过对称加密的方式,具体怎么获得这个对称加密的秘钥,比较复杂,请自行google) 所以,回到怎么制作SSH免密登录镜像,可以发现,只需要在制作镜像的实例中,先生成一对公钥私钥,然后将公钥拷贝至主机用于保存其他主机公钥的文件中即可,即将生成的id_rsa.pub放到~/.ssh/authorized_keys中。这样因为所有的计算节点中都用的同一个镜像,所以任意一个节点A登录到其他节点B,B中总包含着A的公钥,于是SSH免密登录就做到了。当然,只做到这一步还不行,因为你会发现,当第一次登录的时候,本机会进行远程SSH主机的公钥检查,即提示你即将接收远程主机的公钥密纹,是否确认接收此公钥。所以为了防止第一次登录出现这种情况,你需要禁用远程主机的公钥检查,即需要配置ssh_config,设置StrictHostKeyChecking为no。(文章末尾会提供完整的github目录,供参考) 除了免密登录外,基础镜像中还需要添加各类基础软件,比如需要安装NFS和RPC相关组件,以及一些高性能计算相关的库如openMPI等。以上的所有镜像相关配置,或者软件安装过程都可以放在一个脚本中来完成。我们知道Packer本质就是用JSON配置文件描述的方式帮助我们完成了上面所说的4个过程。我觉得直接从我的JSON配置文件来说明Packer更直观一些。 { "variables": { "access_key": "your access_key", "secret_key": "your secret_key" }, "builders": [{ "type":"alicloud-ecs", "access_key":"{{user `access_key`}}", "secret_key":"{{user `secret_key`}}", "region":"cn-beijing", "image_name":"small_hpc_image", "source_image":"centos_7_04_64_20G_alibase_201701015.vhd", "instance_name":"base_hpc_instance", "vpc_id":"vpc-***********lcdnky", "vswitch_id":"vsw-***********vz0hw382yd", "security_group_id":"sg-***********2ufql1ic8", "ssh_username":"root", "instance_type":"ecs.t5-lc1m2.small", "internet_max_bandwidth_out":"1", "io_optimized":"true", "image_force_delete":"true", "internet_charge_type":"PayByTraffic", "ssh_password":"your password" }], "provisioners": [{ "type": "file", "source": "ImageScript.sh", "destination": "/tmp/" },{ "type": "shell", "inline": [ "sleep 30s", "cd /tmp", "chmod 755 ImageScript.sh", "./ImageScript.sh > log" ] }] } variables:存放一些用户自定义的基础变量值,比如你可以存放你的ak,sk等 builders: 是一个JSONarray,它会是读取配置然后创建用于制作镜像的实例,每个JSON代表了一个实例,并且builders中的参数是随着你使用的云厂商不同而不同,你需要参考Packer的官方手册,不过会有一些公共的变量如ssh_username,ssh_password等。在本例子中,由于使用的是阿里云,所以我们需要制定诸如基础镜像,网络配置,实例密码等。(这里有一些非常“重要”的坑后文会着重说明) provisioners:这个是用户自定义的一些操作,比如上传脚本,并运行相关脚本等操作,方便用户自定义相关镜像中的内容。这里我们就可以将上文中关于SSH免密登录,以及相关软件安装的过程,封装成一个脚本ImageScript.sh。provisioners中定义了很多类型的用户操作,比如上面配置中的file类型和shell类型,分别对应着用户上传本地文件和执行bash脚本的行为,当然还有很多其他行为,大家可以参考Packer文档。 下面这些话是我个人在使用Packer上遇到的一些小坑,写出来希望大家可以减少踩到的几率。 openAPI中创建实例,一般只需要制定虚拟交换机id和安全组id即可,但是packer需要注意的是,一定要同时指定vswitch_id相关联的vpc_id。 务必将出口带宽internet_max_bandwidth_out值设置大于0,或者绑定弹性网卡,同时记得设置ssh_password登录密码。因为packer在使用provisioners时,会利用ssh从公网登录到机器的实例中,再进行后续操作。所以公网出口带宽设置大于0的目的就在于,实例创建后会有公网IP地址,供packer使用。 2.编排启动属于你的迷你并行计算集群 有了Packer制作的镜像之后,就到了Terraform来编排计算集群中各个节点的启动顺序,以及启动之后需要加载的配置项等行为。根据我们的需求,整个集群只有一个节点对外拥有公网IP(即将这个节点作为一个跳板),并且集群中所有节点拥有一个NFS共享目录。要做到这些,我们用一个图来展示编排的行为。这里有一个假设就是,我们用某一个节点下挂载的云盘中的某一目录,作为所有节点的共享目录。(当然这里我很推荐大家使用阿里云的NAS文件存储,设置更快速的CPFS,让所有节点都挂载在NAS上,这样就不用考虑在启动时那个节点作为NFS Server了。) 下图中,箭头从A指向B,表示B的成功依赖于A的完成 上面的这个图我觉得比较清晰的展现了各类资源、实例应该以什么顺序启动。那么Terraform就是一个编排工具帮我们完成上面所有的资源创建,并且可以通过显示或者隐式的方式,确保资源之间创建的相互依赖关系,这一点十分类似Spark中的DAG(terraform对于没有依赖关系的资源会并行的创建)。下面我从terrafomr提供的基本命令和主要配置项大致讲解一下Terraform的一些基础知识。 基本命令:terraform和git有些相似,在使用前需要创建一个目录,并创建一个.tf文件(官方称tf就是terraform format格式,其自创的一种语法格式)。此文件中需要指定provider的信息(即你使用的是哪个云厂商进行操作)。以下列出了4个基本的操作 terraform init:初始化操作,terraform会根据tf文件中的provider厂商,下载相应厂商的可执行二进制库,也就是为apply提供正确环境 terraform plan:执行预览,可以看到此配置文件将展示怎么的一个云服务状态 terrafrom apply:执行编排操作 terraform destroy:销毁当前状态下所有的云服务资源 主要配置项:包括provider配置项,data配置项,和resource配置项。 provider:上文也说了,用于声明你需要使用的云厂商是谁,并且指明access_key和secret_key还有region的相关信息等 data: 用来查询某个资源的相关情况,比如本例子中,就使用data配置项并结合过滤条件来找到我在上一节创建的镜像id。除此之外还可以进行过滤出用户需要的资源信息(如可用的实例类型等等,可参考https://www.terraform.io/docs/configuration/data-sources.html) resource:此配置项是最为中的,它关系到你所创建的资源的所有状态,包括创建vpc,安全组,虚拟交换机,以及最为重要的实例。资源之间的相关关系,通过隐式声明和显示声明进行表述。隐式声明主要通过tf的表达式表示,比如下面阐述的例子用vswitch资源的表示中,中就使用了表达式${alicloud_vpc.vpc.id}来表示使用创建的vpc资源的id。而显示声明更简单,直接使用depends_on来指名,如在创建nfs client节点时,就需要依赖nfs server节点已经创建并初始化完成。 下面,我们直接从构建这个迷你并行计算集群的tf配置文件来解读,从而对整个terraform的用法有更直观的理解,大家可以根据文件中的注释来进一步理解。 # Configure the Alicloud Provider # 创建一个拥有公网IP的ECS服务器,且需要运行脚本命令初始化服务器 # 用户可以将类似ak,sk这些环境变量定义在其他tf文件中,并将需要声明的变量用一下方式声明 # variable "access_key" { default = "xxxxxxx"} provider "alicloud" { access_key = "${var.access_key}" secret_key = "${var.secret_key}" region = "${var.region}" } # 创建一个vpc,CIDR为172.16.0.0/12" resource "alicloud_vpc" "vpc" { name = "small_hpc_vpc" cidr_block = "172.16.0.0/12" description ="this is a example vpc for small_hpc_cluster" } # 创建一个vswitch,vsw的创建依赖于vpc的创建,即vsw必须附属于某一个vpc resource "alicloud_vswitch" "vsw" { name = "small_hpc_vsw" vpc_id = "${alicloud_vpc.vpc.id}" cidr_block = "${var.cidr_block}" availability_zone = "${var.zoneid}" description = "this is a example vsw for small_hpc_cluster" } # 基于某一个VPC创建安全组 resource "alicloud_security_group" "group" { name = "small_hpc_security_group" vpc_id = "${alicloud_vpc.vpc.id}" } # 创建一个安全组 resource "alicloud_security_group" "default" { name = "small_hpc_default" description = "a security for small_hpc_default" vpc_id = "${alicloud_vpc.vpc.id}" } # 获取镜像的id data "alicloud_images" "images_ds" { owners = "self" name_regex = "^small_hpc_image" } # 创建一个实例,同时这个实例也作为NFS的Server运行 # Create a machine and at same time this machine is NFS server resource "alicloud_instance" "master" { availability_zone = "${var.zoneid}" image_id = "${data.alicloud_images.images_ds.images.0.id}" security_groups = ["${alicloud_security_group.default.id}"] instance_name = "${var.base_nstance_name}" instance_type = "${var.instance_type}" vswitch_id = "${alicloud_vswitch.vsw.id}" internet_charge_type = "${var.internet_charge_type}" internet_max_bandwidth_out = "1" # ALicloud OpenAPI中定义的参数,用户可以将bash文件传入其中(不大于16k,且需要注意terraform不要将文本用 # base64方式编码,这里和OpenAPI文档有一些出入) user_data = "#!/bin/sh\n mkdir -p /root/share" host_name = "hpc0" password = "${var.password}" private_ip = "${cidrhost(var.cidr_block, count.index+1)}" # 用户自定义操作,file表示实例启动后,将本地文件或者目录拷贝到指定实例目录中 provisioner "file" { source = "nfs_server_script.sh" destination = "/tmp/nfs_server_script.sh" } provisioner "file" { source = "mpi_testfile" destination = "/root/share" } # 用户自定义操作,remote表示实例启动后,在实例中执行用户所要求的命令 provisioner "remote-exec" { inline = [ "cd /tmp && chmod 700 nfs_server_script.sh", "./nfs_server_script.sh > nfs_server_script_log", ] } # 和provider相关,指定使用SSH方式连接到实例来执行用户自定义操作(注意请务必保证实例有公网IP) # 且host务必显示指定 connection { host = "${alicloud_instance.master.public_ip}" type = "ssh" user = "root" password = "${alicloud_instance.master.password}" timeout = "10s" } } # 定义输出值,在使用terraform apply完成创建后,控制台会用高亮显示输出定义的值,或者也可以通过命令 # terraform output public_ip获取相应值 output "public_ip" { value = "${alicloud_instance.master.public_ip}" } # 创建两个安全组规则,一个是为了方面SSH登录,允许1-65545端口入方向 resource "alicloud_security_group_rule" "allow_22_tcp" { type = "ingress" ip_protocol = "tcp" nic_type = "intranet" policy = "accept" port_range = "1/65535" priority = 1 security_group_id = "${alicloud_security_group.default.id}" cidr_ip = "0.0.0.0/0" } resource "alicloud_security_group_rule" "allow_icmp"{ type = "ingress" ip_protocol = "icmp" nic_type = "intranet" policy = "accept" port_range = "-1/-1" priority = 1 security_group_id = "${alicloud_security_group.default.id}" cidr_ip = "0.0.0.0/0" } # 创建其他节点,同事其他节点也作为NFS的client节点 resource "alicloud_instance" "slave" { # count 表示创建该实例的个数 count = "${var.node_count}" availability_zone = "${var.zoneid}" image_id = "${data.alicloud_images.images_ds.images.0.id}" security_groups = ["${alicloud_security_group.default.id}"] instance_name = "${var.base_nstance_name}" instance_type = "${var.instance_type}" vswitch_id = "${alicloud_vswitch.vsw.id}" internet_charge_type = "${var.internet_charge_type}" # terraform提供了丰富的表达式写法和内建函数。如下面的count.index会获取到当前创建的资源是第几个资源 host_name = "hpc${count.index+1}" # cidrhost内建函数更为强大,可以根据cidr_block和某一整数值计算出当前网络地址下对应主机地址 private_ip = "${cidrhost(var.cidr_block, count.index+2)}" # file内建函数用于读取本地某一文件 user_data = "${file("nfs_client_script.sh")}" depends_on = ["alicloud_instance.master"] } 上面的配置文件展示了Terraform一般用法,当然Terraform提供了非常丰富的使用场景,以及强大的语法表达式,和内建函数。在使用过程中,建议大家阅读terraform的官方手册,来更进一步学习。当然本人在第一次使用的时候也是遇到了各种各样的“坑”,比如user_data在terraform中不需要进行base64编码,以及必须制定connection中host主机地址等。 下面就是我们创建编排资源的时候啦。我们在包含tf的目录下,输入terraform apply,terraform会打印出当前行为期望的执行过程,这个时候再敲入yes,然后等待几分钟你的编排好的实例就创建好啦。 现在我们登录到集群中执行一个简单的MPI helloworld程序,当你看到如下画面就表明你的迷你并行计算集群已经可以即拿即用啦,当你用完此集群后,直接键入terraform destory销毁这些资源即可。 好啦,Terraform的用法我觉得点到为止就好啦,这个例子已经囊括了绝大多数的使用方法,所以大家可以到本人的github上下载源码https://github.com/xiaobaidemu/smallhpc_terraform,感受一下(记得添加上你自己的ak和sk,以及password)。 参考文章: https://www.packer.io/ https://www.terraform.io/intro/index.html https://www.cnblogs.com/liuyisai/p/5992511.html https://www.jianshu.com/p/85de1e45df37

资源下载

更多资源
Mario

Mario

马里奥是站在游戏界顶峰的超人气多面角色。马里奥靠吃蘑菇成长,特征是大鼻子、头戴帽子、身穿背带裤,还留着胡子。与他的双胞胎兄弟路易基一起,长年担任任天堂的招牌角色。

腾讯云软件源

腾讯云软件源

为解决软件依赖安装时官方源访问速度慢的问题,腾讯云为一些软件搭建了缓存服务。您可以通过使用腾讯云软件源站来提升依赖包的安装速度。为了方便用户自由搭建服务架构,目前腾讯云软件源站支持公网访问和内网访问。

Spring

Spring

Spring框架(Spring Framework)是由Rod Johnson于2002年提出的开源Java企业级应用框架,旨在通过使用JavaBean替代传统EJB实现方式降低企业级编程开发的复杂性。该框架基于简单性、可测试性和松耦合性设计理念,提供核心容器、应用上下文、数据访问集成等模块,支持整合Hibernate、Struts等第三方框架,其适用范围不仅限于服务器端开发,绝大多数Java应用均可从中受益。

WebStorm

WebStorm

WebStorm 是jetbrains公司旗下一款JavaScript 开发工具。目前已经被广大中国JS开发者誉为“Web前端开发神器”、“最强大的HTML5编辑器”、“最智能的JavaScript IDE”等。与IntelliJ IDEA同源,继承了IntelliJ IDEA强大的JS部分的功能。

用户登录
用户注册