原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-2-configure-a2dfc11f6f7d
原文作者:Igor Kantor
翻译君:CODING 戴维奥普斯

前情提要

在第一篇文章中,我对 DevOps 工程师的工作定义是搭建一个数字化的全自动流水线来高效地将代码从编写环节部署到生产环境中:《DevOps 工程师成长日记系列一:必备知识与技能组合》

但是高效地完成这项工作首先需要有一定的基础,如下图:

同时还要对各类工具和使用这些工具所需的技能有所了解,才能做到事半功倍。

温馨提示:我们的目标是快速地学习下图中蓝色部分的内容,按从左到右的顺序,然后开始学习紫色的部分,同样是从左到右。整个流程分为六个模块,顺利的话每个月完成一个模块的学习,刚好六个月学完。

在这篇文章中我们会 cover 整个流水线中的第一部分:配置(Configure)。

综述

所以在配置阶段到底是要我们做什么呢?

简而言之,就是我们写的代码需要跑在服务器上,在配置阶段我们所要做的就是在服务器上搭建适合我们的代码运行的基础环境。

在过去配置基础环境的过程是一个及其冗长、到处是坑、重复性高的痛苦经历。

现在由于我们拥有了云服务器这种高级服务,所有的基础环境设置都可以通过点击完成,当然有时候可能需要很多次点击。

但是,我们发现通过点击来实现配置环境也不是一个好主意,因为同样的问题仍然存在:

  1. 还是到处是坑(human error 无法避免)
  2. 没法控制版本(点击没办法存储在 git 里)
  3. 重复性高(更多的机器 = 更多次的点击)
  4. 同时还没法测试(完全黑箱,不知道点击后会不会把所有东西弄乱)

想象一下,当你需要给你的 dev 环境、QA 环境、Staging 环境和各个地区不同的生产环境做配置时所需的工作量,而且这项工作很快就会变得非常烦人和冗长。

所以我们就需要一种新的方式来完成这个工作,而这个新的解决方案就是 “基础设施即代码(Infrastructure as Code)“ 这也是本文关于 DevOps 中配置环节的重点。

基础设施即代码(Infrastructure as Code)的最佳实践即所有归为计算资源编排工具类的工作都必须使用代码来完成。这里的计算资源指的是为了让代码跑起来所需要的一切,比如:服务器、存储、网络、数据库等等。

此外,这意味着我们部署基础设施的方式从各种点击变为:

  1. 在 Terraform 中编写所需的基础架构状态
  2. 将其存储在我们的源代码版本控制中
  3. 通过正式的 Pull Request 流程征求反馈
  4. 测试一下配置
  5. 通过执行代码来配置所需的资源

为什么选用 Terraform 而不是其他的呢?

你现在可能会问为什么要选用 Terraform 而不是 Chef 或者 Puppet 或者 Ansible 或者 CFEngine 或者 Salt 或者其他什么呢?

好问题,而且这个问题已经在各个社区翻来覆去讨论过无数遍了,简而言之,我认为你应该学习 Terraform 有以下原因:

  1. Terraform 现在很火,这代表着会有很多相关的工作机会
  2. 相对于其他的来说,它比较容易学习
  3. 它有跨平台支持

当然这绝不代表着你选择了其他的工具就没法玩转了,相信每个工程师都有着自己对于工具的理解和选择。

SIDE NOTE:这个领域正在经历迅速发展并且可能会让人困惑,所以我想花几分钟时间谈谈最近的一些历史,以及我看到事情在往哪里发展。

传统意义上来说,Terraform 和 CloudFormation 这类工具是用来编排基础设施的,而其他像 Ansible 这类的工具是用来做配置的。

你可以想像成 Terraform 是一个打地基的工具,然后 Ansible 在地基上盖房子,在帮助你的代码部署到相应的环境。

换句话说,通过 Terraform 来创建虚拟机,然后使用 Ansible 来配置和部署应用,过去都是这么搭配操作的。

