【星海出品】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中的信息

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也没有??】;
相关推荐
天蓝蓝235285 小时前
PyTorch开源的深度学习框架
pytorch·深度学习·开源
customer085 小时前
【开源免费】基于SpringBoot+Vue.JS网上购物商城(JAVA毕业设计)
java·vue.js·spring boot·后端·开源
老肖相当外语大佬5 小时前
反DDD模式之“复用”
开源·实战·ddd·领域驱动设计
工业甲酰苯胺6 小时前
分享3款开源、免费的Avalonia UI控件库
ui·开源
布瑞泽的童话6 小时前
无需切换平台?TuneFree如何搜罗所有你爱的音乐
前端·vue.js·后端·开源
小强在此11 小时前
基于开源鸿蒙(OpenHarmony)的【智能家居综合应用】系统
华为·开源·智能家居·团队开发·harmonyos
Rense120 小时前
开源RK3588 AI Module7,并与Jetson Nano生态兼容的低功耗AI模块
人工智能·开源
程序员皮皮林1 天前
开源PDF工具 Apache PDFBox 认识及使用(知识点+案例)
java·pdf·开源·apache
MinIO官方账号1 天前
从 HDFS 迁移到 MinIO 企业对象存储
人工智能·分布式·postgresql·架构·开源
giszz1 天前
【开源大模型生态9】百度的文心大模型
人工智能·开源