虚拟机自动化注意了

2022-01-11 08:16:11 浏览数 (1)

虚拟化采用了vmware 公司的vsphere产品,版本6.x

使用开源项目:github.com/vmware/govmomi 来实现虚拟机自动化部署流程

虚拟机配置对象是:

代码语言:javascript复制
type VirtualMachineConfigSpec struct {
  DynamicData

  ChangeVersion                string                                 `xml:"changeVersion,omitempty"`
  Name                         string                                 `xml:"name,omitempty"`
  Version                      string                                 `xml:"version,omitempty"`
  CreateDate                   *time.Time                             `xml:"createDate"`
  Uuid                         string                                 `xml:"uuid,omitempty"`
  InstanceUuid                 string                                 `xml:"instanceUuid,omitempty"`
  NpivNodeWorldWideName        []int64                                `xml:"npivNodeWorldWideName,omitempty"`
  NpivPortWorldWideName        []int64                                `xml:"npivPortWorldWideName,omitempty"`
  NpivWorldWideNameType        string                                 `xml:"npivWorldWideNameType,omitempty"`
  NpivDesiredNodeWwns          int16                                  `xml:"npivDesiredNodeWwns,omitempty"`
  NpivDesiredPortWwns          int16                                  `xml:"npivDesiredPortWwns,omitempty"`
  NpivTemporaryDisabled        *bool                                  `xml:"npivTemporaryDisabled"`
  NpivOnNonRdmDisks            *bool                                  `xml:"npivOnNonRdmDisks"`
  NpivWorldWideNameOp          string                                 `xml:"npivWorldWideNameOp,omitempty"`
  LocationId                   string                                 `xml:"locationId,omitempty"`
  GuestId                      string                                 `xml:"guestId,omitempty"`
  AlternateGuestName           string                                 `xml:"alternateGuestName,omitempty"`
  Annotation                   string                                 `xml:"annotation,omitempty"`
  Files                        *VirtualMachineFileInfo                `xml:"files,omitempty"`
  Tools                        *ToolsConfigInfo                       `xml:"tools,omitempty"`
  Flags                        *VirtualMachineFlagInfo                `xml:"flags,omitempty"`
  ConsolePreferences           *VirtualMachineConsolePreferences      `xml:"consolePreferences,omitempty"`
  PowerOpInfo                  *VirtualMachineDefaultPowerOpInfo      `xml:"powerOpInfo,omitempty"`
  NumCPUs                      int32                                  `xml:"numCPUs,omitempty"`
  VcpuConfig                   []VirtualMachineVcpuConfig             `xml:"vcpuConfig,omitempty"`
  NumCoresPerSocket            int32                                  `xml:"numCoresPerSocket,omitempty"`
  MemoryMB                     int64                                  `xml:"memoryMB,omitempty"`
  MemoryHotAddEnabled          *bool                                  `xml:"memoryHotAddEnabled"`
  CpuHotAddEnabled             *bool                                  `xml:"cpuHotAddEnabled"`
  CpuHotRemoveEnabled          *bool                                  `xml:"cpuHotRemoveEnabled"`
  VirtualICH7MPresent          *bool                                  `xml:"virtualICH7MPresent"`
  VirtualSMCPresent            *bool                                  `xml:"virtualSMCPresent"`
  DeviceChange                 []BaseVirtualDeviceConfigSpec          `xml:"deviceChange,omitempty,typeattr"`
  CpuAllocation                *ResourceAllocationInfo                `xml:"cpuAllocation,omitempty"`
  MemoryAllocation             *ResourceAllocationInfo                `xml:"memoryAllocation,omitempty"`
  LatencySensitivity           *LatencySensitivity                    `xml:"latencySensitivity,omitempty"`
  CpuAffinity                  *VirtualMachineAffinityInfo            `xml:"cpuAffinity,omitempty"`
  MemoryAffinity               *VirtualMachineAffinityInfo            `xml:"memoryAffinity,omitempty"`
  NetworkShaper                *VirtualMachineNetworkShaperInfo       `xml:"networkShaper,omitempty"`
  CpuFeatureMask               []VirtualMachineCpuIdInfoSpec          `xml:"cpuFeatureMask,omitempty"`
  ExtraConfig                  []BaseOptionValue                      `xml:"extraConfig,omitempty,typeattr"`
  SwapPlacement                string                                 `xml:"swapPlacement,omitempty"`
  BootOptions                  *VirtualMachineBootOptions             `xml:"bootOptions,omitempty"`
  VAppConfig                   BaseVmConfigSpec                       `xml:"vAppConfig,omitempty,typeattr"`
  FtInfo                       BaseFaultToleranceConfigInfo           `xml:"ftInfo,omitempty,typeattr"`
  RepConfig                    *ReplicationConfigSpec                 `xml:"repConfig,omitempty"`
  VAppConfigRemoved            *bool                                  `xml:"vAppConfigRemoved"`
  VAssertsEnabled              *bool                                  `xml:"vAssertsEnabled"`
  ChangeTrackingEnabled        *bool                                  `xml:"changeTrackingEnabled"`
  Firmware                     string                                 `xml:"firmware,omitempty"`
  MaxMksConnections            int32                                  `xml:"maxMksConnections,omitempty"`
  GuestAutoLockEnabled         *bool                                  `xml:"guestAutoLockEnabled"`
  ManagedBy                    *ManagedByInfo                         `xml:"managedBy,omitempty"`
  MemoryReservationLockedToMax *bool                                  `xml:"memoryReservationLockedToMax"`
  NestedHVEnabled              *bool                                  `xml:"nestedHVEnabled"`
  VPMCEnabled                  *bool                                  `xml:"vPMCEnabled"`
  ScheduledHardwareUpgradeInfo *ScheduledHardwareUpgradeInfo          `xml:"scheduledHardwareUpgradeInfo,omitempty"`
  VmProfile                    []BaseVirtualMachineProfileSpec        `xml:"vmProfile,omitempty,typeattr"`
  MessageBusTunnelEnabled      *bool                                  `xml:"messageBusTunnelEnabled"`
  Crypto                       BaseCryptoSpec                         `xml:"crypto,omitempty,typeattr"`
  MigrateEncryption            string                                 `xml:"migrateEncryption,omitempty"`
  SgxInfo                      *VirtualMachineSgxInfo                 `xml:"sgxInfo,omitempty"`
  GuestMonitoringModeInfo      *VirtualMachineGuestMonitoringModeInfo `xml:"guestMonitoringModeInfo,omitempty"`
  SevEnabled                   *bool                                  `xml:"sevEnabled"`
}

