我想这个问题对于某些读者来说似乎是微不足道的,但是作为一个开发人员,除了很少以手动方式部署应用程序之外,几乎没有其他经验的人,希望并希望这种方式,我希望您能理解看到其中有许多不同的方法和工具非常令人生畏,因此我可以提供一些建议以使我朝正确的方向入手。

我是一名开发人员,现在只有我的手时间,这是有限的。到现在为止,我一直在使用Java,构建Web应用程序,并且对将War文件部署到Tomcat环境中(使事情保持良好封装)感到相当满意。当我接近需要部署的位置时,我想建立一个可靠的devops工作流程以尽可能地自动化,并确保我可以可靠地部署,但是鉴于我的用例相对简单,我想避免学习一个庞大的胖工具集,它过度满足了我的需求,并且需要大量的时间投入,我宁愿使用代码编写我的应用程序。部署和管理我的应用程序而无需花费大量时间来设置和学习大型devops生态系统。

更多详细信息...

上下文


我是在Mac上开发的,使用PyCharm来构建Django 2,Python3。
我使用git(但不是在github上)来管理软件版本控制。
我很舒服与其他语言和脚本语言一起使用,并编写了一些(可能相当业余)bash脚本,尽管我不喜欢bash。我还涉猎了Perl,我意识到这并不是一种真正的涉猎语言(也就是说,您需要花一些时间来正确学习它)
我打算在VPS环境(可能是DigitalOcean)上进行部署。
我的应用程序不是关键任务,但重要的是要知道站点是否关闭,是否需要可靠地进行恢复,无论是重启应用程序,重启服务器还是移动到其他服务器(或其他)。

特定要求



能够设置新环境来接收应用程序。

到目前为止,在我学习时,这一直是手动的,每次完成后,我都会从头开始创建新的Droplet。我希望此过程更加简单(自动化),这样,如果我必须在紧急情况下设置新环境,就可以可靠地做到这一点。尽可能与实时相同,理想情况下是使用连续集成方法(我从未做过)由git push触发的自动化过程。在暂存环境中可以理想地自动推送到实时环境中。实时站点上的应用程序或服务器故障。我认为蓝绿色方法可能对我有用?

我尝试过或考虑过什么?然后在发生更改时手动将新的代码库复制到它。这感觉容易发生人为错误,而且我担心在部署中出错会导致无法恢复的故障。
Docker。我承认,当我了解到Docker时,似乎梦想成真了,但经过一些试验和研究,我对学习和知道如何启动和运行它需要学习多少知识感到望而生畏。可能这是值得的,因为一旦开始工作,风险非常低,但是此刻,这感觉是我对我的时间的一笔大笔投资,超出了我的期望。
Bash脚本。使用它们来设置原始环境以及完成更新应用程序之类的特定任务。我为此担心,因为脚本将是需要测试的代码,而且我担心以这种方式构建可靠的工具集会花费很多时间。具有两个服务器的“蓝绿色”方法的能力,这似乎非常明智。如果我走这条路,我仍然需要能够自动化部署。通过更新破坏实时应用程序,或者无法从故障中恢复的风险),并最大程度地减少了我在设置环境和工作流时需要花费的时间。

#1 楼

我不熟悉Python开发或DigitalOcean,所以我只提供一些指针:


目标是自动化。一切。如何实现这一点实际上取决于您,创建自己的工具并非易事,许多人都这样做。一个具体且相当低的挂果是要运行一个git post-receive钩子,该钩子会部署并重新启动您的测试环境。如果有,其余的应该很简单。
“我担心的是脚本将是需要测试的代码”-担心是没有根据的。毕竟,您每次部署到测试环境时都在测试这些脚本。特别是结合蓝绿色方法,可以使用bash脚本。
“我不喜欢bash。” -然后找到您喜欢的另一种脚本语言。也许尝试Ruby?语言和核心库非常简洁且有据可查,我想说,它很容易学习。或者,只是为了好玩,Go(lang)似乎很适合开发工具任务。最后,就像您似乎喜欢Python一样,您当然也可以执行安装任务。从中,Go的优势在于它可以创建独立的二进制文件,并且本身不需要首先安装复杂的环境,因此引导可能会更容易。
“一个与实时环境尽可能相同的暂存环境”-如果您有一个脚本,可以从头开始创建一个环境,即从一个或多或少的空基础映像中启动一个环境,那么您的环境将是相同的,除了脚本中编码的增量。这就是所有这些的重点。
“将活动站点切换到另一台服务器的方法”-唯一需要考虑的是持久性数据会发生什么。也就是说,您将希望做到这一点,以便可以将应用程序动态链接到不同的持久卷/存储,以便能够来回切换。
老实说,“ Docker-令人生畏”-应当没那么糟。如果您知道如何使用命令行工具(没有GUI工具)从头开始构建环境,那么将其放置在Dockerfile中应该很容易。令人担忧的细节会在调整时出现(即缩小图像大小),但除此之外,它应该还不错。首先以某种方式使它工作,然后找出如何使其变得美丽。好消息是您获得的知识会转移到许多其他环境中。

祝你好运!

#2 楼

感谢您提出的好问题。第一次做时,没有什么是真正琐碎的事,而且我们都曾经是新事物。

