curve-ansible是用ansible编写的curve高性能存储系统远程部署升级工具,可以很方便的在一台主控机上做到部署升级集群所有节点。
ansible 2.5.9 python 2.7.13
inventory文件有client.ini和server.ini,client.ini存放client的机器列表以及对应的变量,server.ini存放除了client以外的机器,包括etcd,mds,快照克隆,chunkserver等。机器列表格式:
localhost ansible_ssh_host=127.0.0.1 chunkserver_num=14
其中localhost为机器别名,127.0.0.1为服务所用ip。chunkserver_num是主机变量,inventory中的所有变量都定义成了组变量,比如
[chunkservers:vars]
chunkserver_num=13
表示所有chunkserver机器上的chunkserver数量都是13,但是可能会有个别chunkserver的数量不等于13,这时候在主机变量中指定一下就可以覆盖组变量中的值,就能够做到特化处理,其他变量同理。
配置由ansible通过模板的方式统一分发,所有配置文件的模板都在roles/generate_config/templates下面。配置项的默认值在roles/generate_config/defaults/main.yml中,如果不想使用默认值,则在inventory或命令行中额外指定这个变量的指即可。
curve-ansible同时提供了debian包和tar包的方式安装curve软件包。默认使用tar包方式安装,如果想用debian包的方式,需要在inventory或者命令行中指定install_with_deb=true。(debian的方式目前不支持格式化指定盘,只支持格式化全部ATA盘)
- debian包的方式下,需要使用mk-deb.sh打debian包,并将debian包上传到debian源中,使其能够用apt-get命令安装。
- tar包的方式下,tar包可以是来自curve github release,也可以是自己执行mk-tar.sh脚本获取到的。
部署分为两部分,一个是curve集群部署,即服务端部署,另一个是客户端部署,提供了sdk、qemu和nbd三种方式。curve集群部署提供了一键部署以及部署单个服务的命令。单个服务部署应该遵循etcd->mds->chunkserver->snapshotclone的顺序。所有play和role都有tag,可以根据tag来选择只执行部分操作。
部署前需要准备inventory文件,inventory文件里的机器列表以及其他变量,根据自己的需求设置好相应的值。为了更好地发挥磁盘性能,curve提供了磁盘预格式化的功能,如果需要预格式化,则需要将inventory中的chunkserver_format_disk设置为true。如果是单机部署或不希望格式化磁盘,则将chunkserver_format_disk设置为false即可。 此外,还需把group_vars/mds.yml中的cluster_map设置成自己集群对应的拓扑结构。cluster_map格式如下:
cluster_map:
servers:
- name: server1
internalip: 127.0.0.1
internalport: 8200
externalip: 127.0.0.1
externalport: 8200
zone: zone1
physicalpool: pool1
- name: server2
internalip: 127.0.0.1
internalport: 8201
externalip: 127.0.0.1
externalport: 8201
zone: zone2
physicalpool: pool1
- name: server3
internalip: 127.0.0.1
internalport: 8202
externalip: 127.0.0.1
externalport: 8202
zone: zone3
physicalpool: pool1
logicalpools:
- name: logicalPool1
physicalpool: pool1
type: 0
replicasnum: 3
copysetnum: 100
zonenum: 3
scatterwidth: 0
其中servers是chunkserver所在的机器列表。如果是单机部署,需要指定internalport和externalport为单机部署的chunkserver对应的端口。如果是多机部署,则需要把internalport和externalport都设置成0。需要注意这里zone的数量要大于等于logicalpools里面指定的zonenum。logicalpools是逻辑池的列表,除了名字,需要指定它所属的物理池、类型、副本数量、copyset数量zone数量以及scatterwidth。目前的类型只支持0,page file类型。
如果需要格式化磁盘,则需要额外在group_vars/chunkservers.yml中指定磁盘的列表。比如:
disk_list:
- sda
- sdb
- sdc
group_vars/chunkservers.yml中指定的变量是所有chunkserver共用的,如果某个chunkserver上的磁盘列表跟其他的不一致,则需要在host_vars中额外给出。比如server.ini中chunkserver是下面三台机器:
[chunkservers]
server1 ansible_ssh_host=10.192.100.1
server2 ansible_ssh_host=10.192.100.2
server3 ansible_ssh_host=10.192.100.3
假设server1和server2对应的都是sda,sdb,sdc, server3使用的是sda,sdb,sdd,sde这四块盘。那么server1和server2的disk_list不需要在host_vars额外指出,而server3的disk_list需要额外指出。具体做法是在host_vars下面新建一个server3.yml。里面的内容为:
disk_list:
- sda
- sdb
- sdd
- sde
一键部署命令:
ansible-playbook deploy_curve.yml -i server.ini
快照克隆服务需要提供s3账号和密码才能够部署,因此一键部署默认不会部署快照克隆和快照克隆Nginx,deploy_curve.yml中根据角色打了tag,因此部署个别服务,只需要指定对应的tag即可,下面会一一列举。
部署命令:
ansible-playbook deploy_curve.yml -i server.ini --tags etcd
mds和快照克隆都需要用到etcd,因此部署的第一步是部署etcd。默认etcd的版本是v3.4.0,如果需要更高版本的话在inventory或命令行中指定etcd_version即可。
部署命令:
ansible-playbook deploy_curve.yml -i server.ini --tags mds
命令:
ansible-playbook deploy_curve.yml -i server.ini --tags create_physical_pool
mds成功启动后,必须先创建物理池才能启动chunkserver,否则chunkserver会因为注册失败而退出。
部署命令:
ansible-playbook deploy_curve.yml -i server.ini --tags chunkserver
chunkserver和其他组件相比多了一个格式化的步骤,如果指定了chunkserver_format_disk,会将机器上指定的磁盘全部格式化,否则不格式化,只是创建一下data目录。
命令:
ansible-playbook deploy_curve.yml -i server.ini --tags create_logical_pool
启动chunkserver之后,集群还不能立马服务,需要创建逻辑池(逻辑池中会创建copyset)才能真正开始服务。
快照克隆服务器独立于其他组件,因此需要单独部署。 部署命令:
ansible-playbook deploy_curve.yml -i server.ini --tags snapshotclone
如果快照克隆服务器没有做高可用,只有一台机器,那么不需要部署Nginx,直接访问快照克隆服务器的服务端口即可开始使用。
如果快照克隆服务器不止一台,那么需要部署Nginx才能够正常访问。 部署命令:
ansible-playbook deploy_curve.yml -i server.ini --tags snapshotclone_nginx
一键部署监控命令:
ansible-playbook deploy_monitor.yml -i server.ini
目前curve的升级流程为先升级mds,后升级chunkserver和快照克隆最后升级client。使用ansible需要指定一台主控机,我们规定主控机为mds节点之一。ansible-playbook同时需要yml文件和inventory文件,yml文件规定了要做哪些操作,inventory指定了机器列表并定义了一些变量。yml文件在curve仓库的curve-ansible目录中,inventory每个环境一份,由用户自行管理。
一键升级命令:
ansible-playbook rolling_update_curve.yml -i server.ini
etcd不会经常更新,通常是etcd-daemon和配置文件可能需要更新,因此一键升级中不包含etcd的升级,升级的话需要额外操作。
etcd升级需要需要先升级follower,再升级leader,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。
(1) ansible-playbook rolling_update_curve.yml -i server.ini --tags etcd
(2) 此时会打出"Confirm restart etcd in pubt1-curve1. ENTER to continue or CTRL-C A to quit:",确认无误
(确认第一个是备)后输入回车继续
(3) 重复上一步直到所有etcd重启完毕
mds升级同样需要先升级备,再升级主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。
(1) ansible-playbook rolling_update_curve.yml -i server.ini --tags mds
(2) 此时会打出"Confirm restart mds in pubt1-curve1. ENTER to continue or CTRL-C A to quit:",确认无误
(确认第一个是备)后输入回车继续
(3) 重复上一步直到所有mds升级完毕
升级chunkserver是按照zone分批重启的。升级过程中重启一批机器的时候,会把这批机器的名字用逗号分隔打出来。
(1) ansible-playbook rolling_update_curve.yml -i server.ini --tags chunkserver
(2) 此时会打出"Confirm restart chunkserver in pubt1-curve1, pubt1-curve2. ENTER to continue or CTRL-C A to quit:"
确认无误(集群healthy,io恢复,列出来的机器在同一个zone)后输入回车继续
(3) 重复上一步直到所有chunkserver升级完毕
快照克隆升级需要先升级备,再升级主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。
(1) ansible-playbook rolling_update_curve.yml -i server.ini --tags snapshotclone
(2) 此时会打出"Confirm restart snapshotclone in pubt1-curve1. ENTER to continue or CTRL-C A to quit:"
确认无误(确认第一个是备)后输入回车继续
(3) 重复上一步直到所有快照克隆升级完毕
(1) ansible-playbook rolling_update_nebd.yml -i client.ini
(2) 升级nebd-server也有类似的确认步骤,由于机器比较多,可以选择指定 --extra-vars "need_confirm=false"来关掉
确认这一步
curve-sdk主要给cinder,nova等服务使用,只需要更新包和配置即可,不需要重启服务
(1) ansible-playbook rolling_update_curve_sdk.yml -i client.ini
升级过程中,可能会因为一些问题导致升级失败,这时候会有回退的需求。回退是一个危险操作,因为老版本不一定能够兼容新版本,所以要谨慎回退。回退的时候只回退软件版本,不回退配置文件,所以要保证配置文件是向前兼容的(即只增加字段,不删除字段)。回退和升级共享一个yml文件,区别仅在与软件版本不同,所以额外在命令行中指定版本即可。
如果是tar包的方式,则只需要下载上一个版本的tar包,解压后执行和升级操作一样的步骤即可。 下面是debian包的方式下的回退过程。
mds回退同样需要先重启备,再重启主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。
(1) ansible-playbook rolling_update_curve.yml -i server.ini --tags mds --extra-vars "mds_package_version=0.0.5.3+4b11a64d tool_package_version=0.0.5.3+4b11a64d need_update_config=false"
(2) 此时会打出"Confirm restart mds in pubt1-curve1. ENTER to continue or CTRL-C A to quit:",确认无误
(确认第一个是备)后输入回车继续
(3) 重复上一步直到所有mds回退完毕
快照克隆回退需要先重启备,再重启主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。
(1) ansible-playbook rolling_update_curve.yml -i server.ini --tags snapshotclone --extra-vars "snap_package_version=0.0.6.1+160be351 need_update_config=false"
(2) 此时会打出"Confirm restart snapshotclone in pubt1-curve1. ENTER to continue or CTRL-C A to quit:"
确认无误(确认第一个是备)后输入回车继续
(3) 重复上一步直到所有快照克隆回滚完毕
(1) ansible-playbook rolling_update_curve.yml -i server.ini --tags chunkserver --extra-vars "cs_package_version=0.0.5.3+4b11a64d need_update_config=false"
(2) 此时会打出"Confirm restart chunkserver in pubt1-curve1. ENTER to continue or CTRL-C A to quit:"
确认无误(集群healthy,io恢复)后输入回车继续
(3) 重复上一步直到所有chunkserver回退完毕
(1) ansible-playbook rolling_update_nebd.yml -i client.ini --extra-vars "nebd_package_version=1.0.1+5e87f36 need_update_config=false"
(2) 回退nebd-server也有类似的确认步骤,由于机器比较多,可以选择指定 --extra-vars "need_confirm=false"来关掉确认这一步
curve-sdk主要给cinder,nova等服务使用,只需要更新包和配置即可,不需要重启服务
(1) ansible-playbook rolling_update_curve_sdk.yml -i client.ini --extra-vars "sdk_package_version=0.0.5.3+4b11a64d need_update_config=false"
清理集群主要是清理一些残留数据和日志,已安装的库和可执行程序不会清理。
(1)一键清理curve集群:
ansible-playbook clean_curve.yml -i server.ini
对应的tag和deploy_curve.yml一致,清理单个服务的命令不再赘述。
(2)清理nebd数据
ansible-playbook clean_nebd.yml -i client.ini
(3)清理curve-sdk数据
ansible-playbook clean_curve_sdk.yml -i client.ini
目前的服务还没有做到开机自启动中,所以机器重启可能会使服务退出,因此需要重新拉起。
(1)一键开启curve集群
ansible-playbook start_curve.yml -i server.ini
对应的tag和deploy_curve.yml一致,清理单个服务的命令不再赘述。
(2)启动nebd-server
ansible-playbook start_nebd_server.yml -i client.ini
(1)一键关闭curve集群
ansible-playbook stop_curve.yml -i server.ini
对应的tag和deploy_curve.yml一致,清理单个服务的命令不再赘述。
(2)关闭nebd-server
ansible-playbook stop_nebd_server.yml -i client.ini
重启集群可以通过rolling_update_curve.yml脚本完成,但是需要额外在命令行指定一些参数。需要注意,ansible的tag之间是并集的关系而不是交集,因此重启chunkserver不能指定--tags restart, chunkserver,这样指定后所有带restart的脚本都会执行,导致所有服务一起重启,因此针对单个服务,定义了额外的tag
(1)一键重启curve集群
ansible-playbook -i server.ini rolling_update_curve.yml --tags restart --extra-vars restart_directly=true
(2)重启mds
ansible-playbook -i server.ini rolling_update_curve.yml --tags restart_mds --extra-vars restart_directly=true
(3)重启chunkserver
ansible-playbook -i server.ini rolling_update_curve.yml --tags restart_chunkserver --extra-vars restart_directly=true
(4)重启快照克隆
ansible-playbook -i server.ini rolling_update_curve.yml --tags restart_snapshotclone --extra-vars restart_directly=true
(5)重启etcd
ansible-playbook -i server.ini rolling_update_curve.yml --tags restart_etcd --extra-vars restart_directly=true
(6)重启nebd-server
ansible-playbook rolling_update_nebd.yml -i client.ini --tags restart
三、目录结构说明
.
├── common_tasks # 放置可以复用的代码(可以理解为各种函数)
│ ├── check_chunkserver.yml # 检查chunkserver机器配置
│ ├── check_cluster_healthy_status.yml # 检查集群健康状态
│ ├── check_docker_exists.yml # 检查是否安装了docker
│ ├── check_if_nbd_exists_in_kernel.yml # 检查内核是否有nbd模块
│ ├── check_mds.yml # 检查mds机器配置
│ ├── create_dir.yml # 创建目录
│ ├── create_logical_pool.yml # 创建逻辑池
│ ├── create_physical_pool.yml # 创建物理池
│ ├── get_curve_version_from_metric.yml # 从metric获取curve版本
│ ├── get_distro_name.yml # 获取系统版本
│ ├── get_nebd_version_from_metric.yml # 从metric获取nebd版本
│ ├── install_with_yum_apt.yml # 用apt或yum的方式安装
│ ├── start_service.yml # 启动服务
│ ├── stop_service.yml # 停止服务
│ ├── update_config_with_puppet.yml # 使用puppet更新配置
│ ├── update_package.yml # 更新包
│ ├── wait_copysets_status_healthy.yml # 在一段时间内循环检查copyset健康状态
│ ├── wait_until_server_down.yml # 等待直到server停掉
│ └── wait_until_server_up.yml # 等待直到server起来
├── group_vars # 组变量
│ ├── chunkservers.yml # 属于chunkserver的变量
│ └── mds.yml # 属于mds的变量
├── host_vars # 主机变量, 其中的文件名要合inventory中定义的主机名一致
│ └── localhost.yml # 属于localhost的变量,host_vars优先级高于group_vars
├── roles # roles也是用来存放可以复用的代码,一个role内的task存在关联
│ ├── clean # 清理数据的role
│ │ └── tasks
│ │ ├── include
│ │ │ ├── clean_chunkserver_retain_chunkfilepool.yml # 清理集群,但是保留chunkfilepool
│ │ │ ├── clean_chunkserver_totally.yml # 完全清理集群
│ │ | ├── clean_chunkserver_with_disk_format.yml # 在格式化磁盘的情况下清理chunkserver(需要umount)
│ │ | ├── clean_chunkserver_without_disk_format.yml # 在不格式化的情况下清理chunkserver(删除目录即可)
│ │ | ├── clean_chunkserver.yml # 清理chunkserver
│ │ | ├── clean_curve_sdk.yml # 清理curve_sdk残留数据
│ │ | ├── clean_etcd.yml # 清理etcd残留数据
│ │ | ├── clean_mds.yml # 清理mds残留数据
│ │ | ├── clean_nebd.yml # 清理nebd残留数据
│ │ | ├── clean_snapshotcloneserver_nginx.yml # 清理快照克隆Nginx数据
│ │ | └── clean_snapshotcloneserver.yml # 清理快照克隆
│ │ └── main.yml
│ ├── format_chunkserver # 用来格式化chunkserver的role
│ │ ├── defaults
│ │ │ └── main.yml # 存放带默认值的变量
│ │ └── tasks
│ │ ├── include
│ │ │ ├── prepare_chunkserver_with_disk_format.yml # 使用格式化磁盘的方式准备data目录
│ │ │ └── prepare_chunkserver_without_disk_format.yml # 使用非格式化磁盘的方式准备data目录
│ │ └── main.yml
│ ├── prepare_software_env # 用来自动检查和准备curve所需软件环境
│ │ └── tasks
│ │ └── main.yml
│ ├── restart_service # 用来重启服务的role
│ │ ├── tasks # 存放重启服务的task,main.yml是入口,其他的被main引用
│ │ │ ├── include
│ │ │ │ ├── append_need_restart_cs_list.yml # 根据版本判断chunkserver是否需要重启并追加到重启列表中
│ │ │ │ ├── restart_chunkserver.yml # 重启chunkserver
│ │ │ │ ├── restart_etcd.yml # 重启etcd
│ │ │ │ ├── restart_mds.yml # 重启etcd
│ │ │ │ ├── restart_nebd.yml # 重启nebd server
│ │ │ │ └── restart_snapshotclone.yml # 重启快照克隆
│ │ │ └── main.yml # main.yml的所有task会被include到使用role的地方
│ │ └── vars
│ │ └── main.yml # main.yml的所有变量会被包含到使用role的地方
│ ├── install_package # 安装软件包的role
│ │ ├── defaults
│ │ │ └── main.yml # 存放带有默认值的变量
│ │ ├── files # 存放文件
│ │ │ └── disk_uuid_repair.py
│ │ ├── tasks
│ │ │ ├── include
│ │ │ │ ├── copy_file_to_remote.yml # 将文件拷贝到远端
│ │ │ │ ├── install_curve-chunkserver.yml # 安装chunkserver
│ │ │ │ ├── install_curve-mds.yml # 安装mds
│ │ │ │ ├── install_curve-monitor.yml
│ │ │ │ ├── install_curve-nbd.yml # 安装nbd
│ │ │ │ ├── install_curve-sdk.yml # 安装curve-sdk
│ │ │ │ ├── install_curve-snapshotcloneserver-nginx.yml # 安装快照克隆使用的Nginx
│ │ │ │ ├── install_curve-snapshotcloneserver.yml # 部署快照克隆
│ │ │ │ ├── install_curve-tools.yml # 安装部署工具
│ │ │ │ ├── install_daemon.yml # 安装daemon
│ │ │ │ ├── install_deb_package.yml # 安装debian包
│ │ │ │ ├── install_etcd.yml # 安装etcd
│ │ │ │ ├── install_jemalloc.yml # 安装jemalloc
│ │ │ │ ├── install_nebd.yml # 安装nebd
│ │ │ │ ├── install_with_source_code.yml # 从源码安装
│ │ │ │ └── set_curve_lib_dir.yml # 根据操作系统设置库安装路径
│ │ │ └── main.yml
│ │ ├── templates # 存放模板
│ │ │ ├── chunkserver_ctl.sh.j2 # chunkserver启动脚本的模板
│ │ │ ├── chunkserver_deploy.sh.j2 # chunkserver格式化脚本的模板
│ │ │ ├── curve-monitor.sh.j2 # 启动监控服务的脚本模板
│ │ │ ├── etcd-daemon.sh.j2 # etcd启动脚本的模板
│ │ │ ├── mds-daemon.sh.j2 # mds启动脚本的模板
│ │ │ ├── nebd-daemon.j2 # nebd-server启动脚本的模板
│ │ │ └── snapshot-daemon.sh.j2 # 快照克隆启动脚本模板
│ │ └── vars
│ │ └── main.yml
│ ├── set_leader_and_follower_list # 设置leader和follower列表
│ │ ├── tasks # 存放task,main.yml是入口,其他的被main引用
│ │ │ ├── include
│ │ │ │ ├── get_all_ip.yml # 获取节点的全部ip
│ │ │ │ ├── get_etcd_leader_ip.yml # 获取etcd leader的ip
│ │ │ │ ├── get_mds_leader_ip.yml # 获取mds leader的ip
│ │ │ │ └── get_snapshot_leader_ip.yml # 获取快照克隆leader的ip
│ │ │ └── main.yml # main.yml的所有task会被include到使用role的地方
│ │ └── vars
│ │ └── main.yml # main.yml的所有变量会被包含到使用role的地方
│ ├── generate_config # 更新配置文件的role
│ │ ├── defaults # 存放有默认值的变量
│ │ │ └── main.yml
│ │ ├── tasks
│ │ │ ├── include
│ │ │ │ ├── generate_config_with_template.yml # 根据模板生成配置文件
│ │ │ │ └── update_config_with_puppet.yml # 使用puppet更新配置(内部使用)
│ │ │ └── main.yml
│ │ ├── templates # 配置文件的模板
│ │ │ ├── chunkserver.conf.j2
│ │ │ ├── client.conf.j2
│ │ │ ├── docker-compose.yml.j2 # docker config for curve monitor
│ │ │ ├── etcd.conf.yml.j2
│ │ │ ├── grafana.ini.j2
│ │ │ ├── mds.conf.j2
│ │ │ ├── nebd-client.conf.j2
│ │ │ ├── nebd-server.conf.j2
│ │ │ ├── nginx_config.lua.j2
│ │ │ ├── nginx.conf.j2
│ │ │ ├── prometheus.yml.j2
│ │ │ ├── s3.conf.j2
│ │ │ ├── snapshot_clone_server.conf.j2
│ │ │ ├── snapshot_tools.conf.j2
│ │ │ ├── tools.conf.j2
│ │ │ └── topo.json.j2
│ │ └── vars
│ │ └── main.yml
│ ├── grafana_settings # set grafana datasource and dashboard
│ │ └── tasks
│ │ └── main.yml
│ ├── stop_service # 停止服务的role
│ │ ├── tasks
│ │ │ ├── include
│ │ │ │ ├── stop_chunkserver.yml # 停止chunkserver
│ │ │ │ ├── stop_etcd.yml # 停止etcd
│ │ │ │ ├── stop_mds.yml # 停止mds
│ │ │ │ ├── start_nebd.yml # 停止nebd server
│ │ │ │ ├── start_snapshotcloneserver_nginx.yml # 停止快照克隆Nginx
│ │ │ │ └── start_snapshotcloneserver.yml # 停止快照克隆服务器
│ │ │ └── main.yml
│ │ └── vars
│ │ └── main.yml
│ └── start_service # 启动服务的role
│ ├── tasks
│ │ ├── include
│ │ │ ├── start_chunkserver.yml # 启动chunkserver
│ │ │ ├── start_etcd.yml # 启动etcd
│ │ │ ├── start_mds.yml # 启动mds
│ │ │ ├── start_monitor.yml # 启动监控
│ │ │ ├── start_nebd.yml # 启动nebd
│ │ │ ├── start_snapshotcloneserver_nginx.yml # 启动Nginx
│ │ │ └── start_snapshotcloneserver.yml # 启动快照克隆
│ │ └── main.yml
│ └── vars
│ └── main.yml
├── rolling_update_nebd.yml # 升级nebd-server
├── rolling_update_nbd.yml # 升级curve-nbd
├── rolling_update_curve_sdk.yml # 升级curve sdk
├── rolling_update_curve.yml # 一键升级curve集群
├── check_ansible_version.yml # 检查ansible的版本
├── check_chunkserver.yml # 检查chunkserver所在机器配置
├── check_mds.yml # 检查mds所在机器配置
├── deploy_curve_sdk.yml # 部署curve-sdk
├── deploy_curve.yml # 一键部署curve集群
├── deploy_monitor.yml # 部署监控服务
├── deploy_nbd.yml # 部署nbd
├── deploy_nebd.yml # 部署nebd
├── deploy_walpool.yml # 准备walpool
├── release_disk_5%_space.yml # 释放chunkserver磁盘占用的空间
├── README # 本帮助文档
├── client.ini # client的inventory文件
├── server.ini # server的列表,包括mds,快照克隆,etcd,chunkserver
├── start_curve.yml # 启动curve集群
├── start_nebd_server.yml # 启动nebd-server
├── stop_curve.yml # 停止curve集群
└── stop_nebd_server.yml # 停止nebd-server