searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

基于ansible自动化部署网元数据面开发指南

2023-10-30 08:47:15
36
0

一、   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。

 

0条评论
作者已关闭评论
l****n
2文章数
0粉丝数
l****n
2 文章 | 0 粉丝
l****n
2文章数
0粉丝数
l****n
2 文章 | 0 粉丝
原创

基于ansible自动化部署网元数据面开发指南

2023-10-30 08:47:15
36
0

一、   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。

 

文章来自个人专栏
文章 | 订阅
0条评论
作者已关闭评论
作者已关闭评论
0
0