一、 ansible介绍及安装
1. ansible介绍
1.1 ansible简介
1.1.1 ansible是什么
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远程主机通讯的。ansible目前已经已经被红帽官方收购,是自动化运维工具中大家认可度最高的,并且上手容易,学习简单。是每位运维工程师必须掌握的技能之一。
1.1.2 ansible特点
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
1.1.3 ansible架构图
上图中我们看到的主要模块如下:
Ansible:Ansible核心程序。
HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。
Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。
CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。
CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。
ConnectionPlugins:连接插件,Ansible和Host通信使用
1.2 ansible任务执行
1.2.1 ansible任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
- ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
- playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
1.2.2 ansible执行流程
简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
1.2.3 ansible命令执行过程
- 加载自己的配置文件,默认/etc/ansible/ansible.cfg;
- 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
- 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
- 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件,sleep 0退出;
2. ansible安装
2.1 CentOS安装ansible
yum install centos-release-ansible-29.noarch
yum clean all && yum repolist && yum makecache
yum install ansible
查看ansible版本
ansible --version
ansible 2.9.27
config file = /etc/ansible/ansible.cfg
configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules']
ansible python module location = /usr/lib/python2.7/site-packages/ansible
executable location = /usr/bin/ansible
python version = 2.7.5 (default, Nov 20 2015, 02:00:19) [GCC 4.8.5 20150623 (Red Hat 4.8.5-4)]"
2.2 CTyunOS安装ansible
- 首先,添加ansible的yum源文件,vi /etc/yum.repos.d/ansible.repo,在里面添加如下内容保存,注意repo文件编码格式必须为ASCII,然后执行yum makecache更新yum源( 由于ctyunos上yum源ansible版本太低,这里使用清华大学yum源镜像 )
- 安装ansible:yum install ansible -y,
- 如若安装过程中碰到以下这种不能安装成功的情况,再多次重新执行yum install ansible -y安装ansible。
- ansible安装成功后,执行ansible --version查看ansible版本,如果出现以下这种情况,需手动对缺失的module进行安装:yum install python-jinja2
- 安装ansible扩展库:
- pip install netaddr
python2 get-pip.py ###安装pip2
- 安装ansible的netcommmon扩展库
ansible-galaxy collection install ansible.netcommon
yum install python-netaddr -y
二、 dpos部署系统工具vnet-deploy
说明:resource_pool_dir:资源池目录,如内蒙资源池目录是neimeng08,贵州资源池是guizhou15,江苏资源池是jiangsu10。
1. vnet-deploy介绍
1.2 vnet-deploy简介
vnet-deploy是基于ansible开发的网元自动化部署工具,包括网元数据面及控制面物理机及一体机自动化部署。后续将重点介绍网元数据面dpos部署部分。
1.3 vnet-deploy代码仓库路径
vnet-deploy(dev分支)
1.4 vnet-deploy工具ansible目录介绍
vnet-deploy的ansible目录是自动化部署主要目录,下面将对该ansible目录中dpos部署相关的目录进行着重介绍
- facts目录:执行ansible命令时会获取部署机器的信息,并生成以被部署机器管理IP命名的机器信息文件,包含被部署机器系统、cpu,内存,网络等信息,我们在开发的时候可以直接提取该文件中的信息使用,如通过phy接口名从该文件中找到对应的pci id(txt文件用作git占用目录的文件,并无其他用处,其他目录下的placeholder.txt用处一样):
- inventory目录:各资源池及其所有网元的配置信息都在这下面
- logs目录:ansible每条命令执行结果都会记录到该目录下的log文件里
- playbooks:执行自动化部署任务时的入口文件在这下面,一体机的在其中的epos目录下面
- roles目录:实际自动化部署任务实现文件都在这下面
- script目录:存放的一些公共脚本,如一键部署dpos脚本sh。
1.5 dpos自动化部署介绍
dpos自动化部署系统由Control-Node节点及Host-Node节点构成,Control主要由以下几个部分构成,Playbook、Role、Config、DPOS toos-script、Host&Ansible-cfg组成,其中role、config是部署系统的重点部分,Host-Node是被部署主机。
- Playbook:dpos部署的入口文件,用于操作各类Task任务,可以通过不同的tag 指定不同的Task 任务运行。
- hosts变量:指定要与其建立ssh连接并进行部署的被部署机器主机组,这些主机组变量在各资源池的hosts文件inventory/resource_pool_dir/hosts中定义
- gather_facts:是否在facts目录下生成被部署机器信息的文件
- roles:指定要执行的部署任务,在roles目录下
如:执行ansible-playbook -i inventory/neimeng08/hosts playbooks/dpos.yml --tags=install时,会通过playbooks/dpos.yml中的hosts变量从inventory/neimeng08/hosts文件中找到对应的主机组下的被部署机器管理IP,并依次与这些管理IP的被部署机器建立ssh连接,然后通过roles变量执行roles目录下对应的部署任务task
- Role:dpos自动化部署功能的具体实现目录,与Playbook对应,dpos部署相关的包含:部署节点初始化:roles/dpos-deploy-init,网元初始化:roles/system_init/,dpos部署:roles/dpos/、网元纳管:roles/dpos-online-control/,这些目录下还包含tasks、files、handlers、templates等目录
- task目录:部署任务执行的主要目录,其中task/main.yml是执行部署任务的入口文件,如果命令行没有加--tags指定从某个task开始执行的话,则会从yml文件开头第一个task依次执行,但包含tags为never的默认不执行。如果在命令后面加上--tags指定某个tags,则会依次执行该tags包含的task,包括tags包含never的task,如:执行ansible-playbook -i inventory/neimeng08/hosts playbooks/dpos.yml --tags=install
则会依次执行task:install -> config -> init -> gobgp -> connectivity_check -> keepalived -> bgp_check
roles/dpos/tasks/main.yml:
- include变量:具体执行的task任务文件
- tags变量:命令行通过--tags指定具体task执行相应include变量指定的task文件。
dpos部署相关的task:
- 部署节点初始化dpos-deploy-init包含的task:
- depend_install:安装依赖
- host_conf_init:通过conf生成网元配置模板yml
- template_config_init:初始化网元机型配置模板
- 网元初始化system_init包含的task:
- selinux:selinux初始化
- repo_careat:yum源配置
- tool_package:检查内核版本,安装依赖及驱动
- gobgpd_install:gobgpd安装
- unbond:拆除bond
- unbond_recover:恢复bond
- hugepage_mem:配置大页
- reboot:重启系统
- dpos部署包含的task:
- install:通过yum安装dpos
- config:conf、init_param配置
- init:启动dpos服务
- uninstall:dpos卸载
- backup:dpos目录/usr/local/vnet-dpos备份到/usr/local/vnet-dpos_bak
- restore:将备份的dpos目录/usr/local/vnet-dpos_bak恢复到dpos安装目录/usr/local/vnet-dpos
- stop:停止dpos服务
- restart:重启dpos服务
- gobgp:配置并启动gobgp服务
- keepalived:natgw配置并启动keepalived
- process_check:进程运行状态检查
- corefile_check:corefile检查
- version_check:dpos版本检查
- route_check:路由检查
- config_check:eip等配置检查
- traffic_stats_check:流量情况检查
- connectivity_check:内外网连通性检查
- bgp_check:bgp邻居状态检查
- 网元纳管dpos-online-control包含的task:
- up:将网元添加到管控
- down:从管控摘除网元
- check:查看网元管控状态
- files目录:task调用的shell脚本放在这里面
- handlers目录:task执行后通过notify指定通知的事件放在这里面,如dpos install后通知restart dpos service
- templates目录:一些配置文件生成脚本放在这里面,如conf、init_param、gobgpd.yml、keepalived.conf的生成脚本都放在这里面。
- config:全局配置,包含inventory/下各资源池目录下的配置,在执行ansible-playbook -i inventoryresource_pool_dir/hosts playbooks/dpos.yml进行自动化部署时,会自动加载与inventory/resource_pool_dir/hosts同目录及子目录下的全局配置文件,开发时可以直接使用这些配置文件里的全局变量
- inventory/resource_pool_dir/group_vars/all/config.yml:是一些全局配置,包括管控面的,包含yum源地址(一般是各资源池分源),vpc_service地址(纳管或摘除网元),以及dpos使用的一些全局变量(dpos安装路径、支持的系统版本、安装的相关软件版本等):
- roles/dpos/default/template-config.yml:网元机型配置模板,网元不同机型的配置在这里面,机型名称按CPU个数及内存大小命名:CM_xCyG (x:CPU个数,y:内存大小),在执行ansible-playbook -i inventory/resource_pool_dir/hosts ./playbooks/dpos.yml --tags=deploy_init时会将默认网元机型模板oles/dpos-deploy-init/files/template-config.yml拷贝到inventory/resource_pool_dir/group_vars/all/下面,新增网元或新增机型均需要在oles/dpos-deploy-init/files/template-config.yml中添加相应配置。
- inventory/resource_pool_dir/host.conf:部署时填写的唯一入口配置文件。
如 inventory/neimeng08/host.conf:
参数说明:
[10.8.73.65] ---- 网元管理IP
gw_type: agw ----网元类型,agw/sgw/igw/vgw
version: -----dpos安装包版本,默认不填或填空,表示使用最新版本,如果需要指定特定版本,请填对应版本号,与rpm包一致,如1.0.04-0
template: CM_32C512G ----使用的机型配置模板,CM_32C512G代表32个核、512G内存的机型,如内蒙08资源池,CM_48C768G代表48个核、768G内存的机型,如贵州15资源池
wan_name: bond2 ----网元业务外网接口名(agw及sgw须配置,igw及vgw不用配)
wan_ip: 10.25.128.1/26 ----网元业务外网IPv4地址/掩码长度(agw及sgw须配置,igw及vgw不用配)
wan_gw: 10.25.128.62 ----网元业务外网网关IPv4地址(agw及sgw须配置,igw及vgw不用配)
wan_ip6: 2021:1111:1111::188/64 ----网元业务外网IPv6地址/前缀长度(agw及sgw须配置,igw及vgw不用配)
wan_gw6: 0::0 ----网元业务外网网关IPv6地址(agw及sgw须配置,igw及vgw不用配)
wan_primary_name: ens1f1 ----当部署为bond环境时为网元业务外网bond的主口接口名,当部署为非bond环境时不配或配空(agw及sgw须配置,igw及vgw不用配)
wan_slaves_name: ens1f1 ens5f1 ----当部署为bond环境时为网元业务外网bond的成员口接口名,当部署为非bond环境时不配或配空(agw及sgw须配置,igw及vgw不用配)
wan_bgp_as: 65089 -----网元外网BGP local as(只有agw须配置)
wan_bgp_neighbor_as: 65091 -----网元外网BGP peer as(只有agw须配置)
wan_bgp_neighbor_ips: 10.8.28.13 10.8.28.14 -----网元外网ipv4 bgp peer ip(只有agw须配置,每个ip之间以空格隔开)
wan_bgp_neighbor_ip6s: 240E:108:4:300:1C:1:0:D 240E:108:4:300:1C:1:0:E -----网元外网ipv6 bgp peer ip(只有agw选择配置,每个ip之间以空格隔开)
lan_name: bond1 ----网元业务内网接口名
lan_ip: 10.24.5.1/24 ----网元业务内网IPv4地址/掩码长度
lan_gw: 10.24.5.62 ----网元业务内网网关IPv4地址
lan_ip6: 0::0/64 ----网元业务内网IPv6地址/前缀长度(选配)
lan_gw6: 0::0 ----网元业务内网网关IPv6地址(选配)
lan_primary_name: ens1f0 ----当部署为bond环境时为网元业务内网bond的成员口接口名,当部署为非bond环境时不配或配空
lan_slaves_name: ens1f0 ens5f0 ----网元业务内网bond口包含的slave口接口名
lan_bgp_as: 65089 -----网元内网BGP local as(除了agw的其他网元须配置)
lan_bgp_neighbor_as: 65091 -----网元内网BGP peer as(除了agw的其他网元须配置)
lan_bgp_neighbor_ips: 10.8.16.13 10.8.16.14 -----网元内网ipv4 bgp peer ip(agw选配,其他网元必配)
lan_bgp_neighbor_ip6s: 240e:108:4:300:2:101:0:b 240e:108:4:300:2:101:0:c -----网元内网ipv6 bgp peer ip(选配)
keepalived_priority: 200 ----keepalived优先级,同一AZ下的两台natgw须配成不一样 (只有natgw须配置)
keepalived_unicast_peer_ip: 192.168.174.135 ----同一AZ下另一台natgw的内网IP (只有natgw须配置)
keepalived_unicast_vip: 1.1.1.1 ----内网VIP地址,即虚IP (只有natgw须配置)
- inventory/resource_pool_dir/host_vars/:所有被部署机器的配置模板通过conf生成在这下面
- DPOS tools-script:一键部署dpos的脚本script/dpos_deploy.sh,该脚本可以用来生成命令行指定的新资源池目录、修改hosts文件中网元ssh端口号或添加网元管理IP、创建或修改conf、修改yum源地址、一键部署dpos,如:
- 先进入vnet-deploy/ansible/目录下
- 修改hosts文件中ssh端口号:sh ./script/dpos_deploy.sh -d /home/ctyun/vnet-deploy/ansible/inventory/resource_pool_dir -p 10000
- 添加/修改hosts文件中网元管理IP:sh ./script/dpos_deploy.sh -d /home/ctyun/vnet-deploy/ansible/inventory/resource_pool_dir -a az1 -g agw -i 10.8.73.65
- 修改yml文件中yum源地址:sh ./script/dpos_deploy.sh -d /home/ctyun/vnet-deploy/ansible/inventory/resource_pool_dir -y 10.8.73.241
- 添加/修改conf中网元配置:sh ./script/dpos_deploy.sh -d /home/ctyun/vnet-deploy/ansible/inventory/resource_pool_dir -s /tmp/host-xxx.conf(host-xxx.conf里填写需要修改/添加的网元入口配置,文件名随意)
- 部署网元dpos:sh ./script/dpos_deploy.sh -d /home/ctyun/vnet-deploy/ansible/inventory/resource_pool_dir -m deploy_object -o install
- 卸载网元dpos:sh ./script/dpos_deploy.sh -d /home/ctyun/vnet-deploy/ansible/inventory/resource_pool_dir -m deploy_object -o uninstall (deploy_object: 部署对象)
- Host&Ansible-cfg:
- host: 各资源池配置目录下的hosts文件:inventory/resource_pool_dir/hosts,用于配置被部署机器的ssh账号、密码、端口号,python解释器版本,AZ主机组信息、网元主机组信息、网元管理IP列表等。
如:inventory/neimeng08/hosts
hosts文件主机组说明:
kube_networkelement_agw: 所有AGW网元
kube_networkelement_sgw: 所有SGW网元
kube_networkelement_igw: 所有IGW网元
kube_networkelement_vgw: 所有VGW网元
kube_networkelement_natgw: 所有NATGW网元
kube_networkelement_appgw: 所有VPCE/APPGW网元
kube_networkelement_agw_azx: azx下所有AGW网元,如az1下所有AGW:kube_networkelement_agw_az1
kube_networkelement_sgw_azx: azx下所有SGW网元,如az2下所有SGW:kube_networkelement_sgw_az2
kube_networkelement_igw_azx: azx下所有IGW网元,如az3下所有IGW:kube_networkelement_igw_az3
kube_networkelement_vgw_azx: azx下所有VGW网元,如az1下所有VGW:kube_networkelement_vgw_az1
kube_networkelement_natgw_azx: azx下所有NATGW网元,如az1下所有NATGW:kube_networkelement_natgw_az1
kube_networkelement_appgw_azx: azx下所有VPCE/APPGW网元,如az1下所有VPCE/APPGW:kube_networkelement_appgw_az1
- Ansible-cfg:cfg:ansible的基本配置文件,包含默认的hosts文件路径、ssh配置、日志路径等
- Host-Node:被部署机器
2. dpos自动化部署开发流程
2.1 hosts主机列表添加
需要与管控(杜永军)对齐,参照1.5 dpos自动化部署介绍hosts说明在inventory/resource_pool_dir/hosts文件里添加新网元的主机组及host管理IP。然后参照1.5 dpos自动化部署介绍Playbook说明在playbooks/dpos.yml的hosts变量中添加新网元的主机组。
2.2 入口配置添加及脚本适配
各网元的入口配置文件在各资源池配置目录下:inventory/resource_pool_dir/host.conf,该文件供部署时填写的唯一入口配置,新网元自动化部署开发时,需要将必要的配置参照1.5 dpos自动化部署介绍config的inventory/resource_pool_dir/host.conf说明填写到inventory/resource_pool_dir/host.conf,并适配机器配置模板生成脚本roles/dpos-deploy-init/files/host-conf.sh,host.conf及host-conf.sh适配好之后,执行ansible-playbook -i inventory/resource_pool_dir/hosts ./playbooks/dpos.yml --tags=host_conf_init就会在对应资源池机器配置模板目录inventory/neimeng08/host_vars/下生成各机器配置模板文件,后续task开发时可以直接使用机器配置模板文件里的全局变量。
2.3 机型配置添加
网元机型配置文件:roles/dpos-deploy-init/files/template-config.yml,参考1.5 dpos自动化部署介绍config的roles/dpos-deploy-init/files/template-config.yml说明添加新网元及其所有机型的配置。
2.4 配置生成
2.4.1 dpos.conf配置生成
- conf生成原理:dpos.conf的生成是在roles/dpos/tasks/config.yml里,通过roles/dpos/templates/dpos_service_templates_copy.j2脚本生成到inventory/resource_pool_dir/group_vars/all/config.yml里定义的vnet_dpos.service.dpos_service.run_path_script变量指定的默认dpos安装目录或/usr/local/vnet-dpos下,并传入了局部变量select_vars,即网元机型配置模板,template_selector['type']及template_selector['templ']通过inventory/resource_pool_dir/host_vars/目录下对应机器配置模板yml文件里获取该被部署机器的网元类型type和使用的机型模板templ,然后通过roles/dpos-deploy-init/files/template-config.yml里的dpos_template变量索引对应网元和机型的配置。通过roles/dpos/templates/dpos_service_templates_copy.j2脚本可以看到dpos.conf配置生成使用了roles/dpos-deploy-init/files/template-config.yml和inventory/resource_pool_dir/host_vars/xxx.yml里的配置。
- 新网元conf生成:在做完2.2 入口配置及2.3 机型配置之后,执行ansible-playbook -i inventory/resource_pool_dir/hosts ./playbooks/dpos.yml --tags=deploy_init,如果有新增的dpos.conf参数,则需要适配roles/dpos/templates/dpos_service_templates_copy.j2脚本,这些都适配完成后执行自动化部署dpos时,即执行ansible-playbook -i inventory/resource_pool_dir/hosts playbooks/dpos.yml --tags=install或ansible-playbook -i inventory/neimeng08/hosts playbooks/dpos.yml --tags=config就会在被部署机器的dpos安装目录生成dpos.conf。
2.4.2 新增其他配置文件生成
- 首先需要完成2 入口配置添加,并执行ansible-playbook -i inventory/resource_pool_dir/hosts ./playbooks/dpos.yml --tags=deploy_init在inventory/resource_pool_dir/host_vars/下生成各机器配置模板。
- 在roles/resource_pool_dir/templates/目录下增加新增配置文件生成脚本
- 在roles/resource_pool_dir/task/目录下添加新增配置文件生成的task
如gobgp配置:
- gobgp的入口配置包含有使用的gobgpd版本,bgp neighbor配置等
- gobgpd安装是在roles/system_init/tasks/gobgpd_install.yml(因为只需要首次部署时安装)
- /etc/vnet/gobgp.yml配置文件生成脚本:roles/dpos/templates/gobgpd.yaml.j2
- gobgp配置生成及服务启动:roles/dpos/tasks/gobgp.yml,在执行ansible-playbook -i inventory/resource_pool_dir/hosts playbooks/dpos.yml --tags=install或ansible-playbook -i inventory/resource_pool_dir/hosts playbooks/dpos.yml --tags=gobgp的时候会生成/etc/vnet/gobgp.yml配置并启动gobgp服务
2.5 task添加
如果有新增部署task,在完成2.4.2 新增对应配置后,还需要roles/resource_pool_dir/tasks/新建对应task的yml文件,在里面执行具体的部署功能实现,如配置的生成,服务的启动等,如roles/dpos/tasks/gobgp.yml,然后需要在roles/dpos/tasks/main.yml中增加对应的task及tags。
2.6 首次部署任务添加
如果只是首次部署时才需要执行的task,如依赖及驱动的安装、拆bond、配置大页等等,将其放到roles/system_init/实现。
2.7 check项添加及适配
- 适配现有check项:目前已有check项bgp邻居建联状态检查:bgp_check,eip等配置检查:config_check,接口连通性检查:connectivity_check,corefile文件检查:corefile_check,dpos日志检查:log_check,进程运行状态检查:process_check,路由检查:route_check,流量情况检查:traffic_stats_check,dpos版本检查:version_check。
新增check项:如果需要新增check项,请在roles/dpos/tasks/目录下增加对应check的yml,并且在roles/dpos/tasks/main.yml中增加对应的task及tags。