• 【星海出品】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
    
    • 1
    • 2

    会根据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   
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 源码地址: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-vpn # 配置VPNaas的脚本
    ├── setup.cfg # 安装配置入口文件
    └── tools # 和kolla交互的脚本工具
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    setup.cfg

    [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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    [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
    
    • 1
    • 2
     playbook通过参数-e传入变量,作为全局变量在整个playbook中被调用
    
    • 1

    总结

    # 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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    优先级最高的是 -e,次之是 playbook 当前定义的变量,再次之就是主机清单里定义的变量。

    cat /usr/local/share/kolla-ansible/ansible/kolla-host.yml
    
    • 1
    ---
    - import_playbook: gather-facts.yml
    - name: Apply role baremetal
      hosts: baremetal
      serial: '{{ kolla_serial|default("0") }}'
      gather_facts: false
      roles:
        - { role: baremetal,
            tags: baremetal }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9

    一 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:

    ---
    - include_tasks: "{{ kolla_action }}.yml"
    
    • 1
    • 2

    即调用执行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']```
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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也没有??】;
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
  • 相关阅读:
    因无报酬,开发者破坏 GitHub 知名开源库;AngularJS 结束生命周期;Linux 5.16 发布 | 开源日报
    Python实战 | 使用 Python 的日志库(logging)和 pandas 库对日志数据进行分析
    前端设计模式和设计原则之设计原则
    语雀P0级故障复盘,有9个字亮了
    SpringBoot启动方式
    动手学强化学习(一)
    Java学习路线图
    [附源码]java毕业设计线上图书销售管理系统
    【.Net实用方法总结】 整理并总结System.IO中Stream类及其方法介绍
    04_学习springdoc与oauth结合_简述
  • 原文地址:https://blog.csdn.net/weixin_41997073/article/details/133616179