Ansible部署Openstack平台目录
Ansible部署Openstack平台
案例准备
1.规划节点
IP | 主机名 | 节点 |
---|---|---|
192.168.100.30 | ansible | Ansible节点 |
192.168.100.20 | compute | Controller节点 |
192.168.100.10 | controller | Compute节点 |
2.基础准备
创建三台云主机进行实验,云主机镜像实验CentOS_7.9镜像
案例实施
1.环境准备
该案例使用Ansible工具部署一个单控制单计算的Openstack平台
(1)配置IP并连接
连接三台云主机,并修改主机名分别为ansible,controller,compute。修改完成后使用bash命令,以生效新主机名
[root@localhost ~]# hostnamectl set-hostname compute
[root@localhost ~]# hostnamectl set-hostname controller
[root@localhost ~]# hostnamectl set-hostname ansible
需使用fdisk 命令在 compute节点进行分区,三个大小为5G分区
[root@compute ~]# fdisk /dev/sdb
...
[root@compute ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 100G 0 disk
├─sda1 8:1 0 1G 0 part /boot
├─sda2 8:2 0 10.1G 0 part /home
├─sda3 8:3 0 7.9G 0 part [SWAP]
├─sda4 8:4 0 1K 0 part
└─sda5 8:5 0 81G 0 part /
sdb 8:16 0 20G 0 disk
├─sdb1 8:17 0 5G 0 part
├─sdb2 8:18 0 5G 0 part
└─sdb3 8:19 0 5G 0 part
sr0 11:0 1 4.4G 0 rom
(2)Ansible安装FTP和Ansible服务
上传镜像和软件包,配置本地镜像源,安装Ansible服务,安装openstack-iaas
把Ansible节点的防火墙和SELinux关闭
[root@ansible ~]# systemctl stop firewalld && systemctl disable firewalld
Removed symlink /etc/systemd/system/multi-user.target.wants/firewalld.service.
Removed symlink /etc/systemd/system/dbus-org.fedoraproject.FirewallD1.service.
[root@ansible ~]# ls
anaconda-ks.cfg ansible_zabbix.zip CentOS-7-x86_64-DVD-2009.iso chinaskills_cloud_iaas_v2.0.3.iso
[root@ansible ~]# mkdir /opt/{centos,iaas}
[root@ansible ~]# mount -o loop CentOS-7-x86_64-DVD-2009.iso /mnt/
mount: /dev/loop0 写保护,将以只读方式挂载
[root@ansible ~]# cp -r /mnt/* /opt/centos/
[root@ansible ~]# umount /mnt/
[root@ansible ~]# mount -o loop chinaskills_cloud_iaas_v2.0.3.iso /mnt/
mount: /dev/loop0 写保护,将以只读方式挂载
[root@ansible ~]# cp -r /mnt/* /opt/iaas/
[root@ansible ~]# umount /mnt/
[root@ansible ~]# unzip ansible_zabbix.zip
...
[root@ansible ~]# mv ansible /opt/
[root@ansible ~]# mv /etc/yum.repos.d/* /media/
[root@ansible ~]# vi /etc/yum.repos.d/ansible.repo
[ansible]
name=ansible
baseurl=file:///opt/ansible
gpgcheck=0
enabled=1
[centos]
name=centos
baseurl=file:///opt/centos
gpgcheck=0
enabled=1
[iaas]
name=iaas
baseurl=file:///opt/iaas/iaas-repo
gpgcheck=0
enabled=1
[root@ansible ~]# vi /etc/sysconfig/selinux
...
SELINUX=disabled
...
[root@ansible ~]# setenforce 0
[root@ansible ~]# yum install -y vsftpd
[root@ansible ~]# echo "anon_root=/opt" >> /etc/vsftpd/vsftpd.conf
[root@ansible ~]# systemctl restart vsftpd
[root@ansible ~]# systemctl enable vsftpd
Created symlink from /etc/systemd/system/multi-user.target.wants/vsftpd.service to /usr/lib/systemd/system/vsftpd.service.
[root@ansible ~]# yum install -y ansible
(3)配置无密钥登录
配置Ansible节点无密钥登录Controller和Compute节点,配置完无密钥登录后,使用Ansible节点SSH连接测试(若云主机已是无密钥访问,则不用配置无密钥)
[root@ansible ~]# ssh-keygen
[root@ansible ~]# ssh-copy-id 192.168.100.20
[root@ansible ~]# ssh-copy-id 192.168.100.10
[root@ansible ~]# ssh 192.168.100.10
Last login: Sun Feb 12 18:13:46 2023 from gateway
[root@controller ~]# exit
登出
Connection to 192.168.100.10 closed.
[root@ansible ~]#
2.目录结构
(1)项目目录
首先在/opt目录下创建一个项目目录Openstack_ansible
[root@ansible ~]# mkdir /opt/openstack_ansible
[root@ansible ~]# ls /opt/
ansible centos iaas openstack_ansible
(2)创建角色
在创建roles角色目录之前,考虑将Openstack云平台的安装步骤拆为多个roles执行,这样的话,Playbook易于编写和读懂
安装私有云平台,使用init(基础环境)、mysql(数据库)、keystone(认证服务)、glance(镜像服务)、placement,nova-controller(计算服务)、nova-compute(计算服务)、neutron-controller(网络服务)、neutron-compute(网络服务)、dashboard(界面服务)、cinder-controller(块存储服务)、cinder-compute(块存储服务)、swift-controller(对象存储服务)、swift-compute(对象存储服务)这些roles来完成。
创建roles相应的项目目录
[root@ansible openstack_ansible]# mkdir -p roles/{init,mysql,keystone,glance,nova-controller,nova-compute,neutron-controller,neutron-compute,dashboard,cinder-controller,cinder-compute,swift-controller,swift-compute}/{tasks,files,templates,meta,handlers,vars}
在每个角色目录下面都有一样的目录,这些目录中task目录一般是一定会用到的,其他的目录看情况来使用
(3)创建group_vars目录
在项目目录/opt/openstack_ansible下创建group_vars目录,并在该目录下创建all文件,该目录用来存放变量
[root@ansible openstack_ansible]# mkdir group_vars
[root@ansible openstack_ansible]# ls
group_vars roles
[root@ansible openstack_ansible]# vi group_vars/all
controller_ip: 192.168.100.10
compute_ip: 192.168.100.20
controller_name: controller
compute_name: compute
PASSWD: Abc@1234
cinder_disk: sdb1
swift_disk: sdb2
manila_disk: sdb3
network_segment_ip: 192.168.100.0/24
external_name: ens34
physical_name: provider
storage_local_net_ip: 192.168.100.20
(4)init角色
该角色的任务是用来部署Controller和compute的基础环境,包括配置yum源,安装openstack-iaas脚本,安装iaas-pre-host脚本
在该init角色剧本中,创建local.repo文件到 init/files目录下,创建openrc.sh.j2 文件至init/templates 目录下。
[root@ansible openstack_ansible]# vi roles/init/files/local.repo
[centos]
name=centos
baseurl=ftp://192.168.100.30/centos
gpgcheck=0
enabled=1
[iaas]
name=iaas
baseurl=ftp://192.168.100.30/iaas/iaas-repo
gpgcheck=0
enabled=1
[root@ansible openstack_ansible]# cp -r /etc/openstack/openrc.sh /opt/openstack_ansible/roles/init/templates/openrc.sh.j2
[root@ansible openstack_ansible]# vi roles/init/templates/openrc.sh.j2
HOST_IP={{controller_ip}}
HOST_PASS={{PASSWD}}
HOST_NAME={{controller_name}}
HOST_IP_NODE={{compute_ip}}
HOST_PASS_NODE={{PASSWD}}
HOST_NAME_NODE={{compute_name}}
network_segment_IP={{network_segment_ip}}
RABBIT_USER=openstack
RABBIT_PASS={{PASSWD}}
DB_PASS={{PASSWD}}
DOMAIN_NAME=demo
ADMIN_PASS={{PASSWD}}
DEMO_PASS={{PASSWD}}
KEYSTONE_DBPASS={{PASSWD}}
GLANCE_DBPASS={{PASSWD}}
GLANCE_PASS={{PASSWD}}
PLACEMENT_DBPASS={{PASSWD}}
PLACEMENT_PASS={{PASSWD}}
NOVA_DBPASS={{PASSWD}}
NOVA_PASS={{PASSWD}}
NEUTRON_DBPASS={{PASSWD}}
NEUTRON_PASS={{PASSWD}}
METADATA_SECRET={{PASSWD}}
INTERFACE_NAME={{external_name}}
Physical_NAME={{physical_name}}
minvlan=2
maxvlan=1000
CINDER_DBPASS={{PASSWD}}
CINDER_PASS={{PASSWD}}
BLOCK_DISK={{cinder_disk}}
SWIFT_PASS={{PASSWD}}
OBJECT_DISK={{swift_disk}}
STORAGE_LOCAL_NET_IP={{storage_local_net_ip}}
TROVE_DBPASS={{PASSWD}}
TROVE_PASS={{PASSWD}}
HEAT_DBPASS={{PASSWD}}
HEAT_PASS={{PASSWD}}
CEILOMETER_DBPASS={{PASSWD}}
CEILOMETER_PASS={{PASSWD}}
AODH_DBPASS={{PASSWD}}
AODH_PASS={{PASSWD}}
ZUN_DBPASS={{PASSWD}}
ZUN_PASS={{PASSWD}}
KURYR_PASS={{PASSWD}}
OCTAVIA_DBPASS={{PASSWD}}
OCTAVIA_PASS={{PASSWD}}
MANILA_DBPASS={{PASSWD}}
MANILA_PASS={{PASSWD}}
SHARE_DISK={{manila_disk}}
CLOUDKITTY_DBPASS={{PASSWD}}
CLOUDKITTY_PASS={{PASSWD}}
BARBICAN_DBPASS={{PASSWD}}
BARBICAN_PASS={{PASSWD}}
# 这里进行了预处理
在roles/init/tasks目录下创建main.yaml文件
[root@ansible openstack_ansible]# vi roles/init/tasks/main.yaml
- name: move repo
shell: mv /etc/yum.repos.d/* /media
- name: create local.repo
copy: src=local.repo dest=/etc/yum.repos.d/
- name: install openstack-iaas
yum: name=openstack-iaas state=present
- name: openrc.sh
template: src=openrc.sh.j2 dest=/etc/openstack/openrc.sh
- name: install pre-host
shell: iaas-pre-host.sh
该脚本使用了copy和template模块,copy模块使用的文件及软件包及镜像包,放入tasks同级目录下的files目录下,template模块使用的jinja2文件,放入tasks同级目录templates目录下。
(5)其他角色
其他角色的作用是执行安装Openstack
[root@ansible openstack_ansible]# vi roles/mysql/tasks/main.yaml
- name: install mysql
shell: iaas-install-mysql.sh
[root@ansible openstack_ansible]# vi roles/keystone/tasks/main.yaml
- name: install mysql
shell: iaas-install-keystone.sh
...
...
# 把所有对应服务的角色都写上相应的安装脚本
# (注意nova-controller脚本里面写placement和nova-controller两个安装命令),如下
# iaas-install-placement.sh && iaas-install-nova-controller.sh
(6)编写剧本入口文件
install_openstack.yaml文件为执行剧本的入口文件,需要将调用roles的顺序及哪些主机调用哪些roles在这个文件夹中体现出来,install_openstack.yaml文件具体内容如下
[root@ansible openstack_ansible]# vi install_openstack.yaml
---
- hosts: controller
remote_user: root
roles:
- init
- mysql
- keystone
- glance
- nova-controller
- neutron-controller
- dashboard
- cinder-controller
- swift-controller
- hosts: compute
remote_user: root
roles:
- init
- nova-compute
- neutron-compute
- cinder-compute
- swift-compute
3.执行PlayBook
在执行之前需要修改一些文件
(1)修改host文件
[root@ansible openstack_ansible]# vi /etc/ansible/hosts
# 在文件里添加下面的内容
[controller]
192.168.100.10
[compute]
192.168.100.20
[root@ansible openstack_ansible]# vi /etc/hosts
192.168.100.10 controller
192.168.100.20 compute
(3)执行剧本
准备工作做完之后,使用ansible-playbook命令执行剧本
使用–syntax-check参数检测脚本的语法
[root@ansible openstack_ansible]# ansible-playbook install_openstack.yaml --syntax-check
playbook: install_openstack.yaml
直接返回文件名,表示脚本没有语法错误。执行剧本
[root@ansible openstack_ansible]# ansible-playbook install_openstack.yaml
PLAY [controller] **********************************************************************************************************************************************************
ok: [192.168.100.10]
.....
....
在等待一段时间之后,剧本执行完毕,若没有报错,访问Openstack界面