然而,工具发展到现在,其实 Ansible 能干的事 Terraform 基本上也能做了,反之亦然。不过也别让这些事儿烦你,只需要知道现在 Terraform 已经是这个领域最重量级的选手,所以强烈推荐从 Terraform 开始学习。

事实上,Terraform + AWS 已经成为最火的技术需求之一了。

不可变基础设施(Immutable Infrastructure)

实际上,我预测 Ansible 这类配置管理工具的重要性会降低,而 Terraform 或 CloudFormation 等基础设施编排工具的重要性将会提高。

为什么呢?正是因为不可变基础设施(Immutable Infrastructure)概念的出现。

不可变部署是指永不改变已部署的基础架构的做法。换句话说,你的部署单元是 VM 或 Docker 容器,而不是一段代码。因此,你不会将代码部署到一组静态虚拟机,而是部署整个已经编译了代码的 VM。

不可变基础设施中所谓的不可变,即安装一次,不做修改,用过即扔。有点像一次性产品,或者可以称为即抛型。

不再需要给生产环境中的机器打补丁,直接部署一个新的已经打好补丁的机器就好了。

也没有必要区别生产环境和编译环境中 VM,所有的机器在不可变基础设施概念下都是一样的。

实际上,您可以安全地禁用对所有生产环境机器的所有 SSH 访问,因为已经没有任何事情可做 - 没有要更改的设置,没有要查看的日志。

如果能正确的使用,这是一个非常强大的模式,所以我强烈推荐!

