之前先容过一个灵巧多变功能强大的开源CMDB系统,设计风雅,可玩性高,经由一段韶光的深度利用,创造了许多可取之处,无论是构建系统内部的资产管理数据库,还是学习它的设计办法都有不少的可取之处,接下来我准备写一系列的文章来系统的先容一下它,从利用到设计,全面深入理解下.

这个系列第一篇就从支配开始,详细先容下VECMDB的安装、启动、访问以及系统的详细管理办法和常见缺点的处理等

安装

在开始之前你只须要准备一台主机,Linux或MacOS系统,只要能安装docker即可。
以下操作环境基于CentOS7

安装Docker

1. 更新系统包

开源|维易CMDB详解之安装支配及常见问题处理转载37丫37

yum update -y

2. 安装必要的依赖

yum install -y yum-utils

3. 添加 Docker 的官方存储库

yum-config-manager --add-repo https://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

4. 安装 Docker 引擎

yum install -y docker-ce docker-ce-cli containerd.io

5. 启动 Docker 并将其设置为开机启动

systemctl start dockersystemctl enable docker安装 Docker Compose v2

1. 安装 Docker Compose 插件

yum install -y docker-compose-plugin

2. 验证 Docker Compose 是否安装成功

docker compose version安装GIT

yum install git启动

1. 创建项目目录

mkdir /datacd /data

2. 拉项目代码并启动

git clone https://github.com/veops/cmdb.gitcd cmdb/docker compose up -d访问

浏览器打开,输入http://ip:8000访问,默认账号密码分别为:

User:adminPassword:123456详解

通过以上内容可以大略方便的支配起来VECMDB做事,但我们不仅要知其然还要知其以是然,以下这部分将会详细的讲解下CMDB的启动办法及各个做事,以及一些大略的排错方法,能更深入的理解VECMDB做事

Docker Compose

Docker-Compose是一个用于定义和运行多容器Docker运用程序的工具。
通过一个名为docker-compose.yml的YAML文件,用户可以配置运用程序所需的所有做事。
然后,只需一个命令就可以创建并启动这些做事。
VECMDB是通过Docker-Compose做做事管理的,那首先我们就须要详细的理解下VECMDB的docker-compose.yml配置文件,配置文件位于仓库的根目录,内容如下:

