简介
Kolla-ansible项目提供一个完整的Ansible Playbook,来部署Docker的镜像,再完成openstack组件的自动化部署。并提供all-in-one和multihost的环境。
安装后会将kolla-ansible内置为一个shell启动文件。
kolla-ansible: /usr/local/bin/kolla-ansible
shell中会配置一些基础信息
shell中的信息
bash
INVENTORY="${BASEDIR}/ansible/inventory/all-in-one" # INVENTORY默认值
PLAYBOOK="${BASEDIR}/ansible/site.yml" # 若不指定PLAYBOOK变量,则默认值/usr/local/share/kolla-ansible/ansible/site.yml
会根据ansible后面传的第一个参数是什么,而设置一些全局shell默认的变量
shell
case "$1" in
(prechecks)
ACTION="Pre-deployment checking"
EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=precheck"
;;
(mariadb_recovery)
ACTION="Attempting to restart mariadb cluster"
EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=deploy"
PLAYBOOK="${BASEDIR}/ansible/mariadb_recovery.yml"
;;
(bootstrap-servers)
ACTION="Bootstrapping servers"
PLAYBOOK="${BASEDIR}/ansible/kolla-host.yml"
EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=bootstrap-servers"
;;
(deploy)
ACTION="Deploying Playbooks"
EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=deploy"
(......)
esac
目录结构
yaml
kolla-ansible
├── ansible # Ansible的playbook和roles在这个目录下面
├── doc # 一些文档说明书
├── etc_examples # Openstack部署需要的一些配置模板文件
├── init-runonce # 初始化配置脚本
├── init-vpn # 配置VPNaas的脚本
├── setup.cfg # 安装配置入口文件
└── tools # 和kolla交互的脚本工具
setup.cfg
bash
[metadata]
name = kolla-ansible // 项目名称
summary = Ansible Deployment of Kolla containers
description-file = README.rst
author = OpenStack
author-email = openstack-dev@lists.openstack.org
home-page = http://docs.openstack.org/developer/kolla-ansible/
license = Apache License, Version 2.0
classifier =
Environment :: OpenStack
Intended Audience :: Information Technology
Intended Audience :: System Administrators
License :: OSI Approved :: Apache Software License
Operating System :: POSIX :: Linux
Programming Language :: Python
Programming Language :: Python :: 2
Programming Language :: Python :: 2.7
Programming Language :: Python :: 3
Programming Language :: Python :: 3.5
[files]
packages = kolla_ansible //包名
data_files = //pbr方式打包对应的文件映射
share/kolla-ansible/ansible = ansible/*
share/kolla-ansible/tools = tools/validate-docker-execute.sh
share/kolla-ansible/tools = tools/cleanup-containers
share/kolla-ansible/tools = tools/cleanup-host
share/kolla-ansible/tools = tools/cleanup-images
share/kolla-ansible/tools = tools/stop-containers
share/kolla-ansible/doc = doc/*
share/kolla-ansible/etc_examples = etc/*
share/kolla-ansible = tools/init-runonce
share/kolla-ansible = tools/init-vpn
share/kolla-ansible = tools/openrc-example
share/kolla-ansible = setup.cfg
scripts = //可执行脚本
tools/kolla-ansible
[entry_points]
console_scripts = //控制台可执行脚本,执行两个Python文件的main函数
kolla-genpwd = kolla_ansible.cmd.genpwd:main
kolla-mergepwd = kolla_ansible.cmd.mergepwd:main
[global]
setup-hooks =
pbr.hooks.setup_hook
[pbr] //打包方式
[build_sphinx]
all_files = 1
build-dir = doc/build
source-dir = doc
[build_releasenotes]
all_files = 1
build-dir = releasenotes/build
source-dir = releasenotes/source
yaml
ansible
├── action_plugins # 自定义插件,用户yml和config的配置合并
├── filter_plugins # 自定义过滤器插件,用来处理变量数据
├── group_vars # 存放ansible的全局变量,比如:配置文件路径、网卡、IP、端口、服务的开启等。
├── inventory # 主机清单 分为单节点、多节点
├── library # 自定义的ansible模块
bslurp.py:# 作用是从其他节点拷贝文件然后再复制给其他节点
kolla_docker.py:# 作用是控制管理docker,通过连接docker API去对容器进行创建、删除等一些操作
kolla_toolbox.py:# 负责容器的启动以及初始化的操作
kolla_container_facts.py:# 用于检查容器是否正在运行
├── mariadb_backup.yml
├── mariadb_recovery.yml
├── nova.yml
├── post-deploy.yml
├── roles # 目录下有不同组件业务的playbook、定义的变量以及模板文件等
├── site.yml
└── vmha.yml
neutron目录下有5个文件夹:
default: 定义了部署neutron各服务的各类参数
handlers: 定义了启动neutron各服务容器的操作
meta: 定义了部署neutron的依赖
tasks: 部署neutron的各playbook
templates: neutron各服务配置文件的模板
kolla-ansible -i /etc/kolla/all-in-one bootstrap-servers
kolla-ansible -i /etc/kolla/all-in-one deploy
shell
CMD结构:
CMD="ansible-playbook -i $INVENTORY $CONFIG_OPTS $EXTRA_OPTS $PLAYBOOK $VERBOSITY"
参数解释:
INVENTORY参数,即INVENTORY文件,用于ansible配置主机组信息;(Ansible可同时操作属于一个组的多台主机,组和主机之间的关系通过 inventory 文件配置. 默认的文件路径为/etc/ansible/hosts)
CONFIG_OPTS,用于指定globals.yml,passwords.yml,配置文件目录,主要是指定一些配置相关;
EXTRA_OPTS主要是指定执行的动作,例如"-e kolla_action=deploy";
PLAYBOOK为roles的入口文件site.yml.(Playbooks是Ansible的配置、部署、编排语言.可以被描述为一个需要远程主机执行命令的方案,或者一组IT程序运行的命令集合。)
Deploy动作的调用过程为:kolla-ansible -i multinode deploy ---->
调用/usr/local/share/kolla-ansible/ansible/site.yml ---->
根据site.yml文件的task调用执行各role
shell
[root@ksfusion1 ]# kolla-ansible -i ./multinode bootstrap-servers
Bootstrapping servers : ansible-playbook -i ./multinode -e @/etc/kolla/globals.yml -e @/etc/kolla/passwords.yml -e CONFIG_DIR=/etc/kolla -e kolla_action=bootstrap-servers /usr/local/share/kolla-ansible/ansible/kolla-host.yml
bash
playbook通过参数-e传入变量,作为全局变量在整个playbook中被调用
总结
bash
# kolla-ansible -i ./multinode bootstrap-servers
在kolla-ansible脚本中的相关处理:
(bootstrap-servers)
ACTION="Bootstrapping servers"
PLAYBOOK="${BASEDIR}/ansible/kolla-host.yml" # 此处即/usr/local/share/kolla-ansible/ansible/kolla-host.yml
EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=bootstrap-servers"
;;
具体调用:
# ansible-playbook -i ./multinode -e @/etc/kolla/globals.yml -e @/etc/kolla/passwords.yml -e CONFIG_DIR=/etc/kolla -e kolla_action=bootstrap-servers /usr/local/share/kolla-ansible/ansible/kolla-host.yml
优先级最高的是 -e,次之是 playbook 当前定义的变量,再次之就是主机清单里定义的变量。
bash
cat /usr/local/share/kolla-ansible/ansible/kolla-host.yml
bash
---
- import_playbook: gather-facts.yml
- name: Apply role baremetal
hosts: baremetal
serial: '{{ kolla_serial|default("0") }}'
gather_facts: false
roles:
- { role: baremetal,
tags: baremetal }
一 serial:强制当前task串行执行。使用该装饰器后,即使用户通过参数--parallel指定需要并行执行,当执行呗serial装饰器修改过的task时,依然会串行执行。这样就达到了部分task可以串行执行
二 gather_facts:获取远程主机facts基础信息
三 Playbook剧本每次执行facts采集变量,这会耗费资源和时间。主机少的时候影响不大,当主机多的会严重耗费性能。所以不需要的时候可以关闭。
四 import_playbook主playbook可以导入子playbook,./kolla-ansible/ansible/gather-facts.yml用于获取远程主机信息
五 ansible过滤器default #如果变量没有定义,则临时返回一个指定的默认值 #注:如果定义了变量,变量值为空字符串,则会输出空字符
六 hosts值为baremetal,在all-in-one节点,baremetal指向control组;在multinode节点,baremetal指向control、network、compute等所有物理节点
七 roles能够根据层次型结构自动装载变量文件、tasks以及handlers等。roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中、并可以便捷地include他们的一种机制。
all-in-one node:
[baremetal:children]
control
multinode node:
[baremetal:children]
control
network
compute
storage
monitoring
八)role和tags都为baremetal,接下来进入roles的baremetal目录中执行
九)roles/baremetal/defaults/main.yml文件中,定义了default变量。
十)roles/baremetal/tasks/main.yml文件,为入口文件
内容如下,使用include_tasks分散调用tasks:
yaml
---
- include_tasks: "{{ kolla_action }}.yml"
即调用执行bootstrap-servers.yml
yaml
---
- include_tasks: pre-install.yml
- include_tasks: install.yml
- include_tasks: post-install.yml
- include_tasks: configure-containerd-for-zun.yml
when: containerd_configure_for_zun|bool and
inventory_hostname in groups['zun-cni-daemon']```
pre-install.yml、install.yml、post-install.yml等文件中,直接展示的是task的内容。
因此,执行 kolla-ansible -i ./multinode bootstrap-servers,实际执行的是pre-install.yml、install.yml、post-install.yml等文件的tasks任务清单。
bash
pre-install.yml文件task内容分析
共有6个task和一个block
task1:Ensure localhost in /etc/hosts
task2:Ensure hostname does not point to 127.0.1.1 in /etc/hosts
task3:把所有节点信息写入/etc/hosts
task4:检查cloud-init是否已安装,确保manage_etc_hosts配置disabled。
task5:确保sudo组状态为present
task6:确保kolla组状态为present
block(当前只分析RedHat,包含四个task):
(1)确保/etc/yum.repos.d/目录存在
(2)启动docker的yum仓库yum_repository
(3)确保/etc/yum.repos.d/docker.repo中module_hotfixes = True
(4)安装docker rpm gpg key
7)install.yml文件task内容分析
共有12个task和一个bolck,主要功能如下:
更新Debian apt缓存;关闭Debian防火墙;检查RedHat下firewalld是否安装;关闭RedHat下firewalld;检查是否有docker运行;
安装apt/RPM包(从roles/baremetal/defaults/main.yml的对应变量中读取安装包列表,例如redhat_pkg_install);
启动docker,并等待Docker启动成功;
当环境是virtualenv,在对应virtualenv中安装最新的pip;
为python安装docker SDK;
删除配置文件列表中指定的待删除包(roles/baremetal/defaults/main.yml中的ubuntu_pkg_removals和redhat_pkg_removals);
8)post-install.yml文件task内容分析
共有35个task,主要功能如下:
创建kolla用户、添加kolla用户的公钥、授权kolla用户无密码sudo权限;
确保virtualenv权限正确;确保node_config_directory对应目录存在
且给kolla用户使用【node_config_directory参数再main.yml没有,global.yml也没有??】;