31、基础设施代码交付与团队工作流指南

基础设施代码交付与团队工作流指南

1. 基础设施代码操作流程概述

在基础设施代码的操作中,包含多个关键步骤,这些步骤构成了一个完整的工作流程,确保代码能够顺利地应用到基础设施中。以下是主要步骤的详细介绍:
1. 配置(Configuration) :收集配置参数值,并可能解决值的层次结构问题。
2. 依赖项(Dependencies) :解析并获取库、提供程序和其他代码。
3. 打包(Packaging) :准备代码以便交付,可以将其打包成工件,或者创建或合并分支。
4. 推广(Promotion) :将代码从一个阶段移动到下一个阶段,可以通过标记或移动工件,或者创建或合并分支来实现。
5. 编排(Orchestration) :根据依赖关系,以正确的顺序应用不同的堆栈和其他基础设施元素。
6. 执行(Execution) :运行相关的基础设施工具,根据代码应用的实例组装命令行参数和配置文件。
7. 测试(Testing) :设置并运行测试,包括准备测试夹具和数据,以及收集和发布结果。

2. 配置值的组装问题

在像ShopSpinner这样涉及多个交付环境、多个生产客户实例和多个基础设施组件的系统中,配置值的管理变得复杂。简单的单层配置值,每个组件、环境和客户的组合都需要一个文件,这会导致文件数量众多,并且很多值会重复。

例如,每个客户的 store_name 值必须为每个组件的每个实例设置。团队通常会选择在一个共享值的位置设置该值,并在包装脚本中添加代码以从共享配置和每个组件的配置中读取值。随着需求的增加,还可能需要在给定环境中的所有实例之间共享一些值,从而创建第三组配置。当一个配置项在多个配置文件中有不同的值时,脚本必须按照优先级层次结构来解决。

这种参数层次结构的编码比较混乱,人们在引入新参数、配置正确的值以及跟踪和调试任何给定实例中使用的值时会遇到困难。使用配置注册表也会带来复杂性,无论是通过包装脚本处理注册表不同部分的值解析,还是使用脚本来预先设置注册表值,都难以设置和跟踪任何给定参数值的来源。

3. 简化包装脚本的方法

为了简化包装脚本,避免团队在处理脚本中的错误上花费过多时间,可以考虑以下几个方面:
1. 拆分项目生命周期 :单个脚本不应处理项目生命周期中的构建、推广和应用阶段的任务。应为每个活动编写和使用不同的脚本,并确保清楚了解信息在这些阶段之间传递的位置,实现这些阶段之间的清晰边界,就像任何API或合同一样。
2. 分离任务 :将管理基础设施涉及的各种任务分开,如组装配置值、打包代码和执行基础设施工具。定义这些任务之间的集成点,并保持它们之间的松散耦合。
3. 解耦项目 :协调多个项目操作的脚本应与在项目内执行任务的脚本分开,并且任何项目的任务都应能够独立执行。
4. 保持包装代码的通用性 :脚本不应了解它们所支持的项目的任何信息,避免在包装脚本中硬编码依赖于基础设施代码的操作。理想的包装脚本是通用的,可用于特定类型的任何基础设施项目。

同时,将包装脚本视为“真正的”代码,使用像shellcheck这样的工具进行测试和验证,并应用良好的软件设计规则,如组合规则、单一职责原则和围绕领域概念进行设计。

4. 团队工作流特点

使用代码来构建和更改基础设施是一种与传统方法截然不同的工作方式。基础设施即代码改变了参与设计、构建和管理基础设施的每个人作为个体和团队的工作方式。有效的基础设施即代码管理流程具有以下特点:
1. 自动化流程便捷 :自动化流程是团队成员进行更改的最简单、最自然的方式。
2. 质量和合规保障 :人们有明确的方法来确保质量、可操作性以及与政策的一致性。
3. 系统更新轻松 :团队能够轻松地保持系统的最新状态,在适当的地方保持一致性,在需要变化的地方进行清晰和良好的管理。
4. 知识嵌入代码 :团队对系统的知识嵌入在代码中,其工作方式在自动化中得到体现。
5. 错误易发现和纠正 :错误能够迅速可见并易于纠正。
6. 代码更改安全 :更改定义系统的代码以及测试和交付该代码的自动化过程既容易又安全。