services: # 第一部分为做事定义 cmdb-db: # 定义了一个名为cmdb-db的做事 image: registry.cn-hangzhou.aliyuncs.com/veops/cmdb-db:2.3 # 镜像地址,MySQL数据库容器 container_name: cmdb-db # 容器名称为cmdb-db env_file: # 从当前目录下的.env文件中加载环境变量 - .env environment: # 环境变量配置 TZ: Asia/Shanghai # 配置时区为Asia/Shanghai volumes: # 挂载三个卷 - db-data:/var/lib/mysql # 第一个卷为db-data,用来持久化MySQL数据 - ./docs/mysqld.cnf:/etc/mysql/conf.d/mysqld.cnf # 本地配置文件mysqld.cnf挂载到MySQL配置目录 - ./docs/cmdb.sql:/docker-entrypoint-initdb.d/cmdb.sql # 初始化SQL文件cmdb.sql挂载到MySQL容器的初始化目录 healthcheck: # 康健命令检讨,检讨MySQL做事是否正常 test: ["CMD", "mysqladmin" ,"ping", "-h", "localhost", "-p$MYSQL_ROOT_PASSWORD"] # 康健检讨命令,检讨MySQL做事是否正常 interval: 10s timeout: 5s retries: 5 command: --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci # 设置MySQL字符集和排序规则 networks: # 网络配置,利用名字为new的自定义网络,同时设置别名为mysql new: aliases: - mysql ports: # 端口配置,将宿主机的23306端口映射到容器的3306端口 - '23306:3306' cmdb-cache: # 定义一个名为cmdb-cache的做事 image: registry.cn-hangzhou.aliyuncs.com/veops/cmdb-cache:2.3 # 镜像地址,Redis缓存容器 container_name: cmdb-cache # 容器名称为cmdb-cache environment: # 环境变量配置 TZ: Asia/Shanghai # 配置时区为Asia/Shanghai volumes: # 挂载一个卷 - cache-data:/data # 卷为cache-data,用来持久化Redis数据 healthcheck: # 康健检讨命令,检讨Redis做事是否正常 test: ["CMD", "redis-cli", "ping"] interval: 10s timeout: 5s retries: 5 networks: # 网络配置,利用名字为new的自定义网络,同时设置别名为redis new: aliases: - redis cmdb-api: # 定义一个名为cmdb-api的做事 image: registry.cn-hangzhou.aliyuncs.com/veops/cmdb-api:2.4.5 # 镜像地址,CMDB API容器 container_name: cmdb-api # 容器名称为cmdb-api env_file: # 从当前目录下的.env文件中加载环境变量 - .env environment: # 环境变量配置 TZ: Asia/Shanghai # 配置时区为Asia/Shanghai WAIT_HOSTS: cmdb-db:3306, cmdb-cache:6379 # 配置WAIT_HOSTS用来等待cmdb-db和cmdb-cache做事康健后再启动 depends_on: # 定义依赖关系 cmdb-db: # 确保cmdb-db做事启动康健后再启动 condition: service_healthy cmdb-cache: # 确保cmdb-cache做事启动康健后再启动 condition: service_healthy command: # 多行启动命令 - /bin/sh - -c - | sed -i "s#USE_ACL = False#USE_ACL = True#g" settings.py # 修正settings.py中的USE_ACL为True /wait # 利用/wait脚本等待做事依赖启动 flask db-setup # 初始化数据库 flask common-check-new-columns # 检讨数据库新列 gunicorn --workers=4 autoapp:app -b 0.0.0.0:5000 -D # 启动gunicorn做事 celery -A celery_worker.celery worker -E -Q one_cmdb_async --autoscale=4,1 --logfile=one_cmdb_async.log -D # 启动celery做事,行列步队one_cmdb_async celery -A celery_worker.celery worker -E -Q acl_async --logfile=one_acl_async.log --autoscale=2,1 -D # 启动celery做事,行列步队acl_async nohup flask cmdb-trigger > trigger.log 2>&1 & flask cmdb-init-cache flask cmdb-init-acl flask init-import-user-from-acl flask init-department flask cmdb-counter > counter.log 2>&1 # 实行一系列的flash命令用来初始化系统 healthcheck: # 康健检讨命令,检讨API做事是否启动正常 timeout: 3s interval: 5s retries: 10 test: "ps aux|grep -v grep|grep -v '1 root'|grep gunicorn || exit 1" networks: # 网络配置,利用名字为new的自定义网络,同时设置别名为cmdb-api new: aliases: - cmdb-api cmdb-ui: # 定义一个名为cmdb-ui的做事 image: registry.cn-hangzhou.aliyuncs.com/veops/cmdb-ui:2.4.5 # 镜像地址,CMDB UI容器 container_name: cmdb-ui # 容器名称为cmdb-api depends_on: # 定义依赖关系 - cmdb-api # 确保cmdb-api做事启动成功后再启动 condition: service_healthy environment: # 环境变量配置 TZ: Asia/Shanghai # 配置时区为Asia/Shanghai CMDB_API_HOST: cmdb-api:5000 # CMDB_API_HOST指向到cmdb-api做事的地址 NGINX_PORT: 80 # 设置NGINX的端口为80 volumes: # 挂载一个卷 - ./docs/nginx.cmdb.conf.example:/etc/nginx/conf.d/nginx.cmdb.conf.example # 挂载本地的nginx配置文件 command: # 多行启动命令 - /bin/sh - -c - | envsubst '$$CMDB_API_HOST $$NGINX_PORT' < /etc/nginx/conf.d/nginx.cmdb.conf.example > /etc/nginx/conf.d/cmdb.conf # 利用envsubst更换nginx配置文件中的环境变量 nginx -g 'daemon off;' # 启动nginx,利用daemon off模式,前台运行 networks: # 网络配置,利用名字为new的自定义网络 - new ports: # 端口配置,将宿主机的8000端口映射到容器的80端口 - "8000:80"volumes: # 第二部分为卷定义 db-data: # 定义一个db-data本地卷,用来持久化MySQL数据,cmdb-db容器利用 driver: local name: cmdb_db-data cache-data: # 定一个cache-data本地卷,用来持久化Redis数据,cmdb-cache容器利用 driver: local name: cmdb_cache-datanetworks: # 第三部分为网络定义 new: # 定义一个new桥接管集,用于各做事之间通信 driver: bridge name: cmdb_network

总结以下便是启动了四个容器,分别是MySQL、Reids、后端API和前端UI,后端API启动前须要MySQL和Reids启动成功,而前端UI启动前须要后端API启动成功。
定义了一个公共的网络担保四个容器之间可以相互通信,同时还定义了两个本地卷,担保MySQL和Reids数据的持久化,以确保容器在重启之后数据也不会丢失,对系统升级也十分友好

本地卷

数据是持久化在宿主机上确当地卷里,本地卷的查看可以直接实行volume命令,例如查看MySQL确当地卷,就可以用如下命令:

