“XaC”是 可信 DevOps 的基础
0
什么是 DevOps?
DevOps 是一种文化和实践的集合,旨在促进软件开发(Dev)和信息技术运维(Ops)之间的协作和通信,以提高软件交付的速度和质量。
什么是可信 DevOps?
可信 DevOps 是指将安全和可靠性整合到 DevOps 流程中,它进一步强调了在软件开发生命周期的每个阶段中整合安全和合规性的重要性。
以下是可信 DevOps 的一些关键特点:
安全整合:安全措施被整合到开发和运维的每个阶段,而不是作为事后考虑。
自动化:自动化测试和部署流程,确保安全和合规性检查是自动化的,并且是持续集成/持续部署(CI/CD)流程的一部分。
监控和日志:持续监控应用程序和基础设施,以及记录详细的日志,以便在出现问题时进行分析和审计。
合规性:确保开发和运维流程遵守相关的法律、法规和标准。
透明性:团队成员之间以及与利益相关者之间的沟通应该是开放和透明的,以确保每个人都了解安全和合规性的要求。
风险管理:识别和评估与开发和部署相关的潜在风险,并制定相应的缓解策略。
持续改进:持续收集反馈和数据,以改进安全实践和流程。
教育和培训:确保团队成员了解最新的安全威胁和最佳实践,并具备实施可信 DevOps 所需的技能。
协作:鼓励开发、运维和安全团队之间的协作,以确保安全是每个人的责任。
通过实施可信 DevOps,组织能够更快地交付高质量的软件,同时确保安全性和合规性得到妥善管理。
1
XaC 是 Everything as Code 的缩写,可以翻译为“一切皆代码”或“代码化一切”。这个概念强调将基础设施环境、应用程序配置、部署流水线,安全策略等所有元素都以代码的形式进行管理和自动化,以提高效率、一致性和可重复性。
也就是说,XaC 应包含:
制品供应即代码(Artifact as Code, AfaC)
应用配置即代码(Configration as Code。CfaC)
服务依赖即代码(Dependency as Code,DaC)
基础设施即代码(Infrasturcture as Code, iaC)
部署流水线即代码(Pipeline as Code, PaC)
安全策略即代码(Security as Code ,SaC)。
在 DevOps 和云计算领域,这种思想尤为重要,因为它支持持续集成和持续交付(CI/CD)的实践,并且有助于自动化部署和管理复杂的系统环境。
2
随着IaC的兴起,在DevOps中,对能够直接与机器沟通的需求不断增长,这使得开发人员和运维人员能够使用共享的语言来实现和管理基础设施。
这消除了不必要的软件界面层,促进了一种更清洁的方法。还有一种趋势是减少复杂性,远离可以称为软件界面中的“垃圾”。
工程师似乎更喜欢直接交互,而不是增加额外的层来简化命令,有时通过大型语言模型(LLM)接口,工程师可以用口语化的语言进行描述,然后它可以显示用于基础设施的代码。
IaC允许通过机器或直接将代码发送到机器的方式来部署、管理和扩展基础设施。
鉴于其提供直接配置、部署和管理基础设施的倾向,IaC适合于版本控制,并且以这种方式,它还为DevOps 提供了扩展机会。
IaC很重要,因为它为您提供了一种自动化基础设施层部署清单的方法,无论其位置和规模如何。
3
IaC通过机器或直接到机器的代码启用基础设施的部署、管理和扩展。
这与传统方法不同,传统方法涉及通过界面和额外的软件层进行工作。由于其直接的方法,IaC促进了版本控制,并扩展到DevOps或GitOps,提供了扩展机会。
流行的IaC开源配置包括HashiCorp Terraform(及其开源等价物OpenTofu)、Nitric、Pulumi和Red Hat Ansible。
4
通过命令行在各种环境中一致且高效地提供和部署基础设施的使用,IaC非常适合CI/CD。
当IaC应用于生产管道时,组织报告了生产力和资源节省的收益。
然而,并非所有IaC解决方案都是平等的。潜在的IaC用户应该仔细审查特定解决方案是否真的可以改善CI/CD流程。
IaC解决方案应该为CI/CD提供:
- 自动化提供。
- 不可变版本控制,以便使用单个存储库来创建和删除基础设施。
- CI/CD中的测试能力。
- 设置策略的能力。
- 管理安全的能力。
IaC为CI/CD提供的不可变性是“王者之道”,因为它“确保了一致性,清晰的审计跟踪,便于回滚,统一控制安全和合规性,以及整体效率。”
5
IaC提供了一种统一的方法来处理和定义各种配置中的策略。它的优势不仅仅在于声明性方法,还基于工具选择和IaC方法论影响安全管理。
在Pulumi的年度用户大会PulumiUP上,华盛顿信托银行的DevOps工程师Dennis Sauvé在题为“一家银行如何通过基础设施即代码自动化现代化其软件工程”的演讲中,提供了一个关于IaC在银行政策和安全中作用的小型案例研究。
他指出,他如何与开发人员合作“了解他们的云基础设施需求,并协调如何最好地与我的团队和信息安全一起部署这些资源。”
根据Sauvé的说法:“有时与我们的开发团队合作可能具有挑战性。我们的开发团队围绕Scrum框架进行工作安排,而基础设施团队,或者说IT,则更多地使用看板方法框架。这意味着有时我可能有很多带宽来协助开发目标,而其他时候我的基础设施职责必须优先。”
华盛顿信托银行采用IaC的总体目标一直是“消除基础设施可用性作为瓶颈,并将大量开发环境脚手架以预制的基础设施即代码资源和组件的形式交到开发人员手中,”Sauvé说。
自动化部署减轻了基础设施团队手动部署的巨大负担,并“为未来项目创建了可重复和可重用的组件,”Sauvé说。
在华盛顿信托银行决定将IaC纳入他们的部署管道之前,联邦存款保险公司(FDIC)围绕保护客户个人数据的严格规定影响了这一决定,Sauvé说。
正如Sauvé所描述的:“数据泄露对组织和客户有可怕的影响,所有委托给我们的数据都必须被视为机密。之所以这样做,是因为这是正确的事情,因为FDIC要求这样做。鉴于必须保护客户数据,使用基础设施即代码构建云资源提供了一个可以由信息安全团队和基础设施团队审查和改进的蓝图。
6
IaC涉及使用像Ansible这样的工具来管理和自动化IT基础设施。
Ansible需要安装其软件并随后执行命令。第一步涉及创建一个Ansible剧本,它由指导Ansible执行各种任务的YAML指令组成,涵盖部署、网络、服务管理以及安全和策略配置。
以下是一个配置Ansible剧本的YAML指令示例:
地- name: Network Getting Started First Playbook
connection: ansible.netconmon.network_cli
gather_facts: false
hosts: all
tasks:
- name: Get config for W0S devices
yes.vyos.vyos_facts
gather_subset: all
- name: Display the config
debug
msg: “The hostname is {{ ansible_net_hostname }}
and the OS is {{ ansible_net_version }}”
脚本设置完成后,使用以下命令运行它:
ansible-playbook -i vyos.example.net, -u ansible -k -e ansible_network_os=vyos.vyos.vyos first_playbook.yml
7
IaC确实有其局限性——即,它旨在自动化并避免在创建和管理基础设施时需要手动流程。
仅使用基本的开源替代品或工具,如Terraform,可能会有局限性。
因此,自动化这些工具,提供更直接的方式来提供基础设施,或简化它,可以走得更远。
这对于开发人员尤其重要。
例如,使用提供基础设施工作流自动化的工具,IaC可以帮助开发人员以更声明性的方式在代码文件中更好地提供和管理云基础设施。
这个想法是使它对开发人员在云中提供基础设施时更少出错,更不可变。
提供IaC的能力,同时简化该过程——并提供更易于使用的模板,例如Terraform、Ansible或任何其他工具——有助于实现这一目标。
8
一些替代方案正在出现,它们要么增加一层进行封装,以提高自动化,并增加像Terraform或Ansible这样的附加功能,要么寻求替换这些解决方案。
以Terraform的竞争对手Pulumi为例,虽然Terraform的市场份额几乎是Pulumi的10倍,但根据EMA的数据,Pulumi的市场份额增长速度是Terraform的两倍到三倍。这些解决方案,包括Nitric和Pulumi,旨在提供IaC的自动化目标。
Pulumi提供的灵活性,可以选择编程语言是关键。Pulumi的首席执行官和创始人Joe Duffy在Pulumi年度用户大会PulumiUP的主题演讲中说。“例如,今天许多用户不幸地仅限于使用YAML进行部署,情况不应该是这样;开发人员不应该限于一种语言,”Duffy说。
另一方面,Pulumi声称支持所有主要的编程语言,因此提供了更多的选择自由和更直接的方式来为CI/CD和一般提供基础设施。
“Pulumi是你最喜欢的语言中的IaC——熟悉IaC的人可能已经使用过使用特定领域语言或甚至是像YAML或JSON这样的标记语言的其他工具,通常这在开始时是可行的。但是,特别是当我们扩展到现代云架构时,裂缝开始显现,”Duffy说。
“所以,Pulumi的方法确实是采取不同的方法:带来你最喜欢的编程语言,无论是JavaScript还是TypeScript,Python,Go。Pulumi在核心上是多语言的。这意味着你可以利用编程语言的全部丰富性来表达你的IaC。”
9
首先,让我们描述一下GitOps是什么,以及它如何服务于自动化和简化CI/CD以及跨复杂环境(如Kubernetes)的基础设施部署。
Open GitOps,即云原生计算基金会应用交付特别兴趣小组下的GitOps工作组,已经发布了一个精确且共识驱动的GitOps描述。它由一套开源标准、最佳实践和社区为中心的教育组成,帮助组织采用结构化、标准化的方法实施GitOps。它将GitOps原则描述为:
- 声明性:由GitOps管理的系统必须以声明性方式表达其期望状态。
- 版本化和不可变:期望状态以一种强制不可变性和版本控制的方式存储,并保留完整的版本历史记录。
- 自动拉取:软件代理自动从源代码中拉取期望状态声明。
- 持续协调:软件代理持续观察实际系统状态,并尝试应用期望状态。
它的目标是提高云原生部署的可访问性和可管理性,简化与Kubernetes相关的复杂性,并促进更顺畅的操作。这些改进将通过GitOps的持续努力和进步来实现,
甚至可以说基础设施即代码是GitOps——或者至少,它是GitOps工作方式的一个不可分割的部分。
在开发人员方面,无论是仅仅使用一个拉取请求,还是从概念上通过Flux或Argo将应用程序放在存储库中,开发团队都使用IaC命令来实现这一点,使用模板或API。
不可变性部分是IaC方面发挥作用的地方,对于操作人员来说,当应用程序推出时,他们正在更新和部署实际的基础设施。
与此同时,你也得到了自动化,这是GitOps的一个关键方面。一组标准代码模板用于创建、部署等,作为GitOps领域CI/CD的一部分。这是反映IaC的自动化的一部分。当然,这种自动化与GitOps同时发生。