我的第一个建议是重新访问docker。尝试一些不同的指南和教程。真的很简单。您有一个被“构建”的docker文件,实际上只是您要在“容器”或“图像”上运行的命令。您将该映像推送到可以是公共或私有的注册表。然后,您可以在主机上运行该映像。 Docker对于node.js和python确实很重要,因为它们有很多依赖关系,有时候有时很难管理它们。如果确实要使用pip,则可以生成一个requirements.txt文件,以将其提供给docker容器。

现在您说您正在使用git,所以我将使用本地git钩子。您可以使用它们来构建docker容器,运行自动化测试,然后部署您的容器。您可以查找有关此主题的许多不同指南和教程。

要管理基础结构,我会使用Terraform。 Terraform很棒,因为您可以按需启动环境并在完成后将其删除。我的建议是从简单开始,一旦您掌握了docker和terraform,就可以尝试进行蓝色/绿色部署。

现在,如果您正在使用Gitlab或愿意进行切换,它还提供免费的ci / cd服务。它包含了许多很酷的功能,并且非常易于使用。我个人将其用于所有应用程序。您可以完全跳过本地git钩子,并在gitlab管道中进行测试,或者保留它们以在本地测试每个提交并使用gitlab进行构建和部署。

我希望这会有所帮助。

评论


使用Docker,我发现有点令人生畏的是在不同容器中具有组件的原理。因此,一个用于应用程序,一个用于Gunicorn,一个用于Nginx,等等。然后,您必须添加其他配置以使它们彼此通信。似乎无法实现具有单个可移植到任何环境的封装容器的目标。但是,由于此回复和@Anoe的建议,建议我再做一次。

–主持人
18年6月3日在8:41

@Auspice这更多是一种“微服务”方法。虽然对于docker容器来说,只有一个进程是一种最佳实践,但我通常不会看到。选中“ Docker方式?”这里github.com/just-containers/s6-overlay。我会亲自使用Ansible调出基础设施。我会使用ansible来调用Terraform来创建它。然后,我将使用ansible更新服务器,安装docker,安装nginx并将其作为服务启动我的docker应用。我将ansible配置nginx代理到应用程序和gunicorn所在的容器。

–利维
18-6-3 at 11:08



#3 楼

发布的答案对帮助我重新思考问题和各种方法非常有帮助。我还没有实现解决方案,但是我已经决定了一种方法,因此我正在记录下来并选择它作为答案。总而言之,它是这样的:

我选择的方法


对于实时环境,我将使用两个运行Ubuntu的虚拟机(可能使用DigitalOcean Droplet),并进行精确配置相同。
我将使用DO中的Floating IP工具采用蓝绿色方法来维护我的两个与Live和Pro-Prod / Backup相同的服务器。 )在我的开发环境中设置为用作暂存环境。此VM的设置将与我的两个实时服务器完全相同。
我将用Python编写一个通用脚本来从头开始设置环境,并将用它来配置我的暂存环境和实时/预-prod对。
我将使用git钩子触发对环境的更新(可能是手动触发)。

驱动此方法的注意事项



Docker:我已经决定反对它。尽管我认真对待表示我应该重新访问的回复(感谢@Levi和@Dan),而且应该没有那么糟糕,但过去我从事太多新事物的经验太多,并意识到我已经堕落了从兔子洞里钻出来,这会耗费时间并且需要一定的时间才能走下去。我认为即使我和另一个人一起工作也会有所不同,但是因为一个人每分钟都完全独立工作是很宝贵的。使用VM演示Swarm功能。能够创建我完全控制的全新环境的想法非常吸引人。
脚本:@AnoE的有用回复提示,我已经进行了一些深入的研究,而且看来Python被认为是脚本编写的可行选择,因为这就是我编写应用程序的原因,因此似乎应该有一些协同作用(如果需要的话)为脚本学习一些新知识,这将是我可能会在编写应用程序时所使用的知识。

我在此方面取得一些进展后将进行更新,如果它出现严重错误,我将承认我也许会错误的选择!)。

2018年10月20日更新。

我开始编写Python脚本,但这通常涉及从Python调用bash命令然后获取回复后,我发现这大大增加了开发时间。经过几周的缓慢进展,我转向了其他地方。我承认我可能走错了路,但是我需要更快的东西。

我最终选择了Vagrant / Ansible / VirtualBox,经过了几个月的等待,我才承认有什么可行的很好,但是经过大量工作,学习了一些新技能(Vagrant和Ansible对我来说是全新的)。然后,我使用Ansible脚本配置了DigitalOcean Droplet,发现它确实很好用。我已经成为Ansible的拥护者,但是即使我(与评论家都同意)它相对易于使用,但它仍然是一种新的范例,而且学习曲线也非常陡峭。我已经在DigitalOcean上以蓝绿色配置了两个单独的Droplet,使用DO浮动IP地址在这两个之间切换,并且在每个应用程序都位于git工作副本内,因此我只需要刷新Master即可更新环境。

我在使浮动IP正常工作时遇到问题,但是我希望尽快解决,然后我将拥有一个运行正常的DevOps环境。

这种方法的最大优势是Ansible的工作方式,一旦工作了,相对容易使其在不同的环境中工作,而使用python脚本可能不那么容易实现(或者至少必须构建

我认为最大的教训是,事情花的时间比我预期的要长,学习新技术总是会带来未知数。这对我来说并不奇怪-但它总是如此,并且作为一个独立的开发人员,这在我身上经常发生。