在基于模版克隆时,会设置客户机操作系统,在开发中,工程师将操作系统设置为

代码语言:javascript复制
  VirtualMachineGuestOsIdentifierOtherLinux64Guest          = VirtualMachineGuestOsIdentifier("otherLinux64Guest")

测试后发现使用该操作系统,克隆后的虚拟机无法支持cpu 热插拔特性,在vsphere控制台上查看虚拟机配置,发现CpuHotAddEnabled 单选框没有勾选。

调试:

代码语言:javascript复制
types.VirtualMachineConfigSpec{
   Name:     "test-linux",
   GuestId:  "centos7_64Guest",
   NumCPUs:  4,
   MemoryMB: 6,
   CpuHotAddEnabled: types.NewBool(true),
   MemoryHotAddEnabled: types.NewBool(true),
   CpuHotRemoveEnabled: types.NewBool(true),
}

由于sdk 结构对象类型采用xml 序列化模式,特将该对象转化打印

代码语言:javascript复制
xml, _ := xml.MarshalIndent(虚拟机模版config, "  ", "    ")

xml 处理参考

代码语言:javascript复制
package xml_test

import (
  "encoding/xml"
  "fmt"
  "os"
)

func ExampleMarshalIndent() {
  type Address struct {
    City, State string
  }
  type Person struct {
    XMLName   xml.Name `xml:"person"`
    Id        int      `xml:"id,attr"`
    FirstName string   `xml:"name>first"`
    LastName  string   `xml:"name>last"`
    Age       int      `xml:"age"`
    Height    float32  `xml:"height,omitempty"`
    Married   bool
    Address
    Comment string `xml:",comment"`
  }

  v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42}
  v.Comment = " Need more details. "
  v.Address = Address{"Hanga Roa", "Easter Island"}

  output, err := xml.MarshalIndent(v, "  ", "    ")
  if err != nil {
    fmt.Printf("error: %vn", err)
  }

  os.Stdout.Write(output)
  // Output:
  //   <person id="13">
  //       <name>
  //           <first>John</first>
  //           <last>Doe</last>
  //       </name>
  //       <age>42</age>
  //       <Married>false</Married>
  //       <City>Hanga Roa</City>
  //       <State>Easter Island</State>
  //       <!-- Need more details. -->
  //   </person>
}

