Ansible 脚本部署 OpenStack
Posted 君邪不邪乎
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Ansible 脚本部署 OpenStack相关的知识,希望对你有一定的参考价值。
1.规划节点
表 8-3-1 节点规划
IP | 主机名 | 节点 |
---|---|---|
172.16.51.65 | ansible | Ansible |
172.16.51.69 | controller | 控制节点 |
172.16.51.70 | compute | 计算节点 |
2.基础准备 controller 和 compute 节点拥有两张网卡,其中一个网卡和 Ansible 节点在同一个网络中。
Ansible、controller 和 compute 节点为 OpenStack 中虚拟机,Ansible 节点提供 Yum 安装源和 Ansible 部署脚本,利用安装源和部署脚本可一键部署并配置 OpenStack 平台。提供 Ansible qcow2 镜像,可直接在 OpenStack 中启动 Ansible 虚拟机。
8.3.3 案例实施
1.基础环境的配置
(1)上传所需 ISO 镜像
使用 SecureFX 工具,上传 CentOS-7-x86_64-DVD-1511.iso 和 XianDian-IaaS-v2.2.iso 镜像到 Ansible 节点中。
[root@ansible ~]# ll total 7012768 -rw-r--r-- 1 root root 4329570304 Jan 16 2017 CentOS-7-x86_64-DVD-1511.iso
-rw-r--r-- 1 root root 2851502080 Nov 6 2017 XianDian-IaaS-v2.2.iso
(2)设置 Yum 源
在/opt/目录中创建 centos7 和 iaas 文件夹,将 CentOS-7-x86_64-DVD-1511.iso 和 XianDian-IaaS-v2.2.iso 镜像挂载至文件夹中。
[root@ansible ~]# mkdir /opt/centos7
[root@ansible ~]# mkdir /opt/iaas
[root@ansible ~]# mount CentOS-7-x86_64-DVD-1511.iso /opt/centos7
[root@ansible ~]# mount XianDian-IaaS-v2.2.iso /opt/iaas
删除/etc/yum.repos.d/文件中所有默认源,创建本地源文件,并设置/opt/centos7 和
/opt/iaas/iaas-repo/两个源路径。
[root@ansible ~]# rm -rf /etc/yum.repos.d/* [root@ansible ~]# cat <<EOF > /etc/yum.repos.d/local.repo [centos7] name=centos7 baseurl=file:///tmp/centos7 gpgcheck=0 enabled=1 [iaas] name=iaas baseurl=file:///tmp/iaas/iaas-repo gpgcheck=0 enabled=1 EOF
(3)配置 vsftpd 服务安装 vsftpd 服务,并提供 FTP 方式访问 Yum 源。
[root@ansible ~]# yum install vsftpd -y
[root@ansible ~]# echo "anon_root=/opt" >> /etc/vsftpd/vsftpd.conf
[root@ansible ~]# systemctl restart vsftpd
[root@ansible ~]# systemctl enable vsftpd
2.设置 Ansible 基础配置
(1) 设置 Ansible 的 host 主机名
此节中需要编写配置安装 OpenStack 所有的基础环境配置内容,内容包括安装服务的账
号和密码,配置基础服务(如 RabbitMQ、mysql 等)用户密码和账号等。在/etc/ansible/hosts 文件中设置 controller 和 compute 节点的主机名,配置内容如下。
[root@ansible ~]# cat /etc/ansible/hosts
[controller]
172.16.51.69
[compute]
172.16.51.70
(2) 配置环境变量编辑提供的 Ansible 脚本中的环境变量文件,根据当前环境配置所需变量。
[root@ansible]#cat /opt/openstack_base_x/group_vars/all HOST_IP: 172.16.51.69 ##controller 节点 IP 地址 HOST_NAME: controller ##controller 节点主机名称 HOST_IP_NODE: 172.16.51.70 ##compute 计算节点 IP 地址 HOST_NAME_NODE: compute ##compute 计算节点主机名 RABBIT_USER: openstack ##rabbitmq 用户名 RABBIT_PASS: 123456 ##rabbitmq 用户密码 DB_PASS: 123456 ##数据库密码 DOMAIN_NAME: xiandian ##openstack 域名称 ADMIN_PASS: 123456
DEMO_PASS: 123456
KEYSTONE_DBPASS: 123456
GLANCE_DBPASS: 123456
GLANCE_PASS: 123456
NOVA_DBPASS: 123456
NOVA_PASS: 123456
NEUTRON_DBPASS: 123456
NEUTRON_PASS: 123456
METADATA_SECRET: 123456
##openstack 组件的密码
INTERFACE_NAME: eth1
##设置 openstack 平台外部网卡
ALL_SERVER_ROOT_PASSWORD: 000000
##设置 controller 节点和 compute 节点的 root 密码
NAME1: centos7
URL1: ftp://172.16.51.65/centos7/
NAME2: iaas
URL2: ftp://172.16.51.65/iaas/iaas-repo/
##设置 yum 源的路径
3.环境安装
(1)执行 Ansible 部署脚本配置完成所需环境变量后,进入 Ansible 脚本目录,执行 Ansible 脚本,一键自动部署
OpenStack 平台。
[root@ansible ~]# cd /opt/openstack_base_x/ [root@ansible openstack_base_x]# sh install.sh
具体执行过程如图 8-3-1 所示。
(2)Ansible 脚本执行完毕
Ansible 脚本执行完成后,可以在最后查看到执行结果,显示安装过程中是否有错误异常,如图 8-3-2 所以。
图 8-3-2 Ansible 脚本执行完毕
4.访问 OpenStack 平台
(1)访问 OpenStack 平台
等待执行完成后可以通过 Web 界面查看最后的安装效果,如图 8-3-3 所示。
(2)登录 Dashboard
输入在环境变量中设置的域、用户名、密码,单击“连接”按钮,即可登录 Dashboard 平台中,查看到项目列表,如图 8-3-4 所示。
图 8-3-4 登录 Dashboard
5.目录结构(1)目录构成
了解一个简单 Ansible 的 playbooks 的构成部分。首先要了解 Ansible 脚本目录。此目录拥有所有使用到的数据和变量信息。此目录的所有文件和目录如下所示。
openstack_base/
├── deploy.yml ├── install.sh
├── group_vars
│ └── all
├── library
└── roles
├── config_basic
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ ├── iaas-pre-host.j2
│ └── local.repo
├── dashboard
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ └── dashboard.j2
├── glance
│ ├── tasks
│ │ └── main.yml
│ └── templates
│ └── glance.j2
├── keystone
│ ├── tasks
│ │ └── main.yml
│ └── templates │ └── keystone.j2 ├── mysql │ ├── tasks │ │ └── main.yml │ └── templates │ └── base.j2 ├── neutron_compute │ ├── tasks │ │ └── main.yml │ └── templates │ └── neutron-compute.j2 ├── neutron_controller │ ├── tasks │ │ └── main.yml │ └── templates │ └── neutron-controller.j2 ├── nova_compute │ ├── tasks │ │ └── main.yml │ └── templates │ └── nova-compute.j2 ├── nova_controller │ ├── tasks │ │ └── main.yml │ └── templates │ └── nova-controller.j2 ├── ntpclient │ └── tasks │ └── main.yml
└── rabbit
└── tasks
└── main.yml
34 directories, 23 files
从上述文件可以看出 playbooks 的内一个操作由 roles 目录内的执行方法来执行。所有的默认环境参数则由 group_vars 目录内 all 文件来定义。每一个 roles 目录内的方法均分为 tasks 和 templates 两个目录,tasks 目录为该方法执行的所有脚本,templates 目录为此方法所有的模板文件或者是配置文件。
(2)install.sh 安装脚本
install.sh 安装脚本主要是设置与控制节点和计算节点的无秘钥通信,以及关联了 playbooks 的安装命令,通过执行 install.sh 脚本直接一键安装 OpenStack 平台。
#!/bin/bash printf "\\033[35m \\n ---> 正在配置节点无钥认证\\n\\033[0m" all_hosts=cat group_vars/all |grep HOST_IP|awk -F : \'{print $2}\' ALL_SERVER_ROOT_PASSWORD=cat group_vars/all |grep ALL_SERVER_ROOT_PASSWORD|awk -F : \'{print $2}\' if [[ ! -s ~/.ssh/id_rsa.pub ]];then ssh-keygen -t rsa -N \'\' -f ~/.ssh/id_rsa -q -b 2048 fi echo "----->" for hosts in $all_hosts; do echo "$hosts ==> ..." ping $hosts -c 4 >> /dev/null 2>&1 if [ 0 -ne $? ]; then echo -e "\\033[31mWarning\\n$hosts IP unreachable!\\033[0m" exit 1 fi |
---|
expect -c "set timeout -1; spawn ssh-copy-id -i /root/.ssh/id_rsa $hosts ; expect { (yes/no) {send -- yes\\r;exp_continue;} assword: {send -- $ALL_SERVER_ROOT_PASSWORD\\r;exp_continue;} eof {exit 0;} }"; done printf "\\033[35m 节点无秘钥环境配置完毕\\n\\033[0m" ansible-playbook deploy.yml ##通过 ansible-playbook 安装 openstack 平台 |
(3)playbook 文件
playbook 文件为编辑好任务安排,通过执行 playbook 文件实现批量管理。此文件中编
写了对 controller 节点需要安装的所有服务,以及 compute 节点需要安装的所有服务。
- hosts: controller remote_user: root roles:
- config_basic
- mysql
- rabbit
- keystone
- glance
- nova_controller
- neutron_controller
- dashboard
- hosts: compute remote_user: root roles:
- config_basic
- ntpclient
- nova_compute
- neutron_compute
(4)环境变量
环境变量是在执行 Ansible 安装过程中,所需要的一些当前环境的参数,Ansible 会根据环境变量的参数来进行安装 OpenStack 平台。用户需要填写环境参数文件 group_vars 目录内 all 文件如下。
HOST_IP: 172.16.51.69
##controller 节点 IP 地址 HOST_NAME: controller
##controller 节点主机名称
HOST_IP_NODE: 172.16.51.70
##compute 计算节点 IP 地址
HOST_NAME_NODE: compute
##compute 计算节点主机名
RABBIT_USER: openstack
##rabbitmq 用户名
RABBIT_PASS: 123456
##rabbitmq 用户密码 DB_PASS: 123456
##数据库密码
DOMAIN_NAME: xiandian
##openstack 域名称
ADMIN_PASS: 123456
DEMO_PASS: 123456
KEYSTONE_DBPASS: 123456
GLANCE_DBPASS: 123456
GLANCE_PASS: 123456
NOVA_DBPASS: 123456
NOVA_PASS: 123456
NEUTRON_DBPASS: 123456
NEUTRON_PASS: 123456
METADATA_SECRET: 123456
##openstack 组件的密码
INTERFACE_NAME: eth1
##设置 openstack 平台外部网卡
ALL_SERVER_ROOT_PASSWORD: 000000
##设置 controller 节点和 compute 节点的 root 密码
NAME1: centos7
URL1: ftp://172.16.51.65/centos7/
NAME2: iaas
URL2: ftp://172.16.51.65/iaas/iaas-repo/
##设置 yum 源的路径
6.roles 目录结构
(1)config_basic 目录
config_basic 任务是配置和安装节点的基础服务,包括配置 Yum源文件、修改主机名称、
配置防火墙设置。
config_basic/
├── tasks
│ └── main.yml
└── templates
├── iaas-pre-host.j2
└── local.repo
main.yml 为 config_basic 的任务列表,编写了所需要执行的操作内容和过程。templates 目录下的 iaas-pre-host.j2 为所要安装服务的脚本文件,local.repo 为所需的 Yum 源配置文件, main.yml 将脚本文件和 local.repo 文件复制至目标主机中,并执行脚本安装基础服务和配置。 config_basic 目录内 tasks 的 main.yml 文件如下。
- name: delete the default installation source
shell: rm -rf /etc/yum.repos.d/* - name: Configure the installation source template: src=local.repo dest=/etc/yum.repos.d/local.repo
- name: configuration base environment template: src=iaas-pre-host.j2 dest=/var/tmp/iaas-pre-host.sh
- command: bash /var/tmp/iaas-pre-host.sh
(2)mysql 目录
在配置完成基本的环境之后,需要配置相对应的基础服务,MySQL 任务是配置和安装
控制节点的数据库服务。
mysql/
├── tasks
│ └── main.yml
└── templates
└── base.j2
main.yml 为 MySQL 的任务列表,将所需的安装和配置 MySQL 服务的脚本 base.j2 文件复制至目标节点中,并执行脚本安装 MySQL 服务。base.j2 文件为安装、配置 MySQL 服务脚本。tasks 目录内新建 main.yml 文件,文件如下。
- name: Copy Basic Configuration Files template: src=base.j2 dest=/var/tmp/base.sh
- command: bash /var/tmp/base.sh
(3)ntpclient 目录
ntpclient 任务是配置计算节点向控制节点进行时间同步,保证计算节点和控制节点时间
相同。
ntpclient/
└── tasks
└── main.yml
main.yml 为 ntpclient 的任务列表,配置节点的 NTP 服务时间同步节点,并启动 ntpd 服
务器。tasks 目录内新建 main.yml 文件,文件具体如下。
- name: NtpDate From Controller Node
shell: "{{ item }}" with_items:
- sed -i \'/server/d\' /etc/ntp.conf
- echo "server {{ HOST_IP }}" >> /etc/ntp.conf
- service ntpd restart
(4) rabbit 目录 rabbit 任务是配置控制节点 rabbitmq 服务。
rabbit/
└── tasks
└── main.yml
main.yml 为 rabbit 的任务列表,配置节点 rabbitmq 服务创建 OpenStack 基础服务所使用
的用户名和密码,以及访问权限。tasks 目录 main.yml 文件,文件具体如下。
- name: Start Rabbitmq Services service: name=rabbitmq-server state=restarted enabled=true - name: Start Memcached Services service: name=memcached state=restarted enabled=true - name: Add Rabbitmq User rabbitmq_user: user={{ RABBIT_USER }} password={{ RABBIT_PASS }} vhost=/ configure_priv=.* read_priv=.* write_priv=.* state=present
(5) keystone 目录 keystone 任务是安装和配置 OpenStack 平台中 keystone 服务,main.yml 为 keystone 的任务列表,编写将 keystone.j2 脚本复制至节点中,并执行脚本,keystone.j2 文件包含了 keystone 服务的安装和配置。
keystone/
├── tasks
│ └── main.yml
└── templates
└── keystone.j2
tasks 目录 main.yml 文件,文件如下。
- name: Copy Keystone Configuration Files template: src=keystone.j2 dest=/var/tmp/keystone.sh
- command: bash /var/tmp/keystone.sh
(6)glance 目录
Glance 任务是安装和配置 OpenStack 平台中 Glance 服务,main.yml 为 Glance 的任务列表,编写将 glance.j2 脚本复制至节点中,并执行脚本,glance.j2 包含了 Glance 服务的安装和配置。
glance/
├── tasks
│ └── main.yml
└── templates
└── glance.j2
tasks 目录 main.yml 文件,文件如下。
- name: Copy Glance Configuration Files template: src=glance.j2 dest=/var/tmp/glance.sh
- command: bash /var/tmp/glance.sh
(7)nova_controller 目录 nova_controller 任务是安装和配置 OpenStack 平台中控制节点 Nova 所有服务。main.yml 为 nova_controller 的任务列表,编写将 nova-controller.j2 脚本复制至节点中,并执行脚本, nova-controller.j2 文件中包含了控制节点 Nova 服务的安装和配置。
nova_controller/
├── tasks
│ └── main.yml
└── templates
└── nova-controller.j2
tasks 目录 main.yml 文件,文件如下。
- name: Copy Nova Controller Configuration Files template: src=nova-controller.j2 dest=/var/tmp/nova-controller.sh
- command: bash /var/tmp/nova-controller.sh
(8)nova_compute 目录 nova_compute 任务是安装和配置 OpenStack 平台中计算节点 nova-compute 服务, main.yml 为 nova_compute 的任务列表,编写将 nova-compute.j2 脚本复制至节点中,并执行脚本。nova_compute.j2 文件中包含了计算节点 nova-compute 服务的安装和配置。
nova_compute/
├── tasks
│ └── main.yml
└── templates
└── nova-compute.j2
tasks 目录 main.yml 文件,文件如下。
- name: Copy Nova Compute Configuration Files template: src=nova-compute.j2 dest=/var/tmp/nova-compute.sh
- command: bash /var/tmp/nova-compute.sh
(9)neutron_controller 目录 neutron_controller 任务是安装和配置 OpenStack 平台中控制节点 Neutron 服务,main.yml 为 neutron_controller 的任务列表,编写将 neutron-controller.j2 脚本复制至节点中,并执行脚本。neutron_controller.j2 文件中包含了控制节点 Neutron 服务的安装和配置。
neutron_controller/
├── tasks
│ └── main.yml
└── templates
└── neutron-controller.j2
tasks 目录 main.yml 文件,文件如下。
- name: Copy Neutron Controller Configuration Files template: src=neutron-controller.j2 dest=/var/tmp/neutron-controller.sh
- command: bash /var/tmp/neutron-controller.sh
(10)neutron_compute 目录 neutron_compute 任务是安装和配置 OpenStack 平台中计算节点 Neutron 服务,main.yml
为neutron_compute的任务列表,编写将neutron-compute.j2脚本复制至节点中,并执行脚本, neutron-compute.j2 文件中包含了计算节点 Neutron 服务的安装和配置。
neutron_compute/
├── tasks
│ └── main.yml
└── templates
└── neutron-compute.j2
tasks 目录 main.yml 文件,文件如下。
- name: Copy Neutron Compute Configuration Files template: src=neutron-compute.j2 dest=/var/tmp/neutron-compute.sh
- command: bash /var/tmp/neutron-compute.sh
(11)dashboard 目录
Dashboard 任务是安装和配置 OpenStack 平台中 Dashboard 服务,main.yml 为 Dashboard 的任务列表,编写将 dashboard.j2 脚本复制至节点中,并执行脚本,dashboard.j2 文件中包含了 Dashboard 服务的安装和配置。
dashboard/
├── tasks
│ └── main.yml
└── templates
└── dashboard.j2
tasks 目录 main.yml 文件,文件如下。
- name: Copy Dashboard Configuration Files template: src=dashboard.j2 dest=/var/tmp/dashboard.sh
- command: bash /var/tmp/dashboard.sh
用Kolla在阿里云部署10节点高可用OpenStack
为展现 Kolla 的真正实力,我在阿里云使用 Ansible 自动创建 10 台虚机,部署一套多节点高可用 OpenStack 集群!
前言
上次 Kolla 已经表示了要打 10 个的愿望,这次我们就满足它。
通过本期内容,你将看到:
- 如何使用阿里云云命令行(Cloud Shell)
- 如何使用 Ansible 创建阿里云资源
- Kolla 多节点部署配置说明
- OpenStack 高可用架构
本期内容仍然是干货满满,写文章,调脚本,剪视频,不但花时间,还要在 阿里云 花钱租云服务器,真的费了不少精力,所以如果本文对你有所帮助,请务必点赞支持!谢谢。
操作过程仍可在 B站观看视频
准备工作
使用 Cloud Shell
一次性创建 10 台虚机,从界面一个个的点就太无聊了。所以我们要想办法让这个过程自动化地完成。
第一个念头就是用 Python 去调用 API,于是直奔 开发者工具 页面而去,却发现阿里云提供了网页版的命令行工具:Cloud Shell,使用起来更加方便。
启动 Cloud Shell 会自动为你创建一个虚机,里面不但内置了连接阿里云的 CLI 工具,而且因为是登录后启动,它自动把认证也处理了。也就是说我们直接就可以开始使用了,非常方便。
具体请参考官方文档:什么是云命令行?
不仅如此,为了让大家更好地掌握这些工具的用法,还提供了交互式的 实验教程,花上几分钟,也许再花上几分钱,就能上手实验。
在实验了 使用 Ansible 管理云资源 这个教程之后,决定就采用这个方法了。
CloudShell 的操作内容较多,单独录了一期 视频介绍。
准备容器镜像
这次部署多节点,比前几次只部署 All-In-One
节点新增了 Cinder
存储服务,所以把要用到的镜像都提前构建好。
关于 Kolla 构建 Docker 镜像的过程以后再详述。
容器镜像仍然使用阿里云的容器镜像服务,保存在 华东2(上海)
地区。
值得注意的是,上一期内容中我在 华东1(杭州)
地区测试,跨地区从公网地址拉取镜像,速度也还不错。但是本次测试只在部署节点分配了公网 IP,其余节点都不会分配公网 IP,也就没法访问公网资源了。
一个解决办法是只在 华东2(上海)
地区测试,这样可以配置私网地址。这样限制较大。
另一个比较通用的办法是先在部署节点上搭建一个私有的 registry 作为中转,就和使用 davycloud-openstack-stein.iso
安装的 Deploy Node 一样。
最终采取的是把 registry 配置成 PROXY
模式,这样就不用事先把镜像 push 到 registry 中了。
# deploy.yml 中的内容
- name: Start docker registry
docker_container:
name: registry
restart_policy: always
image: registry:2
ports:
- 4000:5000
volumes:
- registry:/var/lib/registry
env:
REGISTRY_PROXY_REMOTEURL: "https://registry.cn-shanghai.aliyuncs.com"
编写 Ansible 剧本
参考上面的教程完成。
目标说明
Kolla 角色说明
Kolla 在部署 OpenStack 阶段,按职责分为 5 种角色:
- control,控制节点
- network,网络节点
- compute,计算节点
- storage,存储节点
- monitoring,监控节点(本次未涉及)
实际 1 个节点可以有 1 个或多个角色。比如,All-In-One
安装时,一个节点就充当了所有角色。
实际这里的角色对应的是 Ansible 中的主机分组概念。
节点上最终会安装哪些服务(也就是启动哪些容器),最终由启用的各个功能模块综合决定而成。例如,如果启用了 cinder
,则 cinder-api
服务会安装在所有的 control
控制节点上,而 cinder-volume
服务会安装在所有的 storage
存储节点上。
除此之外,还需要:
- 1 个部署节点,即安装
Kolla-Ansible
的节点 - 1 个 docker 容器镜像的 registry
在我提供的 ISO 光盘里,系统安装时选择了 Deploy Node
就会自动安装这些。
如果是平常部署,任选一个机器充当部署节点即可,部署节点本身也可以是控制或计算或存储。
这次在阿里云上,我们单独创建一个虚机来当部署节点。
多节点角色分配
10 个节点的角色分配情况:
- 控制节点的数量需要是奇数,设置为 3 个
- 网络节点是安装 Neutron agent 的地方,如果启用了 haproxy / keepalived,浮动 IP 也是在这些节点上启动,本次设置为 2 个
- 存储节点我们本次需要安装 Ceph,默认至少需要 3 个节点
- 计算节点是最终启动虚机的地方,正常环境下应该是数量最多的,测试只需要 2 个就够了
注意: 阿里云上的虚机不支持 keepalived,所以这次无法启用 haproxy。
创建资源
本节操作在 Cloud Shell 中进行。
下载项目文件
进入云命令行后直接运行:
git clone https://code.aliyun.com/davycloud/kolla-openstack.git
cd kolla-openstack/ansible
配置资源
配置信息都在 kolla-openstack/ansible/group_vars/all
文件中,根据情况修改即可。
默认配置会创建 11 台抢占式实例,对应上面的规划:
- master: 1 台,用来安装 kolla-ansible,部署环境
- control: 3 台,用来部署 OpenStack 的控制节点
- network: 2 台,用来部署 OpenStack 的网络节点
- storage: 3 台,用来部署 OpenStack 的存储节点
- compute: 2 台,用来部署 OpenStack 的计算节点
创建资源
执行创建资源的剧本:
cd ~/kolla-openstack/ansible
ansible-playbook create.yml
检查资源创建情况
剧本完成后可以在页面上看到资源的创建情况。
同时 ~/kolla-openstack/ansible
目录下会生成一个 hosts
文件,记录所有创建的实例的私网地址和 hostname
.
注意: 我本意是将此
hosts
文件直接复制到部署节点的/etc/hosts
.但是这里遇到了阿里云 ansible 模块的一个 bug. 其影响就是没有办法在批量创建实例时按序生成
hostname
,例如:control01, control02, control03.所以
hosts
文件中同类型主机名都是一样的,需要在后面手动修改。
配置 Kolla-Ansible 部署节点
在虚机资源创建完成后,首先需要配置的是部署节点。它是这批虚机中唯一默认创建了公有 IP 的,所以可以直接在 Cloud Shell 中操作。其它节点只有私有网络,必须通过它来操作。
动态 inventory
因为每次创建虚机的时候 IP 地址都是不确定的,不可能提前写在 Ansible 的剧本中。而每次如果手动去修改编辑主机信息,又很不方便。
所以 Ansible 中有一个动态 inventory 的功能,通过调用脚本来动态获取主机信息。
阿里云把这个动态 inventory 脚本也为我们写好了。这个脚本所在项目开源托管在 GitHub 中,下载地址 时不时的无法访问,我就一并放在了自己的这个项目中,也就是 ~/kolla-openstack/ansible/alicloud.py
这个脚本,同时运行它需要一个配置文件,就是和它同目录的 alicloud.ini
目前这个动态 Inventory 还在被官方集成的过程中,需要先手动安装依赖:
pip install ansible_alicloud_module_utils
执行 deploy.yml
剧本
这样,我们每次就无需修改代码,直接运行下面的剧本就可以了:
chmod +x ~/kolla-openstack/ansible/alicloud.py
ansible-playbook -i ~/kolla-openstack/ansible/alicloud.py deploy.yml -u root -k
执行命令后提示输入密码: Test12345
密码是在
~/kolla-openstack/ansible/group_vars/all
中设置
该剧本会完成以下任务:
- 安装 Ansible 和 Kolla-Ansible
- 启动 registry 并设置镜像源
- 生成 SSH 密钥
- 拷贝 Kolla-Ansible 的配置文件到
/root
目录 - 执行
kolla-genpwd
执行完此步骤后,我们仍然需要和以前一样通过 SSH 登录到部署节点,完成后续的 OpenStack 安装任务。
虽然我们可以在 Cloud Shell 中远程操作部署节点来执行部署任务,但是基于下面原因:
- 整个部署比较耗时,这个临时虚机并不稳定
- 多节点部署也是比较灵活的,有些配置不可避免需要根据情况设置,再套一层 ansible 没必要
- 即使针对一种场景写 ansible 剧本调试都要花时间,意味着多花租服务器的钱…
因此后面的操作将继续手动执行
执行成功后,在 /root
目录下会有以下文件:
all-in-one # 本次用不上
bootstrap.yml # 用来初始化其它节点的 Ansible 剧本
hosts # 创建资源时生成的 hosts 文件
multinode # Kolla-Ansible 多节点的 Inventroy 文件
修改 hosts
文件
编辑 hosts
文件,把其中的 hostname
按照主机的角色进行修改:
172.16.1.31 control01
172.16.1.32 control02
172.16.1.33 control03
172.16.1.34 network01
172.16.1.35 network02
...
把 hosts
内容复制到 /etc/hosts
中:
cat hosts >> /etc/hosts
配置 multinode
编辑 multinode
文件,把其中的 hostname
按照主机的角色分组进行填写:
[control]
control01
control02
control03
[network]
network01
network02
[compute]
compute01
compute02
compute03
[monitoring]
#monitoring01 # 暂不支持
[storage]
storage01
storage02
storage03
# 这下面的所有内容都不要动了!!
使用 Kolla-Ansible 安装多节点环境
以下的操作都是在部署节点上执行
下发 SSH 公钥
为了方便 Ansible 无密码方式连接各个节点,需要先把部署节点的 SSH 公钥下发到各个节点。
因为节点数量不多,而且密码都是固定的,所以这里用 sshpass
手动执行完成:
sshpass -p Test12345 ssh-copy-id control01
sshpass -p Test12345 ssh-copy-id control02
...
sshpass -p Test12345 ssh-copy-id storage03
使用 Ansible 命令测试各节点的连通情况:
ansible -i multinode -m ping all
所有节点都应该能正常回应。
执行 bootstrap.yml
剧本
通过 ansible-playbook
命令执行 bootstrap.yml
剧本:
ansible-playbook -i multinode bootstrap.yml
该剧本会初始化各个节点,为它们安装上 docker
等必需软件,详情可以查看剧本的内容。
配置 /etc/kolla/globals.yml
需要修改的配置项如下:
# Valid option is Docker repository tag
#openstack_release: ""
openstack_release: "train"
#kolla_internal_vip_address: "10.10.10.254"
kolla_internal_vip_address: "172.16.1.33"
docker_registry: "172.16.1.30:4000"
docker_namespace: "davycloud"
#docker_registry_insecure: "yes"
# 不启用 HAProxy
enable_haproxy: "no"
# 启用 ceph
enable_ceph: "yes"
# 启用 cinder
enable_cinder: "yes"
需要注意的地方:
kolla_internal_vip_address
必须填写部署节点真实的私网地址docker_registry
必须配置为部署节点的 IP:4000- 不启用
haproxy
,必须要先取消注释,然后修改为"no"
配置 Ceph-OSD 磁盘
注意!警告! 下面的命令会清除所有数据,请谨慎操作!
参考文档,配置 Ceph-OSD 的存储为 Bluestore
查看存储节点的盘:
# ansible -i multinode "storage*" -a "lsblk"
假设 所有存储节点的盘都是 vdb
# ansible -i multinode "storage*" -a "parted /dev/vdb -s -- mklabel gpt mkpart KOLLA_CEPH_OSD_BOOTSTRAP_BS 1 -1"
# ansible -i multinode "storage*" -a "parted /dev/vdb print"
绑定弹性网卡
在创建资源的时候为网络节点额外创建了 1 块弹性网卡,不知道何故并没有绑定到实例上。需要在阿里云的页面上把两个弹性网卡绑定到网络节点实例上。
开始部署
整体的部署流程和命令和部署单节点是一样的,唯一需要增加的地方是加一个 -i
选项,指定 inventory 文件,也就是 multinode
这个文件。
拉取镜像
kolla-ansible -i multinode pull
因为这次节点数量比较多,所以镜像拉取耗时会稍微长一点,可以耐心等待。
不同角色的节点拉取的镜像是不一样的,可以在部署节点另开一个 SSH 会话,用下面的命令查看:
ansible -i multinode all -a "docker images"
部署命令 3 连
在部署节点依次执行下面 3 个命令即可:
kolla-ansible -i multinode prechecks
kolla-ansible -i multinode deploy
kolla-ansible -i multinode post-deploy
高可用架构
正常情况下的高可用架构会在网络节点安装 HAProxy 和 Keepalived,这次演示并没有。
API
OpenStack 所有模块的 API 服务都是无状态的,所以横向扩展搭配负载均衡即可实现高可用。
由于 Kolla-Ansible 中启用负载均衡(HAProxy)的前提是要启用 Keepalived,但是阿里云又不支持,所以这次实验其实 API 的负载均衡并没有起效果,API 地址固定访问了指定的第 1 个控制节点地址。
实际上,我们可以另外启动一个外网浮动 IP,把这个浮动 IP 绑定到任意一个控制节点上,然后访问 API,都是可以正常提供服务的。
此外阿里云提供了现成的负载均衡服务,这里应该可以直接对接阿里云的负载均衡产品,不过并无必要,这次就不尝试了。
网络服务
网络节点的高可用实际情况比较复杂,这里不展开讨论了。简单展示一下网络服务:
块存储服务
MariaDB
集群
数据库采用的是 MariaDB Galera Cluster 集群方案,登录后可以查看:
RabbitMQ
RabbitMQ 的集群状态可以通过管理页面查看,不过要正常访问,需要做以下操作:
- 在阿里云的安全组中把
15672
端口放开 - 进入 rabbitmq 容器为 openstack 用户授权
访问 http://<控制节点外网IP>:15672
进入 RabbitMQ 管理页面:
Ceph
Ceph 本身就是分布式的,这里就不赘述了。
记得释放实例!
别忘了最重要的事情,测试完成后别忘了去释放实例,以免一直扣费。
抢占式实例是保证实例有一个小时的稳定使用,不代表一个小时之后就会回收。如果供应比较大的情况下,系统可能会长期不回收你的实例,那就要一直扣费了!
记得释放实例!
记得释放实例!
记得释放实例!
在 Cloud Shell 中一键清理本次实验创建的资源:
cd ~/kolla-openstack/ansible
ansible-playbook destroy.yml
清理资源也可以通过网页完成,最后务必检查清理结果,以避免资源没有释放导致扣费。
注意,本次实验还有云盘需要释放!!
如果本文对你有帮助,请 点赞、 关注、分享 来一波。
!--more-->以上是关于Ansible 脚本部署 OpenStack的主要内容,如果未能解决你的问题,请参考以下文章
适用于OpenStack Ussuri 版本的 Kolla-Ansible部署文档
如何用Ansible部署Kubernetes集群到OpenStack