Pulumi适配OBS开源验证任务心得
Pulumi适配OBS开源验证任务
从计划书开始开始
本任务的主要目的是验证Pulumi能否使用OBS作为State存储载体,任务基于OBS完成功能验证。
Pulumi是什么?
Pulumi是一个基础架构即代码的自动化工具,它是构建在Terraform工具基础上的。
Pulumi与Terrform主要区别:
- Pulumi可以用熟悉的编程语言来编写声明式配置。
- Pulumi提供一个可视化的控制台。
- Pulumi状态管理支持团队协作和多用户共享。
由于源于Terrform,所以在Terrform定义的resource,只需要使用shim桥接一下,就能在Pulumi中使用。
所以Pulumi提供了两种模板:
- pulumi/pulumi-provider-boilerplate, 编写Native Pulumi Provider。
- pulumi/pulumi-tf-provider-boilerplate,桥接已经存在的Terraform Provider。
华为在Terraform和Pulumi相关项目:
为了感受Pulumi Provider,自定义简单的Provider测试OBS创建桶,验证OBS能否作为Pulumi State的存储载体。
编写Provider
编写Provider需要的环境:
- Go
- .Net
- Node
- Yarn
- Python
需要这些环境主要是供Pulumi根据我们编写的Provider生成SDK。
- 先从pulumi/pulumi-provider-boilerplate创建自己的仓库
- 自定义Bucket Resource,使用OBS提供的SDK创建桶。
type Bucket struct{}
type BucketArgs struct {
AK string `pulumi:"ak"`
SK string `pulumi:"sk"`
Endpoint string `pulumi:"endpoint"`
BucketName string `pulumi:"bucket_name"`
Location string `pulumi:"location"`
}
type BucketState struct {
BucketArgs
Result string `pulumi:"result"`
}
func (Bucket) Create(ctx context.Context, name string, input BucketArgs, preview bool) (string, BucketState, error) {
state := BucketState{BucketArgs: input}
if preview {
return name, state, nil
}
state.Result = "fail"
obCli, err := obs.New(input.AK, input.SK, input.Endpoint)
if err != nil {
return "", state, err
}
// 创建桶的入参
createBucketInput := &obs.CreateBucketInput{
BucketLocation: obs.BucketLocation{
XMLName: xml.Name{},
Location: input.Location,
},
Bucket: input.BucketName,
}
// 创建桶
_, err = obCli.CreateBucket(createBucketInput)
if err != nil {
return "", state, err
}
state.Result = "ok"
return name, state, nil
}
- 在Provider注册我们自定义的Resource
func Provider() p.Provider {
return infer.Provider(infer.Options{
Resources: []infer.InferredResource{
// 注册Bucket Resource
infer.Resource[Bucket, BucketArgs, BucketState](),
},
})
}
- 修改examples/go/main.go示例代码
package main
import (
"gitee.com/robotez/pulumi-obs/sdk/go/obs"
"github.com/pulumi/pulumi/sdk/v3/go/pulumi"
)
func main() {
pulumi.Run(func(ctx *pulumi.Context) error {
bucketResource, err := obs.NewBucket(ctx, "obs-bucket", &obs.BucketArgs{
Ak: pulumi.String("******"),
Bucket_name: pulumi.String("pulumi"),
Endpoint: pulumi.String("obs.cn-south-1.myhuaweicloud.com"),
Location: pulumi.String("cn-south-1"),
Sk: pulumi.String("********"),
})
if err != nil {
return err
}
ctx.Export("output", bucketResource)
return nil
})
}
验证
在华为云ECS 鲲鹏ARM64服务器上验证。
-
拉取将仓库代码
-
构建代码
make build install
-
调整Go依赖,生成的Go SDK会有依赖问题,将example.com/pulumi-obs/sdk的依赖调整为本项目
-
安装Pulumi
$ curl -fsSL https://get.pulumi.com | sh
=== Pulumi is now installed! 🍹 ===
- 重新连接,检查是否安装成功
$ pulumi version
v3.143.0
- 配置环境变量
export AWS_ACCESS_KEY_ID=J6**************N7
export AWS_SECRET_ACCESS_KEY=uZdN********************LXoUf
export AWS_REGION=cn-south-1
- 查看环境变量是否设置成功
$ echo ${AWS_REGION}
cn-south-1
- 使用OBS作为后端
$ pulumi login 's3://grafana?endpoint=obs.cn-south-1.myhuaweicloud.com'
Logged in to ruster-docker as root (s3://grafana?endpoint=obs.cn-south-1.myhuaweicloud.com)
- 进去示例代码目录,执行up命令
$ cd /examples/go
$ pulumi up
图待补充
-
Pulumi控制台查看结果
-
在华为云OBS服务查看结果
总结
Pulumi 是一个功能强大的基础设施即代码工具,允许开发者使用熟悉的编程语言来定义和管理云基础设施。它支持多种云平台和资源类型,提供了灵活的开发体验和强大的自动化能力。如果你希望使用编程语言来管理云资源,或者需要一个支持多云管理的工具,Pulumi 是一个非常值得考虑的选择。
通过这次适配 OBS 的经历,不仅证明了OBS强大的适应性,还掌握了 Pulumi 的使用和Provider编写。希望日后有机会继续探索 Pulumi 在多云管理和自动化运维中的更多应用场景。
- 点赞
- 收藏
- 关注作者
评论(0)