Packer:PHP开发者工具箱里的利器?这取决于你!
简而言之:作为PHP开发者,Packer是否是你工具箱中必不可少的工具?答案取决于你的工作内容。
如果你大量参与服务器端工作(为客户或公司),同时进行开发工作,那么答案是肯定的。Packer能极大地帮助你。
但如果你仅仅是开发者,很少直接处理服务器端工作,那么Packer对你帮助不大。
即便如此,学习创建服务器环境的基础知识对任何PHP开发者都大有裨益。你的职业生涯中或多或少会遇到这些技术(你创建的一切都运行在这些技术之上!)。掌握这些专业知识无疑会提升你的职业发展前景!至少,你会更好地理解DevOps同事的工作。
如果你对此感兴趣,或者你经常进行手动服务器端工作,请继续阅读。
关键要点:
回顾过去:
简而言之#2:如果你精通Vagrant并理解其作为工具的目的,请跳到本文的这一部分。
仅仅十年前,PHP应用程序的开发基本上是这样的:开发者通过FTP将一些代码上传到Web服务器上,然后查看是否有效。如果无效,他们会进行故障排除,在某个文本编辑器中进行更改,再次通过FTP重新加载受影响的文件,然后查看更改是否解决了问题。如果是这样,他们就会继续下一个功能或问题,重复这个过程(并祈祷他们刚刚完成的工作不会出错)。他们也可能进行一些FTP同步。
这是当时平均水平的独立PHP开发者将代码推送到开发服务器(或者更糟糕的是,直接推送到生产服务器)的工作流程(实际上,如今一些开发者仍然使用相同的流程)。当时,构建Web服务器本身通常是其他人的工作。
此外,在那个不太遥远的过去,为了让开发团队协同工作,可能存在某种形式的并发版本控制系统,并且团队甚至可能设置了自动部署。当更改提交到存储库时,它会自动部署到暂存或生产系统。这种情况实际上是当时Web应用程序开发的最佳技术。
在那些美好的旧时光里,持续集成、虚拟机、云计算、基础设施编排、数据中心自动化,甚至“DevOps”这个术语基本上都是未知的。它们才刚刚诞生。亚马逊才刚刚开始他们的网络服务业务。记住,这仅仅是十年前的事!
啊,当时的时光是多么简单,对吧?
不,并非如此。当时,开发速度更慢、更繁琐,而且更容易出错。服务器也总是需要“启用”进行测试,这通常意味着开发者必须等到“网络人员”准备好一个服务器才能使用,比如最新的PHP版本。在很多情况下,这往往是一场争斗,而对于“网络人员”来说,保持服务器“正常运行”就像灭火一样。
今天的计算和虚拟化:
如今,随着计算机技术触手可及,开发者可以随身携带更复杂的开发基础设施。今天笔记本电脑或PC的计算能力远远超过十年前Web服务器上的计算能力。
事实上,我们今天拥有的许多智能手机都比十年前的服务器更强大。
科技真是令人惊叹,不是吗?
由于可用的计算能力不断增长,越来越多的人开始意识到,这种计算能力可以分解成单独的“机器”。这使得它们能够同时执行完全不同的操作。更重要的是,可以更好地利用计算能力,从而节省资源。这些是计算能力虚拟化的主要驱动力。
换句话说,如今,凭借创建虚拟机的能力,开发者可以随身携带自己的开发环境,不再受限于必须为他们提供适当工作环境的其他人员。更重要的是,他们可以在本地构建一个完整的开发环境,模拟一个完整的Web服务器。
这不仅使开发者更加自主,这种本地开发环境还有另一个巨大优势:它被称为“开发-生产一致性”——我们在新手友好的《Jump Start PHP Environment》一书中对此进行了详细讨论。开发-生产一致性基本上意味着开发者可以在与应用程序最终部署到生产环境中几乎相同的系统上进行开发。
生产一致性优势——它允许开发者编写更高质量的代码,因为他们可以第一次就以正确的方式做正确的事情。
如今,开发者可以在自己的背包里拥有开发高度复杂应用程序所需的一切,包括高度复杂的开发环境。
显然,这种能力也带来了复杂性。虚拟服务器必须构建,软件必须安装和配置。所有这些都可能非常耗时,而时间就是金钱。这也意味着开发者可能需要学习很多东西才能运行这样的环境。这也很耗时。
Vagrant的出现:
为了帮助开发者完成开发环境的“构建”,HashiCorp Inc. 推出了名为Vagrant的程序。使用Vagrant,开发环境配置是代码,可以轻松地共享、回滚和前滚。开发者可以自由地尝试新事物,例如最新版本的PHP,而无需担心服务器可能需要数小时才能设置,或者故障需要数小时才能解决。开发者不必等待任何人创建此环境,如果环境完全崩溃,他们也不会打扰任何人。
更多关于Vagrant的信息——重新介绍Vagrant:使用PHP的正确方法
但是,仍然还有一个问题需要解决。Vagrant虽然非常适合构建开发环境,但运行起来相当耗时,尤其是在大量配置(更多关于配置的信息见下文)的情况下。根据所涉及的软件,构建一个box和配置软件可能需要2到20分钟不等。
这种时间消耗还加剧了这样一个事实:Vagrant一次只能为单个虚拟化系统(称为“提供程序”)构建单个box。例如,如果你想在本地构建你的环境,并在AWS上构建一个环境,你必须创建两个不同的Vagrant文件并分别运行它们。这实际上并不实用。简而言之,Vagrant非常擅长构建单个开发环境,仅此而已。
Packer的出现:
为了继续进行,你现在必须更多地扮演DevOps角色。Packer将创建虚拟化机器镜像的任务放入相对简单的中央配置中,因此你可以获得Vagrant在自动化开发环境方面相同的优势,但现在也可以用于开发基本镜像。
虚拟机镜像也称为虚拟设备。它是虚拟机的预构建副本,可用于创建新的虚拟机。在Vagrant术语中,这些镜像称为“box”。
如果你了解创建自己的镜像的过程,你会知道手动操作非常麻烦。如果你不知道,你很幸运,因为你可以跳过手动构建它们的麻烦,现在就可以开始使用Packer了。但是,你仍然需要学习一些镜像/服务器构建的基础知识。同样,这对开发者来说是有价值的知识,任何开发者都应该花时间学习基础知识。
一旦你开始使用Packer,并且你已经在使用Vagrant,你首先会想到的问题是,“Packer和Vagrant到底有什么区别?”我们在上面已经开始讨论了一些区别。最终,Packer创建镜像,Vagrant可以使用这些镜像来构建开发环境。如果你之前使用过HashiCorp的Vagrant box,很可能它也是用Packer构建的。
作为使用Packer的DevOps人员,你可以为开发团队提供生产环境的镜像,他们可以轻松地使用这些镜像进行开发。这再次支持了开发-生产一致性,并简化了开发流程。
我们之前提到了节省时间。Packer还可以并行构建和部署这些镜像。因此,你可以几乎同时为不同的主机、你的私有云和Vagrant构建镜像。此外,这些“预烘焙”的镜像启动速度比Vagrant中配置的box快得多。快得多!如果你的团队一直在“启用”和销毁box,那么使用Packer创建的预烘焙软件和配置的镜像将为你的团队节省大量时间。
Packer流程也使创建基本镜像具有可重复性。这意味着你的生产系统具有更高的质量,因为VM的镜像重建可以在前面进行测试和自动化。换句话说,Packer有助于减少人为错误。
在构建镜像时,还可以控制几个子流程。我们稍后会讨论它们。你还可以阅读Packer文档中关于Packer概念和特性的更多信息。请注意,你可以为许多不同的平台构建镜像。你还可以使用许多配置程序(如Chef、Puppet、Ansible)或Shell脚本配置软件。而且,你可以进行后处理,例如创建Vagrant box或将镜像推送到Docker注册表(以及更多其他操作)。
哇……理论太多了,不是吗?
让我们做一些实际操作,以帮助阐明Packer的概念以及如何使用它。
一些Packer工作流程:
这是我们将要完成的工作的可视化表示。
虽然Packer不需要Vagrant来创建镜像,但在上面的图形中添加了Vagrant,以便让你更好地理解它在“管道”中的位置。
为了让你开始学习Packer的基础知识,以下练习的目标是创建一个能够在Rackspace上运行的镜像和一个Virtualbox“box”文件。目标是向你展示你可以生成相同的镜像和配置来进行开发,并在你的(理论上的)生产服务器上使用。
我们使用Rackspace是因为它有一个非常简单的后端用于管理计算基础设施,并且因为它使用Openstack,这是一个用于基础设施管理的标准系统。
我们还使用Virtualbox,因为它是一个免费且广泛使用的本地虚拟化系统。如果你愿意,可以使用其他系统,如AWS和VMWare,但是,你需要修改本教程中提供的材料,因为它们是专门为这两个系统制作的。
请注意:我们在本文中构建的虚拟服务器绝不是“生产就绪”的。它们仅用于演示目的。
我们将使用Packer构建的初始镜像将是一个Debian Jessie(64位)镜像,预装了Nginx和PHP7。
要求:在开始之前,你需要在你的计算机上安装Vagrant和虚拟化软件Virtualbox(版本5.0 )。你还需要一台64位计算机。如果你使用的是Windows系统,你还应该安装Git for Windows,以便我们可以使用它的bash控制台。
正如我上面提到的,我们在本教程中使用Rackspace,因此你需要在那里创建一个帐户。设置一个帐户相对快速且容易。
你还需要一个相对快速的互联网连接,因为Virtualbox构建的镜像下载非常大(大约250MB)。最后,你需要在你的计算机上大约有12GB的可用磁盘空间才能完成整个过程。
本文还假设你了解一些使用Vagrant、SSH和Shell命令的基础知识,并且对Linux和虚拟机有一些基本的了解。
请按照说明在你的计算机上安装Packer。
在撰写本文时,Packer 0.11.0刚刚发布。
安装完成后,在你的(git bash)控制台中输入packer。你应该会看到类似这样的内容。
现在,我们将转到Rackspace并启动一个服务器,然后创建一个基本镜像。注意:如果你有AWS或其他Packer支持作为构建器平台的云计算主机,你需要采取的步骤将类似。我们在本教程中介绍Rackspace。另请注意,创建服务器会向你的主机帐户收取一些费用。但是,金额会很小。按照本教程操作的费用不应超过一美元。
继续构建一个Jessie 8服务器,并将其命名为“Packer Test”。Rackspace非常直观易懂。启动一个1GB的服务器来从中创建镜像。
服务器处于活动状态后,创建新创建服务器的镜像(右上角的“操作”按钮)。创建并保存镜像后,你可以删除服务器。
转到“服务器->镜像”,你应该会看到你的新镜像。点击它以转到镜像的详细信息页面。我们将需要镜像ID。
好了。现在你已经准备好在Rackspace上使用的基本镜像了,我们将开始构建我们自己的镜像。这个过程实际上相当复杂,特别是对于那些只对服务器环境和Packer了解有限的人来说。因此,为了提供一些帮助,我们为你创建了一个演示Packer仓库供你下载。请从你的(Git bash)控制台中克隆此仓库。
<code>git clone https://github.com/smolinari/PHP-Packer-Demo </code>
移动到新创建的“PHP-Packer-Demo”目录中。
<code>cd PHP-Packer-Demo </code>
使用你喜欢的编辑器打开jessie64.json文件,然后输入你的Rackspace用户凭据和镜像ID。
快速旁注:你也可以添加你的Rackspace API密钥而不是你的密码。如果你真的开始使用Packer,你还可以将访问凭据移动到单独的文件中,并使用Git忽略它们。但是,这样做超出了本文的范围。
jessie64.json文件是Packer的核心。这是控制Packer执行操作的配置文件。它类似于Vagrant中使用的Vagrantfile(我们也在下载中为你提供了Vagrantfile)。
现在使用以下命令运行Packer。
<code>packer build jessie64.json</code>
此构建过程需要几分钟。由于我们正在进行教程,让我们在等待它完成的同时,实际了解Packer内部发生的情况。此过程不应超过大约30分钟,或者控制台中的输出不应停止超过10分钟。如果确实如此,则说明出现错误。
首先,Packer使用我们定义的基本镜像启动构建过程。这些镜像作为服务器本身启动,我们也在jessie64.json文件中定义了这些服务器。你可以在jessie64.json文件顶部找到“构建器”的特定JSON值。
<code> "builders": [ { "type": "openstack", "username": "ENTER_RACKSPACE_USERNAME_HERE", "password": "ENTER_RACKSPACE_PASSWORD_HERE", "region": "IAD", "identity_endpoint": "https://identity.api.rackspacecloud.com/v2.0", "ssh_username": "root", "image_name": "Test Packer Image", "source_image": "ENTER_YOUR_IMAGE_ID_HERE", "flavor": "2" }, { "type": "virtualbox-iso", "boot_command": [ "<esc><wait>", </wait></esc> "install <wait>", </wait> "preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/vanilla-debian-8-jessie-preseed.cfg <wait>", </wait> "debian-installer=en_US <wait>", </wait> "auto <wait>", </wait> "locale=en_US <wait>", </wait> "kbd-chooser/method=us <wait>", </wait> "netcfg/get_hostname={{ .Name }} <wait>", </wait> "netcfg/get_domain=vagrantup.com <wait>", </wait> "fb=false <wait>", </wait> "debconf/frontend=noninteractive <wait>", </wait> "console-setup/ask_detect=false <wait>", </wait> "console-keymaps-at/keymap=us <wait>", </wait> "keyboard-configuration/xkb-keymap=us <wait>", </wait> "<enter><wait>" </wait></enter> ], "disk_size": "10140", "guest_additions_mode": "disable", "guest_os_type": "Debian_64", "hard_drive_interface": "sata", "headless": true, "http_directory": "http", "iso_checksum": "dd25bcdde3c6ea5703cc0f313cde621b13d42ff7d252e2538a11663c93bf8654", "iso_checksum_type": "sha256", "iso_url": "http://cdimage.debian.org/cdimage/release/8.3.0/amd64/iso-cd/debian-8.3.0-amd64-netinst.iso", "shutdown_command": "sudo /sbin/halt -p", "ssh_password": "vagrant", "ssh_username": "vagrant", "ssh_port": "22", "ssh_wait_timeout": "10000s", "vm_name": "debian-jessie", "vboxmanage": [ ["modifyvm", "{{.Name}}", "--memory", "1024"], ["modifyvm", "{{.Name}}", "--cpus", "1"] ] } ], </code>
构建器负责使你想要的镜像与你所针对的环境兼容。例如,使用AWS AMI,你实际上可以构建你的Virtualbox镜像以用于Vagrant和AWS。
在我们的练习中,我们正在组合“openstack”和“virtualbox-iso”镜像。不幸的是,Packer无法使用openstack镜像来构建Virtualbox镜像,因此我们还创建了virtualbox镜像。
你会注意到上面JSON代码中的“boot_command”部分。在这里,我们实际上是在自动化输入必要的命令,以便在Virtualbox VM中安装Debian Jessie 8作为操作系统。如果你愿意,你甚至可以在Packer进行构建时,在Virtualbox中观看安装过程。
当然,这里发生了很多“魔法”,你必须真正了解Linux安装的内部机制和Packer的内部机制才能手动组合这样的Virtualbox镜像。谢天谢地,有很多优秀的DevOps人员将这样的Packer .json文件提供给大众使用。
一旦构建器在Rackspace和Virtualbox中启动了VM中的镜像,Packer将开始配置在shell脚本中定义的软件。使用Packer,你还可以使用Puppet、Chef或Ansible等系统以及许多其他系统来编排配置。我们只使用Shell脚本,你可以在/scripts目录中找到这些脚本。
这是我们配置文件中的配置部分。
<code>git clone https://github.com/smolinari/PHP-Packer-Demo </code>
“file”配置程序是我们如何将配置添加到VM中的方法。它将我们的计算机上的配置文件加载到VM上的/tmp目录中。在配置过程中,shell脚本中有一些命令会将配置文件复制到VM上的正确位置。我们有像Nginx的“默认”配置文件或修改后的PHP的php.ini文件。你可以在/transfer_files文件夹中找到我们使用的文件。
你还会注意到上面的“override”部分。这告诉Packer只为每个镜像构建运行某些脚本。在我们的练习中,我们需要对“openstack”镜像进行较少的处理才能使其与Virtualbox镜像“一致”,因此只处理setup.sh脚本。
最后,是后配置处理器部分。
<code>cd PHP-Packer-Demo </code>
这负责实际构建Vagrant box。
重要的是要记住,我们现在配置的所有内容都“预烘焙”到镜像中。Packer通过这种自动化节省了我们(或我们的开发团队)大量时间!
在Packer配置完我们在jessie64.json文件中配置的所有软件后,它将关闭VM并存储这些VM的新镜像。对于Rackspace镜像,你将在Rackspace管理控制面板的“已保存镜像”部分找到新镜像。对于Virtualbox镜像,你将在当前目录中找到一个“jessie64.box”文件。
就是这样。Packer已经完成了它的工作!
你现在可以使用Rackspace镜像来创建新的服务器。试试看。转到“服务器”部分并选择“创建服务器”,然后转到“已保存镜像”。你应该会在“已删除服务器”下看到你新保存的镜像。选择它并启动服务器。一旦它处于活动状态,你就可以获取给你的IP地址并将其输入到你的浏览器中。你应该会看到Nginx欢迎屏幕。
对于Virtualbox镜像,我们还需要使用Vagrant进行一些工作。现在仔细阅读。这将变得非常困难!
在包含Vagrant文件的目录中,输入以下命令。
<code>git clone https://github.com/smolinari/PHP-Packer-Demo </code>
就是这样!好的,我们通过为你创建Vagrant文件来帮助你。你需要学习更多关于Vagrant的知识,才能自己创建一个可用的文件。如前所述,如果你是一个认真的开发者,你应该学习这一点。
你现在应该在Virtualbox的UI中看到新的镜像作为VM。
上面的第一个命令将新box添加到Vagrant中,因此它知道从哪里使用它。我们为box命名为“jessie64”,并使用我们刚刚创建的box。第二个命令告诉Vagrant在Virtualbox中创建虚拟机并运行它。
你还会注意到,box的初始启动只需要一两分钟。如果我们一直在Vagrant中进行配置,则需要10到20分钟。这再次节省了时间。
一旦“vagrant up”命令完成,请在浏览器中输入URL https://www.php.cn/link/14e676072a5b15381b6f7f33c3528215。
在这两个系统中,你还可以使用“vagrant”用户和密码“vagrant”进行SSH连接。这些服务器是不安全的!
让我们做一些更有趣的事情。
当你执行下一步时,想象一下你做过多少次类似的事情。我们现在正在自动化软件安装和配置的过程!
让我们假设我们做了很多Symfony开发工作。让我们继续设置我们的镜像,以便自动安装并准备好Symfony的版本。
在开始之前,请删除Rackspace上的服务器。(我们不想花费任何不必要的钱。)
此外,在你的控制台中,让我们终止并删除我们刚刚加载的Vagrant box。输入以下命令:
<code>cd PHP-Packer-Demo </code>
再次,让我们假设我们有一个开发团队,他们经常使用Symfony。让我们自动化设置一个支持Symfony的服务器。我们只加载Symfony演示应用程序,但这项额外的工作应该让你很好地了解Packer如何在自动化方面帮助支持开发和基础设施编排工作。
进入/scripts目录,使用你喜欢的编辑器打开setup.sh脚本,并将以下Shell脚本代码添加到底部。
<code>git clone https://github.com/smolinari/PHP-Packer-Demo </code>
上面的代码基本上是我们需要做的,以便正确设置Symfony、PHP和Nginx。
已添加注释以解释在这些配置步骤中将发生什么。
添加并保存上述代码后,让我们再次让Packer完成繁重的工作。
在文件系统中向上移动一级到我们有jessie64.json文件的位置,并输入我们之前输入的命令。
<code>cd PHP-Packer-Demo </code>
你现在可以处理其他事务或喝另一杯咖啡(或者在跑步机上走走)。构建新的Symfony演示镜像需要一段时间。
完成后,你应该会看到类似这样的屏幕。
现在镜像已经构建并准备好了,我们可以再次在Rackspace上将openstack镜像启动为新的服务器。
对于你的Virtualbox VM,再次输入上面“创建Virtualbox VM”下提到的两个命令。
对于Rackspace服务器,你将获得一个新的IP。输入
<code>packer build jessie64.json</code>
你应该会看到Symfony演示应用程序正在运行。
在你的本地VM上,你可以输入以下内容:
<code> "builders": [ { "type": "openstack", "username": "ENTER_RACKSPACE_USERNAME_HERE", "password": "ENTER_RACKSPACE_PASSWORD_HERE", "region": "IAD", "identity_endpoint": "https://identity.api.rackspacecloud.com/v2.0", "ssh_username": "root", "image_name": "Test Packer Image", "source_image": "ENTER_YOUR_IMAGE_ID_HERE", "flavor": "2" }, { "type": "virtualbox-iso", "boot_command": [ "<esc><wait>", </wait></esc> "install <wait>", </wait> "preseed/url=http://{{ .HTTPIP }}:{{ .HTTPPort }}/vanilla-debian-8-jessie-preseed.cfg <wait>", </wait> "debian-installer=en_US <wait>", </wait> "auto <wait>", </wait> "locale=en_US <wait>", </wait> "kbd-chooser/method=us <wait>", </wait> "netcfg/get_hostname={{ .Name }} <wait>", </wait> "netcfg/get_domain=vagrantup.com <wait>", </wait> "fb=false <wait>", </wait> "debconf/frontend=noninteractive <wait>", </wait> "console-setup/ask_detect=false <wait>", </wait> "console-keymaps-at/keymap=us <wait>", </wait> "keyboard-configuration/xkb-keymap=us <wait>", </wait> "<enter><wait>" </wait></enter> ], "disk_size": "10140", "guest_additions_mode": "disable", "guest_os_type": "Debian_64", "hard_drive_interface": "sata", "headless": true, "http_directory": "http", "iso_checksum": "dd25bcdde3c6ea5703cc0f313cde621b13d42ff7d252e2538a11663c93bf8654", "iso_checksum_type": "sha256", "iso_url": "http://cdimage.debian.org/cdimage/release/8.3.0/amd64/iso-cd/debian-8.3.0-amd64-netinst.iso", "shutdown_command": "sudo /sbin/halt -p", "ssh_password": "vagrant", "ssh_username": "vagrant", "ssh_port": "22", "ssh_wait_timeout": "10000s", "vm_name": "debian-jessie", "vboxmanage": [ ["modifyvm", "{{.Name}}", "--memory", "1024"], ["modifyvm", "{{.Name}}", "--cpus", "1"] ] } ], </code>
你将看到相同的内容。
很酷,对吧?
我们回顾了往昔,然后回到了现在。希望我们让你理解了计算机虚拟化的原因,以及Vagrant和Packer等软件的创建,以及两者之间的联系。
如果你成功地创建了两个服务器,那么你也可以想象Packer可以作为DevOps成员和开发者为你提供的优势。这些优势包括但不限于:
希望你喜欢这篇文章和使用Packer构建镜像的练习。请在下面的评论中告诉我们你对Packer的看法。
HashiCorp的Packer是一个开源工具,可以自动化创建任何类型的机器镜像。它通过允许你编写基础设施代码并将其保存在版本控制系统中来支持现代配置管理。对于PHP开发者来说,Packer可能是一个改变游戏规则的工具。它允许你创建相同的开发环境,从而减少“在我的机器上可以运行”的问题。它还使你能够创建随时可用的镜像,可以在几分钟内(而不是几小时或几天)部署到生产环境中。
Packer因其多功能性和兼容性而脱颖而出。它支持多种平台,包括AWS、DigitalOcean、Docker、Google Cloud等等。它还可以很好地与其他HashiCorp工具(如Terraform和Vagrant)集成,为管理基础设施提供无缝的工作流程。
Packer易于安装。它作为所有受支持平台和架构的二进制包分发。你只需要从Packer网站下载适合你系统的包,解压缩它,然后将其移动到你的PATH中即可。
要使用Packer创建机器镜像,你需要使用JSON格式编写模板文件。此文件定义了要安装的机器和软件的类型。模板准备就绪后,可以使用“packer build”命令创建镜像。
是的,Packer可以很好地与Chef、Puppet、Ansible等现有的配置管理工具一起使用。你可以使用这些工具在Packer创建的机器镜像上配置软件。
Packer具有强大的错误处理机制。如果在镜像创建过程中发生错误,Packer会将镜像标记为失败,并清理所有已创建的资源。这确保你不会最终得到半成品或不一致的镜像。
绝对可以。Packer非常适合CI/CD管道。你可以在构建过程中使用它来创建机器镜像,然后将这些镜像部署到你的生产环境中。
Packer提供详细的日志,可以帮助你调试问题。你还可以启用调试模式,以便在镜像创建过程中获得更详细的输出。
是的,Packer是一个开源项目,欢迎社区贡献。你可以通过报告错误、建议功能、改进文档或提交拉取请求来贡献代码。
Packer的官方网站和GitHub存储库是开始学习的好地方。它们提供了全面的文档、教程和示例。你还可以从互联网上找到许多关于Packer的博客文章、视频和在线课程。
以上是Hashicorp的Packer-是PHP开发人员的东西吗?的详细内容。更多信息请关注PHP中文网其他相关文章!