curve-ansible
Folders and files
Name | Name | Last commit date | ||
---|---|---|---|---|
parent directory.. | ||||
用ansible编写的curve高性能存储系统远程部署升级工具,可以很方便的在一台主控机上做到部署升级集群所有节点。 一、软件依赖 ansible 2.5.9 python 2.7.13 二、使用说明 1、inventory文件说明 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,这时候在主机 变量中指定一下就可以覆盖组变量中的值,就能够做到特化处理,其他变量同理。 2、配置管理 配置由ansible通过模板的方式统一分发,所有组件的配置项的默认值在roles/generate_config/defaults/main.yml中,如 果不想使用默认值,则在inventory或命令行中额外指定即可。 3、包管理 curve-ansible同时提供了debian包和tar包的方式安装curve软件包。默认使用tar包方式安装,如果想用debian包的方式,需要 在inventory或者命令行中指定install_with_deb=true - debian包的方式下,需要将debian包上传到debian源中,使其能够用apt-get命令安装。 - tar包的方式下,tar包可以是来自curve github release,也可以是自己执行mk-tar脚本获取到的。获取到tar包后,解压 并把对应的目录在inventory里指定一下,比如mds的包的路径对应的变量是local_mds_package_path,默认值是../curve-mds 假定mds的包在curve-ansible同一级目录下。 三、使用命令 1、集群部署 部署分为两部分,一个是curve集群部署,即服务端部署,另一个是客户端部署,提供了sdk、qemu和nbd三种方式。curve集群部署 提供了一键部署以及部署单个服务的命令。单个服务部署应该遵循etcd->mds->chunkserver->snapshotclone的顺序。所有play 和role都有tag,可以根据tag来选择只执行部分操作。 1.1 部署前准备 部署前需要准备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: 2000 zonenum: 3 scatterwidth: 0 其中servers是chunkserver所在的机器列表。如果是单机部署,需要指定internalport和externalport为单机部署的chunkserver对应的端口。 如果是多机部署,则需要把internalport和externalport都设置成0。需要注意这里zone的数量要大于等于logicalpools里面指定的zonenum。 logicalpools是逻辑池的列表,除了名字,需要指定它所属的物理池、类型、副本数量、copyset数量zone数量以及scatterwidth。目前的类型 只支持0,page file类型。 1.1 部署etcd 部署命令: ansible-playbook deploy_etcd.yml -i server.ini mds和快照克隆都需要用到etcd,因此部署的第一步是部署etcd。默认etcd的版本是v3.4.0,如果需要更高版本的话在inventory或命令行中指定 etcd_version即可。 1.2 部署mds 部署命令: ansible-playbook deploy_mds.yml -i server.ini 部署mds由三步组成:第一步安装包和配置,第二步启动服务,第三步创建物理池。创建物理池成功后,chunkserver才能正常启动。 1.3 部署chunkserver 部署命令: ansible-playbook deploy_chunkserver.yml -i server.ini 部署chunkserver同样由三步组成,不一样的是在第一步多了一个格式化的步骤,如果指定了chunkserver_format_disk,会将机器上的数据盘 全部格式化,否则不格式化,只是创建一下data目录。 1.4 部署快照克隆 1.1 一键部署curve集群 一键部署命令: ansible-playbook deploy_curve.yml -i server.ini 2、集群升级 目前curve的升级流程为先升级mds,后升级chunkserver和快照克隆最后升级client。使用ansible需要指定一台主控机,我们规定 主控机为mds节点之一。ansible-playbook同时需要yml文件和inventory文件,yml文件规定了要做哪些操作,inventory 指定了机器列表并定义了一些变量。yml文件在curve仓库的curve-ansible目录中,inventory每个环境一份,由用户自行 管理。 所有rolling_update的脚本都支持通过指定tag选择只升级包和配置或只重启服务。比如对于mds来说: (1) 如果想只更新包,不重启,命令为: ansible-playbook rolling_update_mds.yml -i server.ini --tags update_config_and_pkg (2) 如果只想重启服务,不想更新包,命令为: ansible-playbook rolling_update_mds.yml -i server.ini --tags restart 2.1 升级mds mds升级需要先升级备,再升级主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。 (1) ansible-playbook rolling_update_mds.yml -i server.ini (2) 此时会打出"Confirm restart mds in pubt1-curve1. ENTER to continue or CTRL-C A to quit:",确认无误 (确认第一个是备)后输入回车继续 (3) 重复上一步直到所有mds升级完毕 2.2 重启etcd etcd的版本很少会更新,但是配置和etcd-daemon可能会更新,这时需要重启一下etcd,因此需要一个重启etcd的功能。 etcd的重启同样需要需要先升级follower,再升级leader,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。 (1) ansible-playbook restart_etcd.yml -i server.ini (2) 此时会打出"Confirm restart etcd in pubt1-curve1. ENTER to continue or CTRL-C A to quit:",确认无误 (确认第一个是备)后输入回车继续 (3) 重复上一步直到所有etcd重启完毕 2.3 升级快照克隆 快照克隆升级需要先升级备,再升级主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。 (1) ansible-playbook rolling_update_snapshotclone.yml -i server.ini (2) 此时会打出"Confirm restart snapshotclone in pubt1-curve1. ENTER to continue or CTRL-C A to quit:" 确认无误(确认第一个是备)后输入回车继续 (3) 重复上一步直到所有快照克隆升级完毕 2.4 升级chunkserver (1) ansible-playbook rolling_update_chunkserver.yml -i server.ini (2) 此时会打出"Confirm restart chunkserver in pubt1-curve1. ENTER to continue or CTRL-C A to quit:" 确认无误(集群healthy,io恢复)后输入回车继续 (3) 重复上一步直到所有chunkserver升级完毕 2.5 升级nebd-server (1) ansible-playbook rolling_update_nebd.yml -i client.ini (2) 升级nebd-server也有类似的确认步骤,由于机器比较多,可以选择指定 --extra-vars "need_confirm=false"来关掉 确认这一步 2.6 升级curve-sdk curve-sdk主要给cinder,nova等服务使用,只需要更新包和配置即可,不需要重启服务 (1) ansible-playbook rolling_update_curve_sdk.yml -i client.ini 3、集群回退 升级过程中,可能会因为一些问题导致升级失败,这时候会有回退的需求。回退是一个危险操作,因为老版本不一定能够兼容新版本, 所以要谨慎回退。回退的时候只回退软件版本,不回退配置文件,所以要保证配置文件是向前兼容的(即只增加字段,不删除字段)。 回退和升级共享一个yml文件,区别仅在与软件版本不同,所以额外在命令行中指定版本即可。 3.1 回退mds mds回退同样需要先重启备,再重启主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。 (1) ansible-playbook rolling_update_mds.yml -i server.ini --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回退完毕 3.2 回退快照克隆 快照克隆回退需要先重启备,再重启主,这个逻辑在yml文件中已经包含了,使用的时候只需要交互确认一下即可。 (1) ansible-playbook rolling_update_snapshotclone.yml -i server.ini --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) 重复上一步直到所有快照克隆回滚完毕 3.3 回退chunkserver (1) ansible-playbook rolling_update_mds.yml -i server.ini --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回退完毕 3.4 回退nebd-server (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"来关掉 确认这一步 3.5 回退curve-sdk 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" 三、目录结构说明 . ├── common_tasks # 放置可以复用的代码(可以理解为各种函数) │ ├── check_chunkserver.yml # 检查chunkserver机器配置 │ ├── check_cluster_healthy_status.yml # 检查集群健康状态 │ ├── 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版本 │ ├── get_software_version_from_package_version.yml # 从包版本获取软件版本 │ ├── update_package.yml # 更新包 │ └── wait_copysets_status_healthy.yml # 在一段时间内循环检查copyset健康状态 │ ├── wait_until_server_down.yml # 等待直到server停掉 │ └── wait_until_server_up.yml # 等待直到server起来 ├── roles # roles也是用来存放可以复用的代码,一个role内的task存在关联 ├── group_vars # 组变量 │ ├── all.yml # 属于所有host的变量 │ └── mds.yml # 属于mds的变量 │ ├── format_chunkserver # 用来格式化chunkserver的role │ │ ├── defaults │ │ │ └── main.yml # 存放带默认值的变量 │ │ └── tasks │ │ ├── include │ │ │ └── prepare_chunkserver_without_disk_format.yml # 使用非格式化磁盘的方式准备data目录 │ │ └── main.yml │ ├── restart_service # 用来重启服务的role │ │ ├── tasks # 存放重启服务的task,main.yml是入口,其他的被main引用 │ │ │ ├── include │ │ │ │ ├── restart_by_daemon.yml # 用daemon重启服务 │ │ │ │ ├── restart_chunkserver.yml # 重启chunkserver │ │ │ │ ├── restart_etcd.yml # 重启etcd │ │ │ │ ├── restart_mds.yml # 重启etcd │ │ │ │ ├── restart_nebd.yml # 重启nebd server │ │ │ │ ├── restart_one_chunkserver.yml # 重启单个chunkserver │ │ │ │ └── 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_aws-sdk.yml # 安装aws-sdk │ │ │ │ ├── install_curve-chunkserver.yml # 安装chunkserver │ │ │ │ ├── install_curve-mds.yml # 安装mds │ │ │ │ ├── install_curve-nbd.yml # 安装nbd │ │ │ │ ├── install_curve-sdk.yml # 安装curve-sdk │ │ │ │ ├── install_curve-tools.yml # 安装部署工具 │ │ │ │ ├── install_deb_package.yml # 安装debian包 │ │ │ │ ├── install_etcd.yml # 安装etcd │ │ │ │ ├── install_libuuid.yml # 安装libuuid │ │ │ │ ├── install_lib_with_source_code.yml # 从源码安装库 │ │ │ │ └── install_nebd.yml # 安装nebd │ │ │ └── main.yml │ │ ├── templates # 存放模板 │ │ │ ├── chunkserver_ctl.sh.j2 # chunkserver启动脚本的模板 │ │ │ ├── chunkserver_deploy.sh.j2 # chunkserver格式化脚本的模板 │ │ │ ├── etcd-daemon.sh.j2 # etcd启动脚本的模板 │ │ │ ├── mds-daemon.sh.j2 # mds启动脚本的模板 │ │ │ └── nebd-daemon.j2 # nebd-server启动脚本的模板 │ │ └── 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 │ │ │ └── main.yml │ │ ├── templates # 配置文件的模板 │ │ │ ├── chunkserver.conf.j2 │ │ │ ├── client.conf.j2 │ │ │ ├── etcd.conf.yml.j2 │ │ │ ├── mds.conf.j2 │ │ │ ├── nebd-client.conf.j2 │ │ │ ├── nebd-server.conf.j2 │ │ │ ├── s3.conf.j2 │ │ │ ├── snapshot_clone_server.conf.j2 │ │ │ ├── snapshot_tools.conf.j2 │ │ │ ├── tools.conf.j2 │ │ │ └── topo.json.j2 │ │ └── vars │ │ └── main.yml │ └── start_service # 启动服务的role │ ├── tasks │ │ ├── include │ │ │ ├── start_by_daemon.yml # 通过daemon启动服务 │ │ │ ├── start_chunkserver.yml # 启动chunkserver │ │ │ ├── start_etcd.yml # 启动etcd │ │ │ ├── start_mds.yml # 启动mds │ │ │ └── start_nebd.yml # 启动nebd │ │ └── main.yml │ └── vars │ └── main.yml ├── rolling_update_chunkserver.yml # 升级chunkserver ├── rolling_update_mds.yml # 升级mds ├── rolling_update_nebd.yml # 升级nebd-server ├── rolling_update_curve_sdk.yml # 升级curve sdk ├── rolling_update_snapshotclone.yml # 升级快照克隆 ├── rolling_update_etcd.yml # 升级etcd的命令 ├── rolling_update_curve.yml # 一键升级curve集群 ├── check_chunkserver.yml # 检查chunkserver所在机器配置 ├── check_mds.yml # 检查mds所在机器配置 ├── deploy_chunkserver.yml # 部署chunkserver ├── deploy_curve_sdk.yml # 部署curve-sdk ├── deploy_curve.yml # 一键部署curve集群 ├── deploy_etcd.yml # 部署etcd ├── deploy_mds.yml # 部署mds ├── deploy_nbd.yml # 部署nbd ├── deploy_nebd.yml # 部署nebd ├── README # 本帮助文档 ├── client.ini # client的inventory文件 └── server.ini # server的列表,包括mds,快照克隆,etcd,chunkserver