ansible安装xiandian-openstack
1.规划节点
Ansible服务的节点规划,见表1-2。
表1-2规划节点
IP |
主机名 |
节点 |
172.128.11.33 |
ansible |
Ansible节点 |
172.128.11.39 |
controller |
控制节点 |
172.128.11.21 |
compute |
计算节点 |
2.基础准备
使用OpenStack平台创建三台云主机进行实验,云主机镜像使用提供的CentOS_7.9.qcow2镜像,Ansible节点flavor使用2核/4G内存/40G硬盘;controller节点flavor使用4核/12G内存/100G硬盘;compute接点flavor使用4核/8G内存/100G硬盘+50G临时磁盘。节点规划表中的IP地址为作者的IP地址,在进行实操案例的时候,按照自己的环境规划网络与IP地址(虚拟机需要使用两块网卡)。Ansible节点安装好Ansible服务。然后做好Ansible节点对controller和compute节点的无秘钥访问操作。
案例实施
1.环境准备
该实战案例为使用Ansible工具部署一个单控制单计算的OpenStack平台。
(1)配置IP并连接
连接三台云主机,并修改主机名分别为ansible、controller、compute。
(2)Ansible节点安装Ansible服务
在Ansible节点使用提供的ansible.tar.gz软件包,配置本地镜像源,安装ansible服务。把Ansible节点的防火墙和SELinux关闭。
(3)配置无秘钥登录
配置Ansible节点无秘钥登录controller和compute节点。配置完无秘钥登录后,使用Ansible节点ssh连接测试。(若云主机已是无秘钥访问的,则不用配置无秘钥)
2.目录结构
(1)项目目录
首先在/opt目录下创建一个项目目录openstack_ansible,命令如下:
[root@ansible ~]# mkdir /opt/openstack_ansible
(2)创建角色
在创建roles角色目录之前,考虑将OpenStack云平台的安装步骤拆分为多个roles执行,这样的话,Playbook易于编写和读懂。
安装私有云平台,使用init(基础环境)、mariadb(数据库)、keystone(认证服务)、glance(镜像服务)、placement、nova-controller(计算服务)、nova-compute(计算服务)、neutron-controller(网络服务)、neutron-compute(网络服务)、dashboard(界面服务)、cinder-controller(块存储服务)、cinder-compute(块存储服务)、swift-controller(对象存储服务)、swift-compute(对象存储服务)、heat(编排服务)这些roles来完成。下面创建这些roles和相应的项目目录,具体命令如下:
[root@ansible ~]# mkdir -p /opt/openstack_ansible/roles/{init,mariadb,keystone,glance,nova-controller,nova-compute,neutron-controller,neutron-compute,dashboard,cinder-controller,cinder-compute,swift-controller,swift-compute,heat}/{tasks,files,templates,meta,handlers,vars}
在每个角色目录下面都有一样的目录,这些目录中的task目录一般是一定会用到的,其他的目录视情况而定来使用。
(3)创建group_vars目录
在项目目录/opt/openstack_ansible下创建group_vars目录,并在该目录下创建all文件,该目录用来存放变量声明文件all。命令如下:
[root@ansible ~]# cd /opt/openstack_ansible/
[root@ansible openstack_ansible]# mkdir group_vars
[root@ansible openstack_ansible]# cd group_vars/
[root@ansible group_vars]# touch all
(4)创建安装入口文件
进入/opt/openstack_ansible目录,创建“install_openstack.yaml”文件,该文件是安装动作的入口文件。命令如下:
[root@ansible openstack_ansible]# touch install_openstack.yaml
[root@ansible openstack_ansible]# ll
total 0
drwxr-xr-x. 2 root root 17 Aug 26 21:31 group_vars
-rw-r--r--. 1 root root 0 Aug 26 21:33 install_openstack.yaml
drwxr-xr-x. 10 root root 114 Aug 26 21:18 roles
到目前为止,ansible的目录结构与文件创建完毕。接下来对每一个role角色进行剧本的编写。
3.编写Playbook剧本
在编写playbook前,ansible节点需要做一些基础准备工作,将CentOS-7-x86_64-DVD-2009.iso和chinaskills_cloud_iaas_v2.0.iso这两个ISO文件上传至ansible节点,分别挂载到/opt目录下的centos和iaas目了,并配置/opt目录为为ftp源,后面可供controller节点和compute节点使用。配置完成后,如下所示:
(1)init角色
该角色执行的任务是用来部署controller节点和compute的基础环境,包括配置yum源,安装iaas-xiandian脚本,安装iaas-pre-host脚本。在roles/init/tasks目录下,创建main.yaml文件,文件的内容如下:
- name: move repos
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目录下。
在该init角色剧本中,把local.repo文件拷贝至init/files目录下,把openrc.sh.j2文件拷贝至init/templates目录下。下面贴出local.repo和host.j2的文件内容:
local.repo内容:
[centos]
name=centos
baseurl=ftp://172.128.11.33/centos
gpgcheck=0
enabled=1
[iaas]
name=iaas
baseurl=ftp://172.128.11.33/iaas/iaas-repo
gpgcheck=0
enabled=1
openrc.sh.j2内容如下:
#--------------------system Config--------------------##
#Controller Server Manager IP. example:x.x.x.x
HOST_IP={{controller_ip}}
#Controller HOST Password. example:000000
HOST_PASS={{PASSWD}}
#Controller Server hostname. example:controller
HOST_NAME={{controller_name}}
#Compute Node Manager IP. example:x.x.x.x
HOST_IP_NODE={{compute_ip}}
#Compute HOST Password. example:000000
HOST_PASS_NODE={{PASSWD}}
#Compute Node hostname. example:compute
HOST_NAME_NODE={{compute_name}}
#--------------------Chrony Config-------------------##
#Controller network segment IP. example:x.x.0.0/16(x.x.x.0/24)
network_segment_IP={{network_segment_IP}}/24
#--------------------Rabbit Config ------------------##
#user for rabbit. example:openstack
RABBIT_USER=openstack
#Password for rabbit user .example:000000
RABBIT_PASS={{PASSWD}}
#--------------------MySQL Config---------------------##
#Password for MySQL root user . exmaple:000000
DB_PASS={{PASSWD}}
#--------------------Keystone Config------------------##
#Password for Keystore admin user. exmaple:000000
DOMAIN_NAME=demo
ADMIN_PASS={{PASSWD}}
DEMO_PASS={{PASSWD}}
#Password for Mysql keystore user. exmaple:000000
KEYSTONE_DBPASS={{PASSWD}}
#--------------------Glance Config--------------------##
#Password for Mysql glance user. exmaple:000000
GLANCE_DBPASS={{PASSWD}}
#Password for Keystore glance user. exmaple:000000
GLANCE_PASS={{PASSWD}}
#--------------------Placement Config----------------------##
#Password for Mysql placement user. exmaple:000000
PLACEMENT_DBPASS={{PASSWD}}
#Password for Keystore placement user. exmaple:000000
PLACEMENT_PASS={{PASSWD}}
#--------------------Nova Config----------------------##
#Password for Mysql nova user. exmaple:000000
NOVA_DBPASS={{PASSWD}}
#Password for Keystore nova user. exmaple:000000
NOVA_PASS={{PASSWD}}
#--------------------Neutron Config-------------------##
#Password for Mysql neutron user. exmaple:000000
NEUTRON_DBPASS={{PASSWD}}
#Password for Keystore neutron user. exmaple:000000
NEUTRON_PASS={{PASSWD}}
#metadata secret for neutron. exmaple:000000
METADATA_SECRET={{PASSWD}}
#External Network Interface. example:eth1
INTERFACE_NAME={{External_Network}}
#External Network The Physical Adapter. example:provider
Physical_NAME={{Physical_NAME}}
#First Vlan ID in VLAN RANGE for VLAN Network. exmaple:101
minvlan=1
#Last Vlan ID in VLAN RANGE for VLAN Network. example:200
maxvlan=1000
#--------------------Cinder Config--------------------##
#Password for Mysql cinder user. exmaple:000000
CINDER_DBPASS={{PASSWD}}
#Password for Keystore cinder user. exmaple:000000
CINDER_PASS={{PASSWD}}
#Cinder Block Disk. example:md126p3
BLOCK_DISK={{cinder_disk}}
#--------------------Swift Config---------------------##
#Password for Keystore swift user. exmaple:000000
SWIFT_PASS={{PASSWD}}
#The NODE Object Disk for Swift. example:md126p4.
OBJECT_DISK={{swift_disk}}
#The NODE IP for Swift Storage Network. example:x.x.x.x.
STORAGE_LOCAL_NET_IP={{STORAGE_LOCAL_NET_IP}}
#--------------------Trove Config----------------------##
#Password for Mysql trove user. exmaple:000000
TROVE_DBPASS={{PASSWD}}
#Password for Keystore trove user. exmaple:000000
TROVE_PASS={{PASSWD}}
#--------------------Heat Config----------------------##
#Password for Mysql heat user. exmaple:000000
HEAT_DBPASS={{PASSWD}}
#Password for Keystore heat user. exmaple:000000
HEAT_PASS={{PASSWD}}
#--------------------Ceilometer Config----------------##
#Password for Gnocchi ceilometer user. exmaple:000000
CEILOMETER_DBPASS={{PASSWD}}
#Password for Keystore ceilometer user. exmaple:000000
CEILOMETER_PASS={{PASSWD}}
#--------------------AODH Config----------------##
#Password for Mysql AODH user. exmaple:000000
AODH_DBPASS={{PASSWD}}
#Password for Keystore AODH user. exmaple:000000
AODH_PASS={{PASSWD}}
#--------------------ZUN Config----------------##
#Password for Mysql ZUN user. exmaple:000000
ZUN_DBPASS={{PASSWD}}
#Password for Keystore ZUN user. exmaple:000000
ZUN_PASS={{PASSWD}}
#Password for Keystore KURYR user. exmaple:000000
KURYR_PASS={{PASSWD}}
#--------------------OCTAVIA Config----------------##
#Password for Mysql OCTAVIA user. exmaple:000000
OCTAVIA_DBPASS={{PASSWD}}
#Password for Keystore OCTAVIA user. exmaple:000000
OCTAVIA_PASS={{PASSWD}}
#--------------------Manila Config----------------##
#Password for Mysql Manila user. exmaple:000000
MANILA_DBPASS={{PASSWD}}
#Password for Keystore Manila user. exmaple:000000
MANILA_PASS={{PASSWD}}
#The NODE Object Disk for Manila. example:md126p5.
SHARE_DISK={{manila_disk}}
#--------------------Cloudkitty Config----------------##
#Password for Mysql Cloudkitty user. exmaple:000000
CLOUDKITTY_DBPASS={{PASSWD}}
#Password for Keystore Cloudkitty user. exmaple:000000
CLOUDKITTY_PASS={{PASSWD}}
#--------------------Barbican Config----------------##
#Password for Mysql Barbican user. exmaple:000000
BARBICAN_DBPASS={{PASSWD}}
#Password for Keystore Barbican user. exmaple:000000
BARBICAN_PASS={{PASSWD}}
############################################################
####在vi编辑器中执行:%s/^.\{1\}// 删除每行前1个字符(#号)#####
############################################################
因为设置的变量,所以需要在/opt/openstack_ansible/group_vars/all中声明变量,all文件内容如下:
[root@ansible openstack_ansible]# cat group_vars/all
controller_ip: 172.128.11.39
controller_name: controller
compute_ip: 172.128.11.21
compute_name: compute
PASSWD: '000000'
cinder_disk: vdb1
swift_disk: vdb2
manila_disk: vdb3
network_segment_IP: 172.128.11.0
External_Network: eth1
Physical_NAME: provider
STORAGE_LOCAL_NET_IP: 172.128.11.21
至此,init角色剧本编写完成。
(2)其他角色
其他角色的作用是执行安装openstack的脚本,可以自行参考提供的openstack_ansible_train.tar.gz案例包。
4.执行Playbook
在执行剧本之前,还有一些工作需要完成,具体任务如下:
(1)修改hosts文件
此处需要修改的hosts文件并不只是/etc/hosts,还有一个/etc/ansible/hosts文件,编辑/etc/ansible/hosts,在文件的最后添加需要执行剧本的目标主机组,添加的内容如下:
## db-[99:101]-node.example.com
[controller]
172.128.11.39
[compute]
172.128.11.21
编辑/etc/hosts文件,添加ip与主机名的映射,如下所示:
172.128.11.39 controller
172.128.11.21 compute
(2)编辑剧本入口文件
install_openstack.yaml文件为执行剧本的入口文件,需要将调用roles的顺序及哪些主机调用哪些roles在这个文件中体现出来,install_openstack.yaml文件的具体内容如下:
---
- hosts: controller
remote_user: root
roles:
- init
- mariadb
- keystone
- glance
- nova-controller
- neutron-controller
- dashboard
- cinder-controller
- swift-controller
- heat
- hosts: compute
remote_user: root
roles:
- init
- nova-compute
- neutron-compute
- cinder-compute
- swift-compute
(3)执行剧本
当所有准备工作都完成之后,使用ansible-playbook命令执行剧本,首先使用--syntax-check参数检测脚本的语法,命令如下:
[root@ansible opestack_ansible]# ansible-playbook install_openstack.yaml --syntax-check
playbook: install_openstack.yaml
直接返回文件名,表示脚本没有语法错误。执行剧本,命令如下:
[root@ansible openstack_ansible]# ansible-playbook install_openstack.yaml
PLAY RECAP ****************************************************************************************************************************************
172.128.11.21 : ok=10 changed=9 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
172.128.11.39 : ok=16 changed=14 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
...
...
在等待一段时间之后,剧本执行完毕,若没有报错,访问controller节点的ip地址/dashboard,可以访问openstack界面。
完成