一个好的自动化工作流应该足够快,以便在紧急情况下能够快速将修复应用到系统中,避免人们手动进行更改;同时应该足够可靠,让人们更信任它而不是手动调整实时系统的配置。

5. 团队角色与职责

在大多数基础设施系统中,涉及多个角色,这些角色不一定一一对应到个人,有些人可能承担多个角色,有些人可能与他人共享角色:
1. 用户(Users) :直接使用基础设施的人,在许多组织中通常是应用程序团队,他们可能开发应用程序,也可能配置和管理第三方应用程序。
2. 治理专家(Governance specialists) :为环境在各个领域(包括安全、法律合规性、架构、性能、成本控制和正确性)制定政策的人。
3. 设计师(Designers) :设计基础设施的人,在一些组织中可能是架构师,可能分为不同的领域,如网络或存储。
4. 工具制造者(Toolmakers) :提供服务、工具和组件供其他团队用于构建或运行环境的人,例如监控团队或创建可重用基础设施代码库的开发人员。
5. 构建者(Builders) :构建和更改基础设施的人,他们可以通过控制台或其他接口手动操作,也可以通过运行脚本或工具来应用基础设施代码。
6. 测试人员(Testers) :验证基础设施的人,不仅包括质量分析师(QAs),还包括为安全或性能等治理领域测试或审查系统的人。
7. 支持人员(Support) :确保系统继续正确运行并在出现问题时进行修复的人。

6. 编写基础设施代码的不同方式

不同组织对于谁来编写和编辑基础设施代码有不同的答案:
1. 构建者编写代码 :一些组织试图保持传统的流程和团队结构,构建(可能还包括支持)基础设施的团队使用基础设施即代码工具来优化其工作。用户请求环境,构建团队使用其工具和脚本来为他们构建。
2. 用户编写代码 :许多组织允许应用程序团队定义其应用程序使用的基础设施,这使用户需求与解决方案相匹配。但这要么要求每个团队都有强大的基础设施专业知识人员,要么需要简化基础设施定义的工具,而工具的挑战在于确保满足应用程序团队的需求,而不是限制他们。
3. 工具制造者编写代码 :专业团队可以创建平台、库和工具,使用户能够定义他们需要的基础设施。在这种情况下,用户倾向于编写更多的配置而不是代码。工具制造者和构建者编写代码的区别在于自助服务,构建团队根据用户的请求编写和使用代码来创建或更改环境,而工具制造者团队编写的代码用户可以自行使用来创建或更改自己的环境。
4. 治理和测试人员编写代码 :制定政策和标准的人以及需要确保更改的人可以创建工具,帮助其他人验证自己的代码。他们可能成为工具制造者或与工具制造者密切合作。

7. 价值流映射改进工作流

价值流映射是一种有用的方法,可以分解前置时间,让你了解时间都花在了哪里。通过测量各种活动(包括等待)所花费的时间,可以将改进重点放在影响最大的领域。

例如,团队实施自动化将服务器配置时间从8小时缩短到10分钟,这是服务器配置时间的大幅减少(98%)。但如果用户通常需要等待10天才能获得新服务器,那么总减少量仅为10%。如果服务器请求工单平均在队列中等待8天,那么应该将精力集中在这方面。

价值流映射使完成一项行动的时间可见,从而找到最佳的改进机会。在进行改进时,继续测量端到端的前置时间和其他指标(如故障率),以避免对流程的某一部分进行优化而导致整个流程变差。

8. 应用代码到基础设施的问题与解决方案

8.1 从本地工作站应用代码的问题

许多人在开始进行基础设施自动化时,会从命令行在本地工作环境中运行工具。然而,从本地工作站应用基础设施代码存在问题。对于其他人不使用的测试实例,从命令行应用代码可能有用,但对于共享的基础设施实例(无论是生产环境还是交付环境),会出现问题。

