CMDB模块编译
1.推荐安装gox进行混合编译
go get github.com/mitchellh/gox
测试:命令行输入gox -h,应该会用输出的,不然你要检查下PATH变量设置的是否正确
$gox -h
...
2.使用方法
1.编译window 64位:
gox -osarch="windows/amd64" ./
2.编译mac 64位:
gox -osarch = "darwin/amd64" ./
3.编译Linux 64位:
gox -osarch="linux/amd64" ./
4.把生成的二进制包替换为CMDB平台对应主机上面的包,例如:
1.登录中控机:cat /data/install/install.config
2.替换二进制包,例如:
ssh到目标机,cd /data/bkee/cmdb/server/bin,替换对应的模块即可
3.中控机操作CMDB服务,例如:
cd /data/install,执行 ./bkeec start/stop cmdb 停止和启动CMDB服务
添加模型关联关系
<1>.采集器端
- 增加需要关联的字段,可以是主机、业务或者其他,例如:host、biz等
- 字段属性根据需要,可以设置为隐藏字段,singleasst(基于3.2.0版本)
<2>.CMDB源码段
- 目录结果如下:模块名为datacollection
2.找到handler.go文件里面如下的方法进行修改,可以做关联关系增删改查操作
3.对应的表结构为
- cc_ObjectBase 所有的模型实例
- cc_ObjAsst 模型的关联关系
- cc_InstAsst 实例和关联关系的结合
- cc_UserCustom 用户自定义的实例字段
要点:
1.discover.go文件需要引入底层数据库的操作句柄,自己搭建操作桥梁
type Discover struct {
db dal.RDB
}
2. NewDiscover方法
func NewDiscover(ctx context.Context, chanName string, maxSize int, redisCli, subCli *redis.Client, backbone *backbone.Engine, db dal.RDB) *Discover {
if 0 == maxSize {
maxSize = 100
}
pheader := http.Header{}
pheader.Add(bkc.BKHTTPOwnerID, bkc.BKDefaultOwnerID)
pheader.Add(bkc.BKHTTPHeaderUser, bkc.CCSystemCollectorUserName)
discover := &Discover{
chanName: chanName,
msgChan: make(chan string, maxSize*4),
interrupt: make(chan error),
resetHandle: make(chan struct{}),
doneCh: make(chan struct{}),
maxSize: maxSize,
redisCli: redisCli,
subCli: subCli,
ts: time.Now(),
id: xid.New().String()[5:],
maxConcurrent: runtime.NumCPU(),
getMasterInterval: time.Second * 11,
masterProcLockLiveTime: getMasterProcIntervalTime + time.Second*10,
ctx: ctx,
pheader: pheader,
}
discover.Engine = backbone
discover.db = db
return discover
}
3.从datacollection.go,入口处开始添加操作DB引用
func (d *DataCollection) Run() error {
blog.Infof("datacollection start...")
var err error
discli, err := redis.NewFromConfig(d.Config.DiscoverRedis)
if nil != err {
return err
}
snapcli, err := redis.NewFromConfig(d.Config.SnapRedis)
if nil != err {
return err
}
rediscli, err := redis.NewFromConfig(d.Config.CCRedis)
if nil != err {
return err
}
db, err := mongo.NewMgo(d.Config.MongoDB.BuildURI(), time.Minute)
if err != nil {
return fmt.Errorf("connect mongo server failed %s", err.Error())
}
d.db = db
chanName := []string{}
for {
chanName, err = d.getSnapChanName(d.ctx)
if nil == err {
break
}
blog.Errorf("get channame faile: %v, please init databae first, we will try 10 second later", err)
time.Sleep(time.Second * 10)
}
hostSnap := NewHostSnap(d.ctx, chanName, MaxSnapSize, rediscli, snapcli, db)
hostSnap.Start()
discoverChan := ""
for {
discoverChan, err = d.getDiscoverChanName(d.ctx)
if nil == err {
break
}
blog.Errorf("get discover channel fail: %v, please init database first, we will try 10 second later", err)
time.Sleep(time.Second * 10)
}
discover := NewDiscover(context.Background(), discoverChan, MaxDiscoverSize, rediscli, discli, d.Engine, db)
discover.Start()
blog.Infof("datacollection started")
return nil
}