【星海出品】ansible入门(四)playbook kolla开源例子

简介
Kolla-ansible项目提供一个完整的Ansible Playbook,来部署Docker的镜像,再完成openstack组件的自动化部署。并提供all-in-one和multihost的环境。

安装后会将kolla-ansible内置为一个shell启动文件。
kolla-ansible: /usr/local/bin/kolla-ansible

shell中会配置一些基础信息
shell中的信息

INVENTORY="${BASEDIR}/ansible/inventory/all-in-one"  # INVENTORY默认值
PLAYBOOK="${BASEDIR}/ansible/site.yml"  # 若不指定PLAYBOOK变量,则默认值/usr/local/share/kolla-ansible/ansible/site.yml

会根据ansible后面传的第一个参数是什么,而设置一些全局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   
  • 源码地址:https://github.com/openstack/kolla-ansible.git
  • 其他下载点:https://github.com/openstack/kolla.git

目录结构

kolla-ansible
├── ansible # Ansible的playbook和roles在这个目录下面
├── doc # 一些文档说明书
├── etc_examples # Openstack部署需要的一些配置模板文件
├── init-runonce # 初始化配置脚本
├── init- # 配置VPNaas的脚本
├── setup.cfg # 安装配置入口文件
└── tools # 和kolla交互的脚本工具

setup.cfg

[metadata]
name = kolla-ansible  // 项目名称
summary = Ansible Deployment of Kolla containers
description-file = README.rst
author = OpenStack
author-email = [email protected]
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-
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
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

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
[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
 playbook通过参数-e传入变量,作为全局变量在整个playbook中被调用

总结

# 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 当前定义的变量,再次之就是主机清单里定义的变量。

cat /usr/local/share/kolla-ansible/ansible/kolla-host.yml
---
- 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他们的一种机制。
【星海出品】ansible入门(四)playbook kolla开源例子_第1张图片
【星海出品】ansible入门(四)playbook kolla开源例子_第2张图片

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:

---
- include_tasks: "{{ kolla_action }}.yml"

即调用执行bootstrap-servers.yml

---
- 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任务清单。

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也没有??】;

你可能感兴趣的:(ansible,开源)