Pulumi对比terraform管理cloud公有云总结
Pulumi
用Pulumi实现IAAS,管理公有云资源,实际生产环境下,难免手动对公有云资源手动增删改,导致实际资源与Pulumi code和state file不一致,以下介绍不一致的情况下如何处理,以及相比于Terraform管理公有云资源有何异同和优势。
azure portal上,手动改变vm size大小,由Dv2扩为Dv3
- pulumi code和state file不做update,运行pulumi apply后,没有change发生;
- 改变pulumi代码中的vm size,由Dv2改为Dv3。此时pulumi code和实际的资源都是Dv3,,Pulumi state file仍然是Dv2,此时运行
pulumi up
,state file会同步为Dv3,“三方”状态保持一致; - 假设此时pulumi code中的size假设改为Dav4,实际vm size是手动更为为Dv3,state file仍然是Dv2。三方都不一样,此时
pulumi up
,azure 中的 vms size和state file中的size都会被updated和code中的size保持一致,以code为准。
通过以上可以说明,被pulumi管理的资源,手动更改某些配置后,然后同步pulumi 代码,不会出现把旧的删除,然后再添加新的情况,这点要比tf好。
手动删除Azure vm
- pulumi code和state file不做update,运行pulumi apply后,没有change发生;
- 删除code中对应vm资源,同步代码,运行pulumi apply后,资源自动同步;
手动增加Azure vm
- pulumi code和state file不做update,运行pulumi apply后,没有change发生,即新添加的资源不受pulumi管理
- 如果需要纳入到pulumi来管理,直接用pulumi import同步state file文件和实际资源一致即可,此处和terraform import类似,同步完state file后,还需要在pulumi code中加入相应资源,如下例子,手动建了一个Azure resource group后:
2.1. 导入资源同步state file
2.2. update pulumi code# pulumi import command 导入azure资源组,以下以导入Azure resource group资源为例 pulumi import azure-native:resources:ResourceGroup Pulumi-Test /subscriptions/67aa02ec-a43c-4b62-808a-12113f131ee8/resourceGroups/Pulumi-Test # terraform import command 以下以添加一个GCP instance 为例,对比pulumi import terraform import 'google_compute_instance.nat["instance_name"]' project_nameavailable_zone/vm_name
提交到仓库,执行pulumi apply,try run,确认没有资源被added/changed/deleted, 说明就代码添加没问题了。# 代码中update,执行上述pulumi import时,会自动生成一下代码,以下以导入Azure resource group资源为例,手动加入到pulumi代码中 import pulumi import pulumi_azure_native as azure_native rg_ptest = azure_native.resources.ResourceGroup("Pulumi-Test", location="eastus", resource_group_name="Pulumi-Test", tags={ "BillingCategory": "Platform", "Environment": "DevTest", "Owner": "Platform", }, opts=pulumi.ResourceOptions(protect=True))
总结
手动更改资源时,pulumi和terraform的处理方式不大相同,要比terraform简单,由上述例子可知,当实际Azure云资源手动改变,后续通过Pulumi再来管理,执行pulumi apply时,只要不报错,都可以忽略先前手动对云资源的改动。当然如果知道具体手动改了什么,pulumi代码手动同步改动后apply更好;而terraform需要时刻保持实际资源、state file、code三方一致才不会报错。原则上,pulumi不需要手动更改state file,慎重执行 pulumi refresh命令!导致state file和pulumi code不一致,导致许多存在的资源删除重建。
其次Terraform使用HCL语言,类似与shell,一些复杂的逻辑结构、for循环等不够灵活;而pulumi支持主流的Python、Go等语言,灵活性高。
更优之处,在于Pulumi允许写代码的人“犯错误”,如果随着需求变更,pulumi管理资源的架构上需要调整,只要最终值不改变,pulumi代码可以随意调整;而terraform代码只要略微改动,都会导致一些列相关资源删掉重建!
综上可知,pulumi代码作为IAAS,要比terraform简单一些,不需要“刻意”维护state file、可以随意调Pulumi整代码结构、可以选择自己喜欢的语言编写pulumi。