当前位置: 首页 > 科技观察

使用您最喜欢的编程语言将基础设施配置为代码_0

时间:2023-03-20 16:17:45 科技观察

为您提供使用Node.js或其他编程语言启动基础设施所需的一切。在IT和技术世界中航行时,您会一遍又一遍地遇到术语。其中一些术语难以量化,并且随着时间的推移可能具有不同的含义。“DevOps”就是一个例子,这个术语(在我看来)似乎会根据使用它的人而改变;最初的DevOps先驱可能甚至不知道我们今天所说的DevOps。如果您是一名软件开发人员,“基础架构即代码”(IaC)可能是这些术语之一。IaC是使用与编写面向用户的功能相同的软件开发实践来声明应用程序将在其上运行的基础结构。这通常意味着使用Git或Mercurial等工具进行版本控制,使用Puppet、Chef或Ansible进行配置管理。在基础设施配置层,最常见的技术是CloudFormation(专门用于AWS)或开源替代方案Terraform,用于创建您的应用程序可以在其上运行的混合云资源。配置管理空间中有很好的选项,可以将IaC编写为配置文件或您喜欢的编程语言,但此选项在基础设施配置空间中不太常见。Pulumi提供了一种使用标准编程语言定义基础设施的方法。它支持多种语言,包括JavaScript、TypeScript、Go、Python和C#。就像Terraform一样,Pulumi为许多熟悉的云提供商提供一流的支持,例如AWS、Azure、谷歌云等。在本文中,我将向您展示如何使用Pulumi在Node.js中编写基础设施。先决条件首先,确保您已准备好使用Pulumi。Pulumi支持所有主要操作系统,因此您用来安装其先决条件的方法取决于您使用的操作系统。首先,为您最喜欢的编程语言安装一个解释器。我将使用TypeScript,因此我需要安装节点二进制文件。有关您的操作系统的信息,请参阅节点安装说明。您可以在Mac或Linux上使用Homebrew进行安装:brewinstallnode在Linux上,您可以使用常用的包管理器,如apt或dnf。$sudodnfinstallnodejs在任何一种情况下,结果都应该是节点二进制文件在您的$PATH中可用。要确认它可以访问,请运行:node--version接下来,安装Pulumi命令行界面(CLI)。您可以在Pulumi的文档中找到不同操作系统的安装说明。在Mac或Linux上使用brew:brewinstallpulumi或者,您可以使用安装脚本。首先下载并查看它,然后执行它:$curl-fsSL--outputpulumi_installer.shhttps://get.pulumi.com/$morepulumi_installer.sh$sh./pulumi_installer.sh同样,期望的结果是路径中的pulumi二进制文件。检查版本以确保您已准备就绪:pulumiversionv2.5.0配置Pulumi在开始配置任何基础结构之前,为Pulumi提供一个存储其状态的位置。Pulumi将其状态存储在后端。默认后端是Pulumi的软件即服务(它有针对个人用户的免费计划),但在本例中我使用的是备用文件后端。文件后端将在你的本地文件系统上创建一个文件来存储状态:pulumilogin--local如果你打算与其他人共享这个项目,文件后端可能不是一个好的起点。Pulumi还可以将其状态存储在云对象存储中,例如AWSS3。要使用它,请创建一个S3存储桶并登录:pulumilogin--cloud-urls3://my-pulumi-state-bucket现在您已登录到状态后端,您可以创建一个项目和一个堆栈!在开始创建Pulumi项目之前,请注意以下Pulumi术语,您将在整个教程中看到这些术语。项目项目是包含Pulumi.yaml文件的目录。此文件包含Pulumi需要知道的元数据才能完成其工作。可以在Pulumi.yaml文件中找到的示例字段有:运行时(例如,Python、Node、Go、.Net)项目描述(例如“我的第一个Pulumi项目”)项目名称项目是一个松散的概念,可以满足您的需求需要。通常,项目由您要提供和控制的资源集合组成。您可以选择资源很少的小型Pulumi项目,也可以选择拥有您需要的所有资源的大型项目。当您对Pulumi越来越熟悉时,您会更清楚您想要如何布局您的项目。堆栈Pulumi堆栈允许您根据可配置的值区分您的Pulumi项目。一个常见的用途是将项目部署到不同的环境,例如开发或生产环境,或不同的地区,例如EMEA和美国。开始时,您不需要复杂的堆栈设置,因此本演练使用默认堆栈名称dev。在IaC中使用TypeScript,您可以使用方便的puluminew命令来初始引导Pulumi项目。新命令有一堆标志和选项让你开始使用Pulumi,所以继续创建你的第一个项目:$puluminewtypescript这个命令将引导你创建一个新的Pulumi项目。输入一个值或留空接受(默认),然后按。随时按^C退出。项目名称:(pulumi)my-first-project项目描述:(一个最小的TypeScriptPulumi程序)我的第一个PulumiprogramCreated项目'my-first-project'请输入您想要的堆栈名称。要在组织中创建堆栈,请使用格式/(例如`acmecorp/dev`)。stackname:(dev)devCreatedstack'dev'Installingdependencies...>nodescripts/postinstall添加了来自126个贡献者的82个包,并在2.84s13包中审核了82个包正在寻找资金运行`npmfund`以获取详细信息发现0个漏洞已完成安装依赖项你的新项目开始了!初始部署,运行'pulumiup'为了指定模板,我选择了通用打字稿选项,但有很多选项可供选择。新命令从您的模板存储库中获取模板并在本地复制此文件,包括运行时依赖项(在本例中为package.json)。新命令通过在此目录中运行npminstall来安装这些依赖项。然后npminstall下载并安装运行Pulumi程序所需的一切,在本例中为:@pulumi/pulumiNPM包。您已准备好创建您的第一个资源!创建您的第一个云资源是由您的基础设施供应软件生命周期管理的事情。资源通常是云提供商对象,例如S3存储桶。Pulumi资源由Pulumi的提供商处理,这些提供商是特定的云提供商。Pulumi有大约40个供应商可供您使用,但对于您的第一个资源,请使用最简单的一个:随机供应商。随机提供者的作用正如它的名字所暗示的那样:它幂等地创建一个随机资源(例如,可以是一个字符串)并将其存储在Pulumi状态中。使用npm将其作为依赖项添加到您的Pulumi项目中:npminstall@pulumi/randomnpm包管理器下载并安装随机提供程序包,并为您安装它。现在您已准备好对Pulumi进行编程。当您之前生成项目时,Pulumi的初始构建过程会创建一个index.tsTypeScript文件。在你最喜欢的IDE中打开它,并添加你的第一个资源:import*aspulumifrom"@pulumi/pulumi";import*asrandomfrom"@pulumi/random";constpassword=newrandom.RandomString(`password`,{length:10})如果你非常熟悉TypeScript或JavaScript,这看起来会很眼熟,因为它是用你熟悉的编程语言编写的。如果您使用的是Pulumi支持的其他语言之一,情况也是如此。这里是之前的随机资源,不过这次是用Python写的:importpulumi_randomasrandompassword=random.RandomString("password",length=10)Pulumi项目目前只支持单一语言,但是每个项目都可以参考写的项目在其他语言中,这对于多语言团队的成员来说是一种有用的技术。您已经编写了第一个Pulumi资源。现在您需要部署它。离开编辑器并返回命令行。在您的项目目录中,运行pulumiup,然后观看奇迹发生:pulumiupPreviewingupdate(dev):TypeNamePlan+pulumi:pulumi:Stackmy-first-project-devcreate+└─random:index:RandomStringpasswordcreateResources:+2创建是否要执行此更新?yesUpdating(dev):类型名称Status+pulumi:pulumi:Stackmy-first-project-devcreated+└─random:index:RandomStringpasswordcreatedResources:+2createdDuration:2sPermalink:file:///Users/lbriggs/.pulumi/stacks/dev.json太棒了,你有了第一个Pulumi资源!虽然您可能正在享受成就感,但不幸的是,这个随机资源并没有那么有效:它只是一个随机字符串,您甚至看不到它是什么。先解决这部分问题。修改您之前的程序并将导出添加到您创建的常量:import*aspulumifrom"@pulumi/pulumi";从“@pulumi/random”中随机导入*;exportconstpassword=newrandom.RandomString(`password`,{length:10})再次运行pulumiup以查看输出:pulumiupPreviewingupdate(dev):TypeNamePlanpulumi:pulumi:Stackmy-first-project-devOutputs:+password:{+id:"&+r?{}J$J7"+keepers:output+length:10+lower:true+minLower:0+minNumeric:0+minSpecial:0+minUpper:0+number:true+overrideSpecial:output+result:"&+r?{}J$J7"+special:true+upper:true+urn:"urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password"}资源:2unchanged是否要执行此更新?yesUpdating(dev):TypeNameStatuspulumi:pulumi:Stackmy-first-project-devOutputs:+password:{+id:"&+r?{}J$J7"+length:10+lower:true+minLower:0+minNumeric:0+minSpecial:0+minUpper:0+number:true+result:"&+r?{}J$J7"+special:true+upper:true+urn:"urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password"}Resources:2unchangedDuration:1sPermalink:file:///Users/lbriggs/.pulumi/stacks/dev.现在你可以在Outputs的结果部分看到一个随机生成的字符串你现在可以看到你创建的资源有很多属性。这一切都很好,但如果你想享受IaC,你必须提供随机字符串以外的东西。尝试一下。部署容器到目前为止,您已经通过安装依赖项和注册一个简单的随机资源来使用Pulumi。现在部署一些实际的基础设施,尽管是在您的本地机器上。首先,将@pulumi/docker提供程序添加到您的堆栈中。使用您选择的包管理器将它添加到您的项目:npminstall@pulumi/docker您已经从npm中提取了PulumiDocker提供程序包,这意味着您现在可以在您的项目中创建Docker映像。如果您的机器上没有安装Docker,现在是安装它的绝佳时机。说明将取决于您的操作系统,因此请参阅Docker的安装页面以获取信息。再次打开您最喜欢的IDE并运行Docker容器。将您之前的index.ts文件修改为如下所示:import*aspulumifrom"@pulumi/pulumi";import*asrandomfrom"@pulumi/random";import*asdockerfrom"@pulumi/docker";constpassword=newrandom.RandomString(`password`,{length:10})constcontainer=newdocker.Container(`my-password`,{image:'hashicorp/http-echo',command:[pulumi.interpolate`-text=Yoursupersecretpasswordis:${password.result}`],ports:[{internal:5678,external:5678,}]})exportconstid=container.id这会创建一个容器,创建一个web服务器。Web服务器的输出是您随机生成的字符串,在本例中为密码。运行这个,看会发生什么:pulumiupPreviewingupdate(dev):TypeNamePlanpulumi:pulumi:Stackmy-first-project-dev+└─docker:index:Containermy-passwordcreateOutputs:+id:output~密码:{id:“&+r?{}J$J7”长度:10lower:trueminLower:0minNumeric:0minSpecial:0minUpper:0number:true结果:“&+r?{}J$J7"special:trueupper:trueurn:"urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password"}Resources:+1tocreate2unchangedDoyouwanttoperformthis更新?yesUpdating(dev):类型名称状态pulumi:pulumi:Stackmy-first-project-dev+└─docker:index:Containermy-passwordcreatedOutputs:+id:"e73b34aeca34a64b72b61b0b9b8438637ce28853937bc359a1528ca99f49ddda"密码:{id:"&+r?{}J$J7"长度:10lower:trueminLower:0minNumeric:0minSpecial:0minUpper:trueresult:0number"&+r?{}J$J7"r?{}J$J7"special:trueupper:trueurn:"urn:pulumi:dev::my-first-project::random:index/randomString:RandomString::password"}Resources:+1created2unchangedDuration:2sPermalink:file:///Users/lbriggs/.pulumi/stacks/dev.json你会注意到在Outputs部分,你输出的值发生了变化,它只是一个Docker容器ID检查你非常简单的密码生成如果服务器工作:curlhttp://localhost:5678您的超级密码是:&+r?{}J$J7就是这样!您刚刚使用TypeScript配置了您的第一个基础设施。关于Pulumi输出的快速说明您会注意到,在创建Docker容器的代码中,它使用了一个特殊的pulumi.interpolate调用。如果您熟悉TypeScript,您可能想知道为什么需要它(因为它是Pulumi特定的)。这有一个有趣的原因。Pulumi在创建资源的时候,有一些值是Pulumi在程序执行之前不知道的。在Pulumi中,这些值被称为Outputs。这些Outputs可以在上面的代码中看到,例如,在你的第一个随机资源中,你使用export关键字导出了随机资源的属性,你还输出了你创建的容器的容器ID。因为Pulumi直到执行时才知道这些Outputs的值,所以在操作字符串时需要特殊的帮助程序来使用它们。如果您想了解有关此特定编程模型的更多信息,请观看短视频。总结随着混合云基础架构中出现的复杂性,IaC以多种方式发展。在基础设施供应领域,Pulumi是一个不错的选择,它可以使用您最喜欢的编程语言来供应您需要的所有基础设施,然后您可以标记您最喜欢的配置管理工具以采取后续步骤。