func ExampleEncoder() {
  type Address struct {
    City, State string
  }
  type Person struct {
    XMLName   xml.Name `xml:"person"`
    Id        int      `xml:"id,attr"`
    FirstName string   `xml:"name>first"`
    LastName  string   `xml:"name>last"`
    Age       int      `xml:"age"`
    Height    float32  `xml:"height,omitempty"`
    Married   bool
    Address
    Comment string `xml:",comment"`
  }

  v := &Person{Id: 13, FirstName: "John", LastName: "Doe", Age: 42}
  v.Comment = " Need more details. "
  v.Address = Address{"Hanga Roa", "Easter Island"}

  enc := xml.NewEncoder(os.Stdout)
  enc.Indent("  ", "    ")
  if err := enc.Encode(v); err != nil {
    fmt.Printf("error: %vn", err)
  }

  // Output:
  //   <person id="13">
  //       <name>
  //           <first>John</first>
  //           <last>Doe</last>
  //       </name>
  //       <age>42</age>
  //       <Married>false</Married>
  //       <City>Hanga Roa</City>
  //       <State>Easter Island</State>
  //       <!-- Need more details. -->
  //   </person>
}

// This example demonstrates unmarshaling an XML excerpt into a value with
// some preset fields. Note that the Phone field isn't modified and that
// the XML <Company> element is ignored. Also, the Groups field is assigned
// considering the element path provided in its tag.
func ExampleUnmarshal() {
  type Email struct {
    Where string `xml:"where,attr"`
    Addr  string
  }
  type Address struct {
    City, State string
  }
  type Result struct {
    XMLName xml.Name `xml:"Person"`
    Name    string   `xml:"FullName"`
    Phone   string
    Email   []Email
    Groups  []string `xml:"Group>Value"`
    Address
  }
  v := Result{Name: "none", Phone: "none"}

  data := `
    <Person>
      <FullName>Grace R. Emlin</FullName>
      <Company>Example Inc.</Company>
      <Email where="home">
        <Addr>gre@example.com</Addr>
      </Email>
      <Email where='work'>
        <Addr>gre@work.com</Addr>
      </Email>
      <Group>
        <Value>Friends</Value>
        <Value>Squash</Value>
      </Group>
      <City>Hanga Roa</City>
      <State>Easter Island</State>
    </Person>
  `
  err := xml.Unmarshal([]byte(data), &v)
  if err != nil {
    fmt.Printf("error: %v", err)
    return
  }
  fmt.Printf("XMLName: %#vn", v.XMLName)
  fmt.Printf("Name: %qn", v.Name)
  fmt.Printf("Phone: %qn", v.Phone)
  fmt.Printf("Email: %vn", v.Email)
  fmt.Printf("Groups: %vn", v.Groups)
  fmt.Printf("Address: %vn", v.Address)
  // Output:
  // XMLName: xml.Name{Space:"", Local:"Person"}
  // Name: "Grace R. Emlin"
  // Phone: "none"
  // Email: [{home gre@example.com} {work gre@work.com}]
  // Groups: [Friends Squash]
  // Address: {Hanga Roa Easter Island}
}

在对结构体对象进行打印时,可使用%v, % v, %#v 进行对象打印处理

可参考:

代码语言:javascript复制
package main

import "fmt"

type employee struct {
    name   string
    age    int
    salary int
}

func main() {
    emp := employee{name: "Sam", age: 31, salary: 2000}
    fmt.Printf("Emp: %vn", emp)
    fmt.Printf("Emp: % vn", emp)
    fmt.Printf("Emp: %#vn", emp)
    fmt.Println(emp)
}

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type employee struct {
    Name   string
    Age    int
    salary int
}

func main() {
    emp := employee{Name: "Sam", Age: 31, salary: 2000}
    //Marshal
    empJSON, err := json.Marshal(emp)
    if err != nil {
        log.Fatalf(err.Error())
    }
    fmt.Printf("Marshal funnction output %sn", string(empJSON))

    //MarshalIndent
    empJSON, err = json.MarshalIndent(emp, "", "  ")
    if err != nil {
        log.Fatalf(err.Error())
    }
    fmt.Printf("MarshalIndent funnction output %sn", string(empJSON))
}

package main

import (
    "encoding/json"
    "fmt"
    "log"
)

type address struct {
    City    string `json:"city"`
    Country string `json:"country"`
}

type employee struct {
    Name    string  `json:"name"`
    Age     int     `json:"age"`
    Salary  int     `json:"salary"`
    Address address `json:"address"`
}

func main() {
    address := address{City: "some_city", Country: "some_country"}
    emp := employee{Name: "Sam", Age: 31, Salary: 2000, Address: address}
    //Converting to json
    empJSON, err := json.MarshalIndent(emp, "", "  ")
    if err != nil {
        log.Fatalf(err.Error())
    }
    fmt.Printf("MarshalIndent funnction outputn %sn", string(empJSON))
}

https://golangbyexample.com/print-struct-variables-golang/

https://golang.org/src/encoding/xml/example_test.go

https://stackoverflow.com/questions/24512112/how-to-print-struct-variables-in-console

0 人点赞