# docker volume inspect cmdb_db-data[ { "CreatedAt": "2024-06-03T17:59:36+08:00", "Driver": "local", "Labels": { "com.docker.compose.project": "cmdb", "com.docker.compose.version": "2.27.0", "com.docker.compose.volume": "db-data" }, "Mountpoint": "/var/lib/docker/volumes/cmdb_db-data/_data", "Name": "cmdb_db-data", "Options": null, "Scope": "local" }]

个中Mountpoint便是数据在宿主机本地的挂载点,可以直接查看个中的数据

# ls /var/lib/docker/volumes/cmdb_db-data/_data/auto.cnf ca-key.pem ca.pem client-cert.pem client-key.pem cmdb ib_buffer_pool ib_logfile0 ib_logfile1 ibdata1 ibtmp1 mysql performance_schema private_key.pem public_key.pem server-cert.pem server-key.pem sys

而Redis持久化在本地的数据也同样可以通过以上的方法查看

# docker volume inspect cmdb_cache-data[ { "CreatedAt": "2024-06-03T17:59:36+08:00", "Driver": "local", "Labels": { "com.docker.compose.project": "cmdb", "com.docker.compose.version": "2.27.0", "com.docker.compose.volume": "cache-data" }, "Mountpoint": "/var/lib/docker/volumes/cmdb_cache-data/_data", "Name": "cmdb_cache-data", "Options": null, "Scope": "local" }]## ls /var/lib/docker/volumes/cmdb_cache-data/_data/dump.rdb

只有一个rdb数据文件。
如果你在支配时碰着数据方面的问题,可以通过以上方法来查看本地的数据,或是直接命令行进入MySQL或者Reids去检讨数据,当然更多的时候可能是数据初始化问题,以是更为有效的方法或许是利用如下命令重启docker-compose做事

# 关闭docker compose做事# docker compose down# 启动docker compose做事# docker compose up -d# 可选:查看docker compose做事状态# docker compose ps# 可选:检讨docker compose容器日志# docker compose logs自定义网络

docker-compose做事启动后,可以通过network命令查看Docker的网络列表

# docker network lsNETWORK ID NAME DRIVER SCOPE17ec43fa34f8 bridge bridge local5dd2f0dd8033 cmdb_network bridge local75376eee7d8b host host localdeb75486f151 none null local

此时能看到一个名为cmdb_network的网络,如果你碰着了网络连通性问题,例如API连不上数据库等等,可以通过network命令查看网络的详细信息

# docker network inspect cmdb_network[ { "Name": "cmdb_network", "Id": "5dd2f0dd8033f7c99d4a8e5371356b41e087c71eb9f35c4fdacaccdfa280e3d1", "Created": "2024-06-12T13:42:35.923873631+08:00", "Scope": "local", "Driver": "bridge", "EnableIPv6": false, "IPAM": { "Driver": "default", "Options": null, "Config": [ { "Subnet": "172.19.0.0/16", "Gateway": "172.19.0.1" } ] }, "Internal": false, "Attachable": false, "Ingress": false, "ConfigFrom": { "Network": "" }, "ConfigOnly": false, "Containers": { "176d8a248ecde36d46205e03ff19879cd2a6c6325e3e8622ca48033ae55a0e5b": { "Name": "cmdb-api", "EndpointID": "0619481c0a6241b445ea6daead002c39f82aae56ba77390b67d73779d56c7221", "MacAddress": "02:42:ac:13:00:04", "IPv4Address": "172.19.0.4/16", "IPv6Address": "" }, "3387071f980e26a399350f8a6fda0587edccb25319ec040945896228671616c4": { "Name": "cmdb-db", "EndpointID": "234d64c1858fb5933defe84b13aaf071426324959f0331abec4e1dd29c4c1a09", "MacAddress": "02:42:ac:13:00:03", "IPv4Address": "172.19.0.3/16", "IPv6Address": "" }, "a2df35da575fa289b4b2cc3dd0d7370c1003a47fe84b894a41751adef4d56dd4": { "Name": "cmdb-ui", "EndpointID": "a403699251326f92e391b4aa38f9d80cf14153053e4f2307d133b4ff9f167182", "MacAddress": "02:42:ac:13:00:05", "IPv4Address": "172.19.0.5/16", "IPv6Address": "" }, "aaf5d23ee24bd9719f9231369649fceac7a1fe8bb1bb9421ca12f35c3faade49": { "Name": "cmdb-cache", "EndpointID": "efe4eff06148e463a8b9a1af0ef15e81701e0bec39f9cfa25fb9613005b32148", "MacAddress": "02:42:ac:13:00:02", "IPv4Address": "172.19.0.2/16", "IPv6Address": "" } }, "Options": {}, "Labels": { "com.docker.compose.network": "new", "com.docker.compose.project": "cmdb", "com.docker.compose.version": "2.27.0" } }]