注意:不可变部署要求将配置与您的代码分开。请阅读 12 Factor App 宣言( https://12factor.net/ ),其中详细介绍了这一点(以及其他很棒的想法!)。这是 DevOps 从业者必读的内容。

代码与配置的分离非常重要 - 你也不希望每次轮换数据库密码时还得重新部署整个应用程序堆栈。所以,请确保应用程序能从外部配置存储(SSM / Consul / etc)中提取这些配置。

此外,您可以很容易地看到,随着不可变部署的兴起,像 Ansible 这样的工具扮演的角色就变得不那么突出了。原因是,现在只需要配置一台服务器并将其作为扩展组的一部分进行多次部署就可以实现大规模的自动化配置了。

或者,如果您正在使用容器,那么你应该从内心渴望使用不可变部署的。你肯定不希望开发容器与 QA 容器和生产容器不同。并且希望在所有环境中使用完全相同的容器。这可以避免配置偏差,并在出现问题时简化回滚。

除了容器之外,对于那些刚刚开始学习的人来说,使用 Terraform 配置 AWS 基础设施是一个教科书级的 DevOps 实践模式,也是成长为 DevOps 工程师的必经之路。

但是如果我需要查看日志来解决问题怎么办?好吧,您将不再登录虚拟机来查看日志,而是查看集中式日志管理的基础设施来解决问题。这同样使得你可以完全禁用远程访问,让环境变得更加安全。


看到我自信的微笑了么

总而言之,我们的全自动 “DevOps” 之旅始于配置运行我们的代码所需的计算资源。实现这一目标的最佳方法是通过不可变部署。

最后,如果你还好奇从什么地方开始的话,就去试试 Terraform+AWS 的组合吧,这将是一个很好的起点。

译后记

对于国内的开发者来说,可以选择 Terraform + 腾讯云的组合尝试,具体可以参考 https://cloud.tencent.com/developer/article/1067230 这篇文章中提到的方式。

我们相信,在企业数字化转型落地过程中,DevOps 是企业软件开发模式革新的重要支柱。
CODING 作为国内领先的 DevOps 解决方案提供商,支持从需求到部署的研发全流程管理,涵盖了项目管理、代码管理、持续集成、制品库管理、测试管理、部署管理、缺陷管理、知识管理,帮助企业轻松将创意转化为创收。CODING 也会持续关注并分享软件研发领域最新理念与技术,与 DevOps 工程师一起成长。

DevOps 工程师成长日记系列二:配置的更多相关文章

  1. DevOps 工程师成长日记系列一:必备知识与技能组合

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-366097df7737 ...

  2. DevOps 工程师成长日记系列四:打包

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-4-packag ...

  3. DevOps 工程师成长日记系列三:版本

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-3-versio ...

  4. DevOps 工程师成长日记系列五:部署

    原文地址:https://medium.com/@devfire/how-to-become-a-devops-engineer-in-six-months-or-less-part-5-deploy ...

  5. 深入浅出Mybatis系列二-配置简介(mybatis源码篇)

    注:本文转载自南轲梦 注:博主 Chloneda:个人博客 | 博客园 | Github | Gitee | 知乎 上篇文章<深入浅出Mybatis系列(一)---Mybatis入门>, ...

  6. iBatisnet系列(二) 配置运行环境和日志处理

    http://hjf1223.cnblogs.com/archive/2006/04/24/383119.aspx 刚爬完鼓山回来,想到这篇刚刚开始,不敢怠慢,洗完澡休息一下就到电脑旁边来了.现在我开 ...

  7. ANDROID Porting系列二、配置一个新产品

    ANDROID Porting系列二.配置一个新产品 详细说明 下面的步骤描述了如何配置新的移动设备和产品的makefile运行android. 1.         目录//vendor/创建一个公 ...

  8. ldap配置系列二:jenkins集成ldap

    ldap配置系列二:jenkins集成ldap jenkins简介 jenkins是一个独立的.开放源码的自动化服务器,它可以用于自动化与构建.测试.交付或部署软件相关的各种任务. jenkins官方 ...

  9. DevOps工程师的成长路线图

    DevOps工程师的成长路线图 我们推崇的是 Reducing the gap between Devs and Operation teams. 来自kamranahmedse you built ...

随机推荐

  1. 50行Python代码实现视频中物体颜色识别和跟踪

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 机器学习与统计学 PS:如有需要Python学习资料的小伙伴可以加 ...

  2. android studio节省C盘空间的配置方法

    近期发现C盘空闲空间剩余不多了,经过检查发现在C:\Users\<电脑用户名>\的目录下,有这两个文件夹空间比较大,这两文件夹分别是 .AndroidStudioPreview3.2(不同 ...

  3. Word List 1

    前言 图片均来源网络 文章目录 前言 1.1 Super computer 1.2 Mainframe 1.3 Server 1.4 Desktop PC 1.5 Notebook or Laptop ...

  4. python进程池和进程锁

    1.进程锁:from multiprocessing import Process, Lock def f(l, i): l.acquire() print('hello world', i) l.r ...

  5. ThinkPHP数据库驱动之mysql事物回滚

    1.开启事务方法 startTrans()2.事务提交方法 commit()3.事务回滚方法 rollback() 用法例子: $order = M(‘order’); $allAdded = tru ...

  6. poj 1852 ants 题解《挑战程序设计竞赛》

    地址  http://poj.org/problem?id=1852 题目描述 Description An army of ants walk on a horizontal pole of len ...

  7. mysql 经典练习题上

    MY SQL 三张表 emp 表, 字段empno, ename, job, mgr, hiredate, sal, comm, deptno dept表 , 字段 deptno, dname, lo ...

  8. Go 循环 (for)

    循环类型 for: for a := 0; a < 10; a ++{ fmt.Println(a) } 在执行结束后 a == 10 while: a := 0 for a < 10{ ...

  9. json解析模块

    json.loads(json) 把json格式的字符串转为Python数据类型 html_json = json.loads(res.text) json.dumps(python) 把 pytho ...

  10. React: React的属性验证机制

    一.简介 在开发中,属性变量类型的验证,几乎是任何语言都必须关注的问题,因为如果传入的数据类型不对,轻者程序运行仅仅是给出警告⚠️,严重的会直接导致程序中断,APP闪退或者web页面挂掉,这是很严重的 ...