例如,有人可能在应用代码之前对本地版本的代码进行更改,如果在将更改推送到共享存储库之前应用代码,那么其他人将无法访问该版本的代码,这会给需要调试基础设施的人带来问题。如果应用本地版本代码的人没有立即推送更改,其他人可能会拉取并编辑旧版本的代码,当他们应用该代码时,会撤销第一个人的更改,这种情况很快会变得混乱且难以解决。

需要注意的是,像Terraform的状态锁定这样的锁定解决方案并不能防止这种情况,锁定只能阻止两个人同时将代码应用到同一个实例,但不能阻止人们应用不同版本的代码,只要他们依次等待。

8.2 从集中式服务应用代码的优势

使用集中式服务(无论是自己托管的应用程序还是第三方服务)来将基础设施代码应用到实例是更好的解决方案。该服务从源代码存储库或工件存储库中拉取代码,并将其应用到基础设施,实施清晰、可控的过程来管理应用哪个版本的代码。

如果两个人拉取并编辑代码,他们在将代码与工具使用的分支集成时必须解决代码中的任何差异。出现问题时,很容易查看应用了哪个版本的代码并进行纠正。

集中式服务还能确保基础设施工具的一致运行,每次使用相同版本的工具、脚本和支持实用程序。它与基础设施代码跨环境交付的管道模型很好地契合,管道中用于协调更改的工具或服务负责运行基础设施工具,将最新版本的代码应用到每个环境。

此外,集中式服务迫使团队将整个过程自动化。如果从工作站运行工具,很容易留下一些手动步骤,而集中式服务要求确保任务完全自动化。

8.3 运行基础设施工具的集中式服务选项

有多种集中式服务可用于应用基础设施代码:
1. 通用工具 :如果使用像Jenkins这样的构建服务器或像GoCD或ConcourseCI这样的持续交付(CD)工具,可以实现作业或阶段来执行基础设施工具。这些工具支持管理来自源代码存储库的不同版本的代码,并可以在阶段之间推广代码。这些多功能工具还便于集成应用程序、基础设施和系统其他部分的工作流,可以使用这些服务的自托管实例或托管服务。
2. 专业产品或服务 :一些供应商提供专门用于运行基础设施工具的产品或服务,例如Terraform Cloud、Atlantis和Pulumi for Teams。WeaveWorks提供的Weave Cloud可以将基础设施代码应用到Kubernetes集群。

以下是基础设施代码操作流程的mermaid流程图:

graph LR
    A[配置] --> B[依赖项]
    B --> C[打包]
    C --> D[推广]
    D --> E[编排]
    E --> F[执行]
    F --> G[测试]

以下是团队角色及其职责的表格:
| 角色 | 职责 |
| — | — |
| 用户 | 直接使用基础设施,可能开发或管理应用程序 |
| 治理专家 | 为环境制定政策,涵盖安全、合规等多个领域 |
| 设计师 | 设计基础设施,可能按领域细分 |
| 工具制造者 | 提供服务、工具和组件,支持其他团队工作 |
| 构建者 | 构建和更改基础设施,可通过多种方式操作 |
| 测试者 | 验证基础设施,包括不同治理领域的测试 |
| 支持人员 | 确保系统正常运行,处理故障修复 |

综上所述,在基础设施代码的交付和团队工作流中,需要合理管理配置值、简化包装脚本、明确团队角色和职责、利用价值流映射改进工作流,并选择合适的方式将代码应用到基础设施,以实现高效、可靠的基础设施管理。

9. 基础设施代码交付流程总结

基础设施代码交付是一个复杂且严谨的过程,它涉及到多个关键步骤和环节,每个步骤都对最终的交付结果有着重要影响。以下是对整个交付流程的总结:
1. 配置管理 :合理收集和管理配置参数值,解决值的层次结构问题,避免因配置混乱导致的错误和难以维护的情况。可以采用共享配置和按优先级层次结构解决配置冲突的方法。
2. 依赖处理 :准确解析和获取所需的库、提供程序和其他代码,确保代码的正常运行。
3. 打包与推广 :将代码打包成合适的工件,并通过标记或移动工件、创建或合并分支等方式将代码从一个阶段推广到下一个阶段。
4. 编排与执行 :根据依赖关系,以正确的顺序应用不同的堆栈和其他基础设施元素,并运行相关的基础设施工具,组装命令行参数和配置文件。
5. 测试验证 :设置并运行全面的测试,包括准备测试夹具和数据,收集和发布测试结果,确保代码的质量和稳定性。

