基础设施即代码:从手工到自动化的跃迁
IT系统运行离不开服务器、网络和存储这些底层硬件基础设施的支持,因此需要对这些基础设施进行管理,比如,设备的启停、网络的配置、软件的安装和升级等,这些工作复杂而且琐碎,一旦出错,很可能导致其支持的各种业务系统无法正常运行。
很长时间以来,基础设施这些管理工作依赖于管理员通过命令行或其他界面进行操作。随着IT设备数量的不断增加,IT系统越来越复杂,变化越来越频繁,停止和启动它们的频率也越来越高。如果继续采用手动,意味着管理员可能每天要人工登录和修改数百次,这是不现实的,根本适应不了大规模部署的要求。特别是当单体数据中心规模从几十台增加到上万台、10万台甚至更多之后,以自动化替代传统手工方式成为必然。这正是基础设施即代码(Infrastructure as Code,IaC)出现最重要的原因。当然,IaC不止是以自动化替代手工提高了工作效率,它还带来了环境一致性、可复制性以及可追溯性等诸多优点。可以说,IaC开启了基础设施管理的一个新世界,它让基础设施的管理也像软件开发一样,是基础设施管理和运维从手工到自动化最终到无人化这一进化路径上的一次重要跃迁。
为了帮助大家了解IaC,IaC到底有哪些好处,它和时下流行的DevOps、AIOps是否有关系?我们邀请了专家景显强对此相关话题进行了解答。
景显强是红帽资深解决方案架构师、RHCA认证。曾就职华为、SUSE等企业,有多年操作系统研发及运维经验,同时在数据中心运维方面有多年经验。目前,景显强在红帽软件(北京)有限公司负责红帽软件的相关产品及解决方案,主要针对Linux操作系统、分布式存储、IaaS云、PaaS云、自动化运维等领域提供技术和方案建设规划,为企业提供以红帽产品为中心的解决方案建设指导,帮助企业实现数字化转型。
以下为本次访谈内容。
红帽资深解决方案架构师景显强
1. 何谓基础设施即代码(IaC),为什么会提出这个概念?它要解决什么问题?
基础设施即代码 (IaC) 是通过代码的方式来管理和配置基础设施,取代以往的手工操作基础设施。提出这个概念的灵感来自软件开发的最佳实践经验。传统的基础设施管理方法是人工的手动处理模式,不仅仅效率低下,而且还有很多人为操作的风险,比如误操作。同时,对基础设施的配置更改需要文档记录,如果没有做好配置更改记录,可能带来另外一些重复性操作的风险。另外,随着虚拟化和云平台的引入,企业的基础设施变得很复杂,也引入了很多工具和平台,虽然能在基础设施的提供和管理上增加部分效率,但是对于环境的一致性保证以及在数分钟内实现特定场景下基础设施就绪是很难实现的。因此需要一种全新的管理方法,而IaC借助了软件开发中的代码管理经验,通过代码描述基础设施的配置及变更,再执行代码完成配置和变更。
只要我们编写好一套代码来描述对基础设施的操作,便可以对这些代码进行管理和维护,比如将其存放在代码版本管理工具git中,这样只要需要用到这段代码的时候,就从git中将其check out出来使用。如果需要对这段代码进行更改,git也会记录代码更改的所有记录,实现了版本控制。通过这种方式来管理基础设施,能保证部署的环境一致性,实现了同一代码部署多套相同环境的要求。
IaC主要解决的问题就是基础设施提供的效率和一致性问题。我们可以将基础设施作为代码来部署,可以实现版本跟踪,也能在很短的时间内提供一套全新的相同环境。如果我们的操作需求很复杂,可以将基础设施划分为模块,然后对每个模块分别实现代码方式描述,在需要使用的时候,可以通过自动化以不同方式组合这些模块,进而实现复杂场景的快速响应。
2. IaC的主要客户是哪些,它能带来哪些好处?
对于拥有大量IT基础设施环境的企业都可以考虑IaC,比如拥有大量服务器、存储、网络设备、操作系统、虚拟化平台、私有云平台、公有云平台、容器云平台甚至是混合云架构下的混合平台的企业都应该考虑IaC,尤其是在这些基础设施上有频繁操作需求的,比如对变更、新业务系统上线、基础环境制备要求更高响应速度的企业更应该考虑使用IaC。
使用IaC能带来以下几方面的好处:
1) 提高开发速度。开发业务代码需要依赖基础设施环境,如果基础设施能快速就位,快速响应变更,并行执行任务,就会使开发效率得到提高。
2) 保证环境一致性。使用相同的代码部署出来的环境一定是相同的,对所纳管的环境变更也一定是一致的。
3) 自动化的处理。当代码借助自动化工具开始执行,执行期间不需要人为干预,完全自动化,避免了人工手动操作带来的弊端。
4) 降低成本。对于运维成本,环境使用成本,人力成本都能降低。
5) 降低错误发生率。由于是自动化方式处理,代码的变更和版本控制有审核,会大大降低人为操作的失误。
6) 进行多元化整合。对于复杂场景下的基础设施提供,需要依赖很多组件或者软件,通过IaC能将多系统、多平台在统一代码中进行描述,实现多系统、多平台的整合。
7) 操作过程可审计。在经过测试后的代码上线使用时,拥有执行过程记录,可回溯以往的执行事件。
8) 可以实现自服务。开发人员处理业务需求的时候,可以通过自服务门户集成IaC,这样只需要审核通过后,开发人员即可以自我实现环境的上线,大大降低了对基础设施管理员的依赖。
3. 实现IaC需要做哪些准备工作?IaC落地的主要障碍有哪些?
如果要采用IaC,这里有些最佳实践经验可以分享给大家。最好提前做好以下准备:
1) 使用具有可分支管理、安全、集成的源代码管理 (SCM),可以考虑使用git。
2) 选择经过仔细研究和理解的工具,为编写的基础设施代码组成自动化引擎,例如ansible或者terraform 等。最终用户团队能够理解和使用这些工具。
3) 使用相关工具后,要在执行后能快速获得基础设施状态反馈,以便了解执行状态。
4) 制定开发人员和基础设施团队协作流程,制定双方认可的标准,使提供的基础设施环境能保证业务成功上线。
5) 有良好的测试环境,保证生产和测试场景下的环境一致性。
6) 要有一个安全的前端,包括带有凭证管理的权限管理(RBAC)。
7) 可以迭代完善代码,测试一次,快速失败,然后继续小步快跑前进。
IaC落地的主要障碍有以下几个:
1) 企业服务器规模较小,管理工作相对较少,需求不强烈。
2) 害怕自动化,执行过程不放心。
3) 团队害怕学习新技术或者编写代码维护基础设施。
4) 企业内部管理流程限制,权限不足,审计要求,无法打通多组件。
4. IaC如何工作的?有哪些工具可以帮忙?
IaC的本质是通过代码去调用管理工具提供的API接口来对设备进行操作。最简单的IaC工作过程如下图所示。主要分为5个步奏:1. 编写代码(分支并行开发);2. 功能测试; 3. 提交代码; 4. 变更申请;5. 批准后执行代码进行环境部署。
常见的IaC工具有如下几个:Ansible、Terraform、AWS cloudformation、Azure Resource Manager、Google Cloud Deployment Manager、Chef、Puppet、SaltStack。
5. IaC与自动化运维、AIOps、DevOps有什么关系?
IaC是针对基础设施进行管理,它的落地是需要采用自动化工具对基础设施环境进行操作,具体的操作方法是通过编写代码的方式实现,对基础设施的变更操作只需要修改代码即可完成。而自动化运维的维度不仅仅局限在基础设施上,因此他们是两个不同的维度,IaC的落地要借助自动化运维的方法。
AIOps是在传统运维的基础上引入人工智能,通过大数据分析或者机器学习等方法来提前感知运维状态,进而采用动态的方式调整相关组件或者基础设施。因此其维度更广,IaC可以被AIOps利用,例如在发现业务性能瓶颈时,需要对其后端服务器进行扩容,这样可以提前写好IaC针对基础设施扩容的代码,然后AIOps将这段代码调用起来,配合其他的后续自动化处理任务,共同完成一次业务扩容的智能运维操作。
DevOps是近年来非常受欢迎的一套方法论,追求的是开发和运维一体化,从而加入软件上线速度。在DevOps流程中IaC的作用是支持开发环境和生产环境的快速交付。
6. 业务全部上公有云后,是否还需要IaC?
公有云提供了业务运行环境和通用运维场景的管理,比如保证了服务器的可用性等,但是并不具备快速提供特定应用的一致的运行环境,IaC正好解决了公有云上的不足之处,提前规划好IaC,有利于用户更好地使用公有云环境。
7. 红帽在IaC的落地上能发挥什么作用?
红帽在IaC建设上能提供全球一流的产品(Red Hat Ansible Automation Platform)和技术服务,同时能提供全球的经验并指导用户落地和掌握IaC方案,包括IaC的整体方案设计及落地及后续的维护和相关培训,保证用户能顺利掌握IaC。
8. 您认为目前市场对这个概念的认可程度如何?
从国内市场来看,对IaC的采纳有行业属性的区分,金融行业相对制造行业要更超前一些,虽然没有全面开展IaC的落地,但是在某些场景下已经通过自动化的方式向IaC迈进,一些IaC工作正是以自动化的名义在进行。红帽在当前国内市场上所推广的自动化方案中,大部分都是基于IaC思想,旨在帮助客户更高效的管理基础设施,同时为客户提供培训,保证能力掌握。