12-03 7 views
将Terraform的环境相关信息都在这个方法内定义完成
1. Terraform工作目录定义
2. Plugins初始化,考虑到在线初始化太慢,这里是提前下载好,每次要用时copy一份过去
3. 全局使用的环境定义(Variables.tf),由于我这里是将阿里云的AK通过-ver参数传入,所以需要定义,如果喜欢明文写到tf文件中的,可以不做这一步
4. 变量参数处理,存入到结构体中,plan和apply时会用到
5. 实例化一个terraform对象(tfexec.NewTerraform)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 |
import ( "context" "github.com/hashicorp/terraform-exec/tfexec" tfjson "github.com/hashicorp/terraform-json" "io/ioutil" "log" "os" "path" "text/template" ) type TerraForm struct { Ctx context.Context WorkDir string // terraform 工作空间 Tf *tfexec.Terraform // terraform对象 Vars []*tfexec.VarOption // 依赖变量 } func NewTerraForm(vars []string) (*TerraForm, error) { // 变量容器 var v []*tfexec.VarOption ctx := context.TODO() // 创建临时的工作空间 workDir, _ := ioutil.TempDir("", "terraform") log.Println("ioutil.TempDir is", workDir) // 初始化terraform plugins,使用copy的方法 // constant.TerraformPlugins 定义的是提前下载好的plugins目录位置 if err := utils.FileCopy(constant.TerraformPlugins, path.Join(workDir, ".terraform")); err != nil { log.Println("utils.FileCopy, err:", err) return nil, err } // 生成变量定义文件Variables.tf f, err := os.OpenFile(path.Join(workDir, "Variables.tf"), os.O_WRONLY|os.O_CREATE, 0644) defer f.Close() if err != nil { log.Println(err) return nil, err } // 将定义的变量模板写入到Variables.tf中 /* TerraformVeriableTemplate = ` variable "access_key" {} variable "secret_key" {} variable "region" { default = "cn-shanghai" } ` */ if _, err = f.WriteString(constant.TerraformVeriableTemplate); err != nil { return nil, err } // golang的terraform sdk同python版的一样,最终都是调用的系统命令去执行的,所以需要提前安装好系统命令 // constant.TerraformBin 便是指定了系统命令的的位置 tf, err := tfexec.NewTerraform(workDir, constant.TerraformBin) if err != nil { log.Println("tfexec.NewTerraform, err:", err) return nil, err } // 将入参转换为terraform的命令参数 for _, i := range vars { v = append(v, tfexec.Var(i)) } return &TerraForm{ Ctx: ctx, Tf: tf, WorkDir: workDir, Vars: v, }, nil } |
1 2 3 4 5 6 7 8 9 10 |
func (t *TerraForm) Init() error { // 设置初始化时不检查更新 if err := t.Tf.Init(t.Ctx, tfexec.Upgrade(false)); err != nil { log.Println("tf.Init, err:", err) return err } return nil } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
func (t *TerraForm) Plan() error { var opts []tfexec.PlanOption // 将变量的类型转换为PlanOption for _, i := range t.Vars { opts = append(opts, i) } // 执行terraform plan if _, err := t.Tf.Plan(t.Ctx, opts...); err != nil { log.Println("tf.Plan, err:", err) return err } return nil } |
通过执行后的.Show方法可以获取执行结果,结果同terraform.tfstate中的内容,可以通过
actual.Values.RootModule.Resources获取
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
func (t *TerraForm) Apply() (*tfjson.State, error) { var opts []tfexec.ApplyOption // 将变量的类型转换为ApplyOption for _, i := range t.Vars { opts = append(opts, i) } if err := t.Tf.Apply(t.Ctx, opts...); err != nil { log.Println("tf.Apply, err:", err) return nil, err } // 获取执行结果 actual, err := t.Tf.Show(t.Ctx) if err != nil { log.Println("tf.Show, err:", err) return nil, err } return actual, nil } |