10. 团队协作与沟通的重要性

在基础设施代码的工作流程中,团队协作和沟通至关重要。不同角色的人员需要密切配合,确保信息的及时传递和问题的及时解决。以下是一些团队协作和沟通的要点:
1. 明确角色和职责 :每个团队成员都应该清楚自己的角色和职责,避免职责不清导致的工作混乱。
2. 建立有效的沟通机制 :可以通过定期会议、即时通讯工具、代码审查等方式,确保团队成员之间的信息畅通。
3. 促进知识共享 :团队成员之间应该分享自己的经验和知识,提高整个团队的技术水平和解决问题的能力。
4. 共同解决问题 :当遇到问题时,团队成员应该共同协作,分析问题的原因,并寻找解决方案。

11. 持续改进的工作理念

基础设施代码的工作流程需要不断地进行持续改进,以适应不断变化的业务需求和技术环境。以下是一些持续改进的方法:
1. 定期评估工作流程 :定期对工作流程进行评估,找出存在的问题和不足之处,并制定改进计划。
2. 收集反馈意见 :收集团队成员和用户的反馈意见,了解他们对工作流程的满意度和改进建议。
3. 引入新技术和工具 :关注行业的最新发展动态,引入适合的新技术和工具,提高工作效率和质量。
4. 进行实验和创新 :鼓励团队成员进行实验和创新,尝试新的工作方法和技术,为工作流程的改进提供新的思路。

12. 风险管理与应对措施

在基础设施代码的工作流程中,存在着各种风险,如代码错误、配置冲突、依赖问题等。以下是一些风险管理和应对措施:
1. 风险识别 :定期对工作流程进行风险评估,识别可能存在的风险。
2. 风险分析 :对识别出的风险进行分析,评估其发生的可能性和影响程度。
3. 风险应对 :根据风险分析的结果,制定相应的应对措施,如备份数据、进行代码审查、加强测试等。
4. 应急响应 :建立应急响应机制,当出现风险事件时,能够迅速采取措施,减少损失。

13. 未来发展趋势展望

随着技术的不断发展,基础设施代码的工作流程也将不断演变。以下是一些未来可能的发展趋势:
1. 自动化程度提高 :更多的环节将实现自动化,减少人工干预,提高工作效率和准确性。
2. 云原生技术的广泛应用 :云原生技术将在基础设施代码的工作流程中得到更广泛的应用,如容器化、微服务等。
3. 人工智能和机器学习的应用 :人工智能和机器学习技术将用于代码分析、故障预测等方面,提高工作的智能化水平。
4. 安全意识的增强 :随着安全问题的日益突出,基础设施代码的安全将得到更多的关注,安全措施将更加完善。

以下是基础设施代码交付流程的详细步骤列表:
1. 收集配置参数值,解决值的层次结构问题。
2. 解析和获取所需的库、提供程序和其他代码。
3. 将代码打包成工件。
4. 通过标记或移动工件、创建或合并分支等方式推广代码。
5. 根据依赖关系,编排和应用不同的堆栈和其他基础设施元素。
6. 运行基础设施工具,组装命令行参数和配置文件。
7. 设置并运行测试,准备测试夹具和数据,收集和发布测试结果。

以下是团队协作沟通的mermaid流程图:

graph LR
    A[明确角色职责] --> B[建立沟通机制]
    B --> C[促进知识共享]
    C --> D[共同解决问题]

总之,基础设施代码的交付和团队工作流是一个复杂而又关键的领域。通过合理的流程设计、有效的团队协作、持续改进的工作理念和完善的风险管理措施,可以实现高效、可靠的基础设施管理,为业务的发展提供有力的支持。同时,关注未来的发展趋势,不断适应技术的变化,将有助于在这个领域保持领先地位。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值