这里输出了网络的详细信息,包括网络的配置、连接到该网络到容器等等,个中的Containers字段就记录了所有连接到此网络到容器,正常情形下会有四个,包含cmdb-db、cmdb-cache、cmdb-api和cmdb-ui,它们都被分配了得当的IP地址

容器

如果以上都没有问题,那就可以通过docker命令查看到容器的状态都正常

# docker compose psNAME IMAGE COMMAND SERVICE CREATED STATUS PORTScmdb-api registry.cn-hangzhou.aliyuncs.com/veops/cmdb-api:2.4.5 "/bin/sh -c 'sed -i …" cmdb-api 10 minutes ago Up 10 minutes cmdb-cache registry.cn-hangzhou.aliyuncs.com/veops/cmdb-cache:2.3 "docker-entrypoint.s…" cmdb-cache 10 minutes ago Up 10 minutes (healthy) 6379/tcpcmdb-db registry.cn-hangzhou.aliyuncs.com/veops/cmdb-db:2.3 "docker-entrypoint.s…" cmdb-db 10 minutes ago Up 10 minutes (healthy) 33060/tcp, 0.0.0.0:23306->3306/tcp, :::23306->3306/tcpcmdb-ui registry.cn-hangzhou.aliyuncs.com/veops/cmdb-ui:2.4.5 "/docker-entrypoint.…" cmdb-ui 10 minutes ago Up 10 minutes 0.0.0.0:8000->80/tcp, :::8000->80/tcp

末了就可以正常通过Web访问支配的CMDB做事了

把稳事变

前文的docker-compose.yml配置文件中有配置从代码根目录下加载.env文件内容作为环境变量,.env文件紧张记录了MySQL数据库配置信息,如下:

MYSQL_ROOT_PASSWORD='123456' MYSQL_HOST='mysql' MYSQL_PORT=3306 MYSQL_USER='cmdb' MYSQL_DATABASE='cmdb' MYSQL_PASSWORD='123456'

可以看到默认的账号密码比较大略,如果我们想要修正的话,最好在第一次初始化之前就修正.env文件里的配置,这样的话在系统初始化时就会设置成新设置的账号密码,以提高系统安全性

若你已经初始化了系统,还想要再修正账号密码的话,那就只能进入MySQL数据库进行修正了,同时修正过之后也要同时修正.env配置文件里的干系配置

常见问题数据库连接失落败

数据库的配置记录在.env配置文件中,先检讨数据库配置和环境变量是否精确,其次确认数据库做事正常启动并能接管连接

# docker exec -it cmdb-db mysql -u root -p$MYSQL_ROOT_PASSWORD

末了检讨自定义网络是否正常,通过之前给的network命令

缓存连接失落败

检讨Redis做事是否正常运行并能接管连接

# docker exec -it cmdb-cache redis-cli ping

其次也是检讨自定义网络状态

API做事启动失落败

先检讨以来的MySQL和Reids做事是否正常,然后检讨是否能正常连通MySQL和Redis

# docker exec -it cmdb-api /bin/sh -c "ping cmdb-db"# docker exec -it cmdb-api /bin/sh -c "ping cmdb-cache"

如果正常则检讨API做事容器状态

# docker compose ps | grep cmdb-api

容器状态正常则检讨gunicorn做事是否正常

# docker exec -it cmdb-api /bin/sh -c "ps aux|grep -v grep|grep -v '1 root'|grep gunicorn"

末了查看日志是否有报错

# docker compose logs cmdb-apiUI做事无法访问

先确认依赖的API容器状态正常,然后检讨依赖的API做事日志无报错,再然后检讨是否能正常连通API容器

# docker exec -it cmdb-ui /bin/sh -c "ping cmdb-api"

如果都没有问题,则查看UI做事容器状态

# docker compose ps | grep cmdb-ui

末了查看nginx配置及容器日志是否有报错

# docker exec -it cmdb-ui /bin/sh -c "cd /etc/init.d && nginx -t"# docker compose logs cmdb-ui

对付成熟的开源项目,只要不是刚刚更新的新版本,那大概率都已经经由了许多用户的实际验证,项目本身涌现问题的概率较低,如果我们碰着缺点先考虑自己的环境及配置,按照以上办理思路,大概率能找到问题并办理。
如果弗成的话那就重启下docker-compose做事,还弗成的话就重装吧