Pulumi适配OBS开源验证任务心得

举报
SSK9 发表于 2024/12/13 20:34:01 2024/12/13
【摘要】 Pulumi适配OBS开源验证任务 从计划书开始开始本任务的主要目的是让Pulumi能够支持OBS作为State存储,并且基于OBS完成功能验证。 验证安装Pulumi$ curl -fsSL https://get.pulumi.com | sh=== Pulumi is now installed! 🍹 ===重新连接,检查是否安装成功$ pulumi versionv3.143.0...

Pulumi适配OBS开源验证任务

从计划书开始开始

本任务的主要目的是验证Pulumi能否使用OBS作为State存储载体,任务基于OBS完成功能验证。

Pulumi是什么?

Pulumi是一个基础架构即代码的自动化工具,它是构建在Terraform工具基础上的。

Pulumi与Terrform主要区别:

  • Pulumi可以用熟悉的编程语言来编写声明式配置。
  • Pulumi提供一个可视化的控制台。
  • Pulumi状态管理支持团队协作和多用户共享。

由于源于Terrform,所以在Terrform定义的resource,只需要使用shim桥接一下,就能在Pulumi中使用。

所以Pulumi提供了两种模板:

  1. pulumi/pulumi-provider-boilerplate, 编写Native Pulumi Provider。
  2. pulumi/pulumi-tf-provider-boilerplate,桥接已经存在的Terraform Provider。

华为在Terraform和Pulumi相关项目:

  1. 华为云 Terraform Provider Registry
  2. 华为云 Pulumi Provider Github(没有发布到Pulumi Registry

为了感受Pulumi Provider,自定义简单的Provider测试OBS创建桶,验证OBS能否作为Pulumi State的存储载体。

编写Provider

编写Provider需要的环境:

  • Go
  • .Net
  • Node
  • Yarn
  • Python

需要这些环境主要是供Pulumi根据我们编写的Provider生成SDK。

  1. 先从pulumi/pulumi-provider-boilerplate创建自己的仓库
  2. 自定义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
}

  1. 在Provider注册我们自定义的Resource
func Provider() p.Provider {
	return infer.Provider(infer.Options{
		Resources: []infer.InferredResource{
        	// 注册Bucket Resource
			infer.Resource[Bucket, BucketArgs, BucketState](),
		},
	})
}
  1. 修改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
$ 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 在多云管理和自动化运维中的更多应用场景。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。