一、前言
实现多云管理的基础设施即代码的工具包括Terraform
、Pulumi
等等,Terraform
更为流行,使用更加广泛。在使用Terraform
管理基础设施时,有一个最大的痛点:“配置语法太过简单,导致配置繁琐,需要额外地学习HasiCorp
创造的表达式语言DSL-HCL
”。作为后起之秀,也许使用Pulumi
能帮助我们解决这个问题。
二、what is Pulumi
Pulumi 是一个满足基础设施即代码思想的自动管理平台,使用 Python/TypeScript/Go/Dotnet等众多常见的开发语言编写好声明式的资源配置,就能实现一键创建/修改/销毁各类云资源。其可通过下载的 CLI、运行时、库和托管服务协同工作,以提供一种可靠的方式来供应、更新和管理云基础架构。下面的代码演示使用Python语言编程创建云资源,是不是对于研发人员很友好,可读性很强。
import pulumi
import pulumi_aws as aws
size = 't2.micro'
ami = aws.get_ami(most_recent="true",
owners=["137112412989"],
filters=[{"name":"name","values":["amzn-ami-hvm-*"]}])
group = aws.ec2.SecurityGroup('webserver-secgrp',
description='Enable HTTP access',
ingress=[
{ 'protocol': 'tcp', 'from_port': 22, 'to_port': 22, 'cidr_blocks': ['0.0.0.0/0'] }
])
server = aws.ec2.Instance('webserver-www',
instance_type=size,
vpc_security_group_ids=[group.id], # reference security group from above
ami=ami.id)
pulumi.export('publicIp', server.public_ip)
pulumi.export('publicHostName', server.public_dns)
三、Pulumi Vs Terraform
3.1 两者渊源
Pulumi 和 Terraform 有很多相似之处,都满足通过编写代码的形式在任何云上创建、部署和管理基础设施。任何云包括国外的AWS、Azure、GCP,当然也包括国内的云,包括AliYun、TencentCloud、UCloud等等。
同时两者在GitHub
上都提供了开源的社区版本,开源协议满足商业上的使用行为。Pulumi是站在Terraform Provider 肩膀上发展而来的,它干了一件聪明的事情,也就是提供了 pulumi-tf-provider-boilerplate
工具进行重新打包,这个工具充当了bridge的作用。
3.2 两者区别
根据 Pulumi 官方介绍,Pulumi 和 Terraform 两者在语言支持,状态管理,Provider支持,开源协议上存在着主要的区别。
【语言支持】 Pulumi 支持的语言包括:
- Python
- TypeScript
- JavaScript
- Go
- C#
- F#
- VB
- ...
Terraform正式支持的语言只包括HCL,Json声明式语言,如果要把实验性的Terraform-cdk产品算上的话,那在未来它还会支持:
- TypeScript
- Python
- Java
- C#
- Go
下面这张图很好的说明了两者目前在语言上支持上的差异。
【状态,可视化管理】
从根本上来说,状态管理是terraform 用户体验很是差的一环,因为没有提供相应的功能,客户只能本身在开源社区里找解决方案。而对于pulumi,因为其使用各开发语言实现,能够很是方便地在代码里面使用各种数据库进行数据操作。同时terraform对于状态的展示,以及部署过程中可视化展现,几乎未做这方面的支持,用户体验不佳。而对于pulumi,其目标明确地支持状态管理和可视化操作,切实地解决了用户的痛点。
除此上面提到的状态管理,pulumi还做到了对状态中的隐私内容进行真正的加密,这一点很关键。
【Provider 支持】
上文也说到,Pulumi通过转换工具支持了terraform 所有的Provider。同时Pulumi 深度支持K8s等云原生技术,支持了Terraform无法表达的高级部署场景。 这包括Prometheus-based canaries、 automatic Envoy sidecar injection等等。云计算浪潮之后云原生是一种趋势,可以清晰地认识到,Pulumi深耕于云原生,励志成为下一代DevOps工具的领头羊。
【开源协议】
Terraform 使用较弱的 Copyleft Mozilla Public License 2.0。 相反,Pulumi 开源项目使用宽松且商业友好的 Apache License 2.0。其开源内容包括核心 Pulumi 存储库、所有开源 Pulumi 资源提供程序(例如 Azure Native 提供程序)、转换实用程序(如 tf2pulumi)以及其他有用的项目。
【可重复使用的组件】
由于拥有真正的语言,我们可以构建更高层次的抽象。使用TypeScript等其它语言构建抽象,重复使用模块,相较于使用YAML的文内容,有了大幅度地减少。
【Lambda无服务功能】
可以用自身熟悉的语言使用lambda表达式来编写无服务器函数,而不需要一行YAML或其它声明式语言。
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";
const example = new aws.lambda.FunctionEventInvokeConfig("example", {
functionName: aws_lambda_alias.example.function_name,
destinationConfig: {
onFailure: {
destination: aws_sqs_queue.example.arn,
},
onSuccess: {
destination: aws_sns_topic.example.arn,
},
},
});
除了上面提到的内容,Pulumi
在重命名重构上也支持的相当好,并且也提供了Tranformation 的机制,允许我们用代码定义对资源定义的修改逻辑。
四、总结
通过上面的分析比较,pulumi有这么多突出的优点,那是不是我们必然选择pulumi作为我们的Iac工具了。那确实不一定!首先我们分析比较两个关键词的Google热度指数(2021年10月10日),蓝色曲线代表terraform ,红色曲线代表Pulumi。
结果很明显,terraform 作为一个2014年开始构建生态的产品,是比作为2017年初出茅庐的Pulumi有着更多的热度。Pulumi的生态比terraform 还差得远。而且terraform 也许会很快上市,到时候对Pulumi就是资本的降维打击了。所以选用Pulumi要慎重考虑。
然后同时分析Github的关注度(2021年10月10日),总的来说terraform的关注度是远远高于Pulumi,这一点也侧面印证了Google热度指数。但对于这个结果也要辩证地看待,毕竟Pulumi作为一个后起之秀,就目前的关注度,社区活跃度已经是相当不错了。
同时从另一方面来说,Pulumi提供了开发人员熟悉的代码描述资源,表现力足够,但会不会难以阅读和调试?这样Dev + Ops真的会难以分开了。这样组织架构也会发生调整,研发和运维一体了。到底这个变化是好还是坏,就看团队怎么辩证的看待了。