当前位置: 首页 > 编程日记 > 正文

ZStack--通过Ansible实现全自动化

2019独角兽企业重金招聘Python工程师标准>>> hot3.png

Agent是一种常见的IaaS软件管理设备的方式;例如,ZStack使用Python agents去管理KVM主机。因为海量的设备,安装和升级agents成为巨大的挑战,所以大多数IaaS软件把这个问题留给客户或分发商,从而导致解决方案变得脆弱,因为缺乏IaaS软件本身的支持。ZStack从一开始就在考虑这个问题,先后尝试了Puppet、Salt和Ansible,最后实现与Ansible无缝并对用户透明的集成。所有的ZStack agents通过Ansible自动部署、配置、升级;用户可能根本没有注意到他们的存在。

动机

IaaS软件通常是一个包含很多小程序的组合软件。理想情况下,IaaS软件可以被写成一个中央管理软件,可以通过设备的SDK和设备对话;但在现实中,设备要么没有提供SDK,要么提供的SDK不完整,迫使IaaS软件必须部署一个叫agent的小程序去控制它们。虽然ZStack把所有服务打包在一个单一的进程中(详见“进程内的Microservices架构”),部分agent依旧需要部署到不同的设备上以控制它们。部署agent的过程中,不仅需要安装agent和相关依赖的软件,还需要配置目标设备,这并不简单,而且通常需要用户做大量的手动工作。当IaaS软件管理着大量的设备的时候,这个问题变得非常显著,甚至会限制数据中心规模。

问题

部署、升级agent以及配置目标设备的问题都属于配置管理问题,Puppet、Chef、Salt和Ansible这类软件就是旨在解决这类问题。许多开发人员已经开始使用这些工具软件将IaaS软件包装成一个易于部署的方式;例如,为了安装OpenStack,你可能会试图找到一些puppet模块而不是依据它提供的文档手动完成每一步操作。这些第三方包装能在一定程度上缓解问题,但它们同时又是脆弱的,包装的软件发生任何变化都会破坏它们。另一方面,当用户想要配置软件包的某一部分的时候,他们可能不得不深入那些第三方包装去做一个即需的改变。最后,第三方包装无法处理封装的软件升级的状况,迫使用户重新面对他们试图隐藏的令人气馁的细节。

通过与配置管理软件Ansible无缝且透明的集成,ZStack解决了这个问题。使用的方式是对用户隐藏细节并承担了管理agent的责任,最终展示给用户一个可以简单下载和运行(或升级)的软件,完全满足在数据中心自动化完成一切的目标,并帮助管理员克服安装、配置和升级云的恐惧。

和Ansible集成

ZStack有一个典型的服务端-代理(server-agent)架构,服务器端包含所有驱动业务逻辑的编排服务,代理端执行来自于编排服务的命令,通过使用运行在不同的设备上的小的Python agents(如KVM agents、虚拟路由agents)

http://zstack.org/images/blogs/scalability/ansible1.png

服务和agentsZStack对服务和agents有明确的定义。服务负责在云中完成一部分业务,例如存储服务。服务通常在ZStack管理节点运行的进程中,有自己的API和配置,与其他服务协同完成云上的业务。agent是一个被服务命令的小附属程序,可以通过使用它来操作没有提供像样SDK的外部设备;例如,SFTP备份存储agent在一台使用SFTP协议的Linux机器上创建了一个的备份存储。服务和代理的设计原则是把所有复杂的业务逻辑放在服务中,使代理尽可能简单。我们希望这个解释可以给你一个在ZStack中我们把什么称之为服务和代理的概念,因为其他IaaS软件可能有不同的想法,我们看到一些IaaS软件已经在agent代码中处理业务逻辑了。

所有的ZStackagents包含三个文件:一个Python包(xxx.tar.gz)和init.d服务文件,和一个AnsibleYAML的配置,在$web_container_root/webapps/zstack/WEB-INF/classes/ansible文件夹下它们自己目录中,所以一个服务可以通过javaclasspath找到它的agent。Ansible YAML配置将所有的东西放在一起;它讲述了如何安装agent,agent的依赖,以及如何配置目标设备。引用KVM为例,其Ansible YAML配置中的一部分看起来像这样:

- name: install kvm related packages on RedHat based OS

  when: ansible_os_family == 'RedHat'

  yum: name=""

  with_items:

    - qemu-kvm

    - bridge-utils

    - wget

    - qemu-img

    - libvirt-python

    - libvirt

    - nfs-utils

    - vconfig

    - libvirt-client

    - net-tools

- name: install kvm related packages on Debian based OS

  when: ansible_os_family == 'Debian'

  apt: pkg=""

  with_items:

    - qemu-kvm

    - bridge-utils

    - wget

    - qemu-utils

    - python-libvirt

    - libvirt-bin

    - vlan

    - nfs-common

- name: disable firewalld in RHEL7 and CentOS7

  when: ansible_os_family == 'RedHat' and ansible_distribution_version >= '7'

  service: name=firewalld state=stopped enabled=no

- name: copy iptables initial rules in RedHat

  copy: src="/iptables" dest=/etc/sysconfig/iptables

  when: ansible_os_family == "RedHat" and is_init == 'true'

- name: restart iptables

  service: name=iptables state=restarted enabled=yes

  when: chroot_env == 'false' and ansible_os_family == 'RedHat' and is_init == 'true'

- name: remove libvirt default bridge

  shell: "(ifconfig virbr0 &> /dev/null && virsh net-destroy default > /dev/null && virsh net-undefine default > /dev/null) || true"

像上面展示的这样,这个YAML配置会关心对一个KVM主机的所有设置。你不需要担心ZStack会要求你手动安装很多依赖软件,并且不会收到任何由于缺乏依赖或者错误配置引起的奇怪的错误。让一切运行在你的Linux机器上是ZStack的责任,不管你的Linux操作系统是Ubuntu还是CentOS,即使你只部署了一个最小的安装,ZStack也知道如何让它们准备就绪。

在java代码中的服务可以在某个恰当的时机,使用AnsibleRunner去调用Ansible去部署或升级agents。KVM的AnsibleRunner看起来像:

AnsibleRunner runner = new AnsibleRunner();
runner.installChecker(checker);
runner.setAgentPort(KVMGlobalProperty.AGENT_PORT);
runner.setTargetIp(getSelf().getManagementIp());
runner.setPlayBookName(KVMConstant.ANSIBLE_PLAYBOOK_NAME);
runner.setUsername(getSelf().getUsername());
runner.setPassword(getSelf().getPassword());
if (info.isNewAdded()) {
    runner.putArgument("init", "true");
    runner.setFullDeploy(true);
}
runner.putArgument("pkg_kvmagent", agentPackageName);
runner.putArgument("hostname", String.format("%s.zstack.org",self.getManagementIp().replaceAll("\\.", "-")));
runner.run(new Completion(trigger) {
    @Override
    public void success() {
        trigger.next();
    }
 
    @Override
    public void fail(ErrorCode errorCode) {
        trigger.fail(errorCode);
    }
});

AnsibleRunner非常智能。它将跟踪每一个agent文件的MD5校验值,并在远程设备测试agent的端口连接性,保证Ansible只在需要的时候被调用。通常情况下,部署或升级的过程是对用户透明的,在服务定义的触发点被触发;例如,一个KVM agent将在添加一个新的KVM主机的时候自动被部署。然而,服务也提供叫做Reconnect API的API,让用户用命令式的方式触发agent部署;例如,用户可以调用APIReconnectHostMsg让一个KVM agent重新部署,重新部署的原因可能是为Linux操作系统修复一个关键的安全漏洞,在他们对KVM YAML配置做出了相应的改变之后。未来,ZStack将提供一个框架,允许用户执行他们定制的YAML配置而不用修改ZStack的默认配置。

在软件升级过程中,用户在安装完一个新的ZStack版本并重启所有管理节点后,AnsibleRunner将检测到agents的MD5校验和发生了变化,并自动在外部设备升级agents。这个过程是对用户透明的且精心设计的;例如,主机服务如果它发现共有10,000台主机,将每次升级1000台KVM主机,以避免管理节点的资源被耗尽;当然,我们也为用户提供了全局配置去优化这个行为(例如每次升级100台主机)。

总结

在这篇文章中,我们演示了ZStack与Ansible的无缝、透明的集成。通过这种方式,agent安装、配置和升级的过程是全自动的,让繁杂的细节远离用户,留给ZStack自身来处理。

转载于:https://my.oschina.net/u/2448318/blog/3001062

相关文章:

SVO 半直接视觉里程计

SVO 从名字来看,是半直接视觉里程计,所谓半直接是指通过对图像中的特征点图像块进行直接匹配来获取相机位姿,而不像直接匹配法那样对整个图像使用直接匹配。整幅图像的直接匹配法常见于RGBD传感器,因为RGBD传感器能获取整幅图像的…

css构造文本

1. 1. 文本缩进text-indent:值;值为数字,最常用的数值单位是px(像素),也可以直接是百分比!text-indent:100px;text-indent:10%;2. 文本对齐text-align:对其方式;可以的值为:left、center、right3. 文本行高…

【数据结构】单链表的逆序输出(两种方法)

第一种方法:转换指针方向 即:将一个已经创建好的单链表进行指针域的改变 今天突然被问到单链表逆序的问题,弄了好久才看出别人的程序有啥问题,就重新写了一遍。 今天才在CSDN客户端上看到美团的面试题是冒泡排序。 一个看似简单…

koa+mongoose基础入门

1.mongoose基本使用 1.安装mongodb npm install mongodb 2.引入mongodb数据表,连接mongodb,通过node来对mongodb进行异步的增删改查 const mongodb requrie(mongodb); mongodb.MongoClient.connect("mongodb://localhost/db1", function(err,…

视觉SLAM学习(三)--------SLAM 综述

SLAM概述 参考资料分享来自本人博客:https://blog.csdn.net/Darlingqiang/article/details/78840931 SLAM一般处理流程包括track和map两部分。所谓的track是用来估计相机的位姿,也叫front-end。而map部分(back-end)则是深度的构建,通过前面…

【数据结构】所有顶点对的最短路径 Floyd算法

所有顶点对的最短路径问题是指&#xff1a;对于给定的有向图G(V&#xff0c;E),求任意一对顶点之间的最短路径。 可以求解得到的 的递推公式&#xff1a; #include <stdio.h> #include <stdlib.h> const int FINITY 5000; const int M 20; typedef struct {ch…

backbone学习总结(二)

今天来看下backbone的路由控制的功能。其实个人感觉backbone&#xff0c;模块就那么几个&#xff0c;熟悉它的框架结构&#xff0c;以及组成&#xff0c;就差不多。 废话不多说&#xff0c;我们来看看还剩下的功能。 关于路由和历史管理 通过 Backbone.Router.extend 来创建路由…

人工智能--野人过河

课程简介 人工智能&#xff08;Artificial Intelligence&#xff09;&#xff0c;英文缩写为AI。它是研究、开发用于模拟、延伸和扩展人的智能的理论、方法、技术及应用系统的一门新的技术科学。人工智能的定义可以分为两部分&#xff0c;即“人工”和“智能”。“人工”比较好…

java对cookie的操作

原文&#xff1a;http://www.cnblogs.com/muzongyan/archive/2010/08/30/1812552.html java对cookie的操作比较简单&#xff0c;主要介绍下建立cookie和读取cookie&#xff0c;以及如何设定cookie的生命周期和cookie的路径问题。 建立一个无生命周期的cookie&#xff0c;即随着…

【ACM】POJ 3069

【问题描述】 Saruman the White must lead his army along a straight path from Isengard to Helm’s Deep. To keep track of his forces, Saruman distributes seeing stones, known as palantirs, among the troops. Each palantir has a maximum effective range of R u…

sparkCore源码解析之思维脑图

2019独角兽企业重金招聘Python工程师标准>>> 在学习sparkCore时&#xff0c;有几个模块的概念理解不是很透彻&#xff0c;故对照源码进行学习&#xff0c;并将结果一脑图的形式呈现&#xff0c;方便后续的持续学习。 详细内容见&#xff1a; sparkCore源码解析之blo…

pangilin 安装编译

make pangolin 的时候报错 ootsun:/home/sun/AR/orb/Pangolin-0.5/build# make [ 1%] Building CXX object src/CMakeFiles/pangolin.dir/log/packetstream.cpp.o /home/sun/AR/orb/Pangolin-0.5/src/log/packetstream.cpp: 在函数‘void pangolin::WaitUntilPlaybackTim…

PHP实现求阶乘

function factorial ($x){if ($x > 1) {$s $x * factorial ($x - 1);} else {$s $x;}return $s; }$x 100;echo $x."的阶乘的为".factorial($x);转载于:https://blog.51cto.com/chensenlin/1854679

【ACM】杭电OJ 2064(汉诺塔III)

题目链接&#xff1a;http://acm.hdu.edu.cn/showproblem.php?pid2064 思路&#xff1a; 1、将n-1个盘从A移到C f(n-1)次 2、将第n个从A移到B 1次 3、将n-1个盘从C移到A f(n-1)次 4、将第n个从B移到C 1次 5、将n-1个盘从A移到C f(n-1)次 #include<cstdio> #inclu…

文件上传至阿里云

public static String uploadFile2OSS(InputStream instream, String fileName) throws IOException {String imageName null;OSSClient ossClient null;try {ClientConfiguration conf new ClientConfiguration();// 请求超时时间设置conf.setConnectionTimeout(5000);// 请…

ORB-SLAM2安装

安装顺利与否可能会与Ubuntu版本有关。&#xff08;ubuntu16.04 gcc4.8.5这个很重要偶&#xff0c;本班的直接决定Pangolin能不能安装成功&#xff0c;如果遇到哦问题的朋友可以参考一下链接 http://blog.csdn.net/Darlingqiang/article/details/78928873&#xff09;亲测可用…

iOS 系统分析(一) 阅读内核准备知识

原文出自【听云技术博客】&#xff1a;http://blog.tingyun.com/web/a... 0x01 iOS体系架构1.1 iOS 系统的整体体系架构 用户体验( The User Experience layer )&#xff1a;SpringBoard 同时支持 Spotlight。 应用软件开发框架&#xff08;The Application Frameworks layer&a…

【数据结构】拓扑排序

如果一个有向图中没有包含简单的回路&#xff0c;这样的图为有向无环图。 图中的顶点代表事件&#xff08;活动&#xff09;&#xff0c;图中的有向边说明了事件之间的先后关系。这种用顶点表示活动&#xff0c;用弧表示活动时间的优先关系的有向图称为顶点表示活动的网&#…

Java8自定义条件让集合分组

** 将一个指定类型对象的集合按照自定义的一个操作分组&#xff1b; 每组对应一个List、最终返回结果类型是:List<List<T>> param <T>*/static class GroupToList<T> implements Collector<T, List<List<T>>, List<List<T>&g…

ROS_Kinetic ubuntu 16.04

ROS_Kinetic系列学习(一)&#xff0c;在ubuntu 16.04安装ROS Kinetic。 http://wiki.ros.org/kinetic/Installation/Ubuntu 通过网页快速了解Linux&#xff08;Ubuntu&#xff09;和ROS机器人操作系统&#xff0c;请参考实验楼在线系统如下&#xff1a; 纯净定制版镜像已经…

android 获取手机GSM/CDMA信号信息,并获得基站信息

本文转自&#xff1a;http://software.intel.com/zh-cn/blogs/2011/12/16/android-gsmcdma/ 在Android中我们常用的轻松获取WIFI信号列表&#xff0c;那如何获取CDMA或者GSM的手机信号呢&#xff1f;系统提供了TelephonyManager类&#xff0c;此类非常丰富&#xff0c;基本你所…

【数据结构】关键路径

在有向图中&#xff0c;如果用顶点表示事件&#xff0c;弧表示活动&#xff0c;弧上的权值表示活动持续的时间&#xff0c;这样的活动称为边表示活动的网&#xff0c;简称AOE网&#xff08;Activity On Edge&#xff09;。通常可以用AOE网来估算工程的完成时间&#xff0c;他不…

呼伦湖国家级自然保护区管理局投放草料保野生黄羊过冬

图为保护区工作人员正在观测黄羊的生活轨迹并记录数据。 王艳清 摄 图为保护区工作人员正在观测黄羊的生活轨迹并记录数据。 王艳清 摄 中新网呼伦贝尔1月16日电 (记者 李爱平)中国北方正是最为寒冷的时节&#xff0c;呼伦湖国家级自然保护区管理局内的60只野生黄羊正在面临食草…

buildroot httpd php

/********************************************************************* buildroot httpd php* 说明&#xff1a;* 在buildroot中选择了php&#xff0c;但是在测试的时候发现总是出现下面这行* 错误&#xff0c;库是存在的&#xff0c;但是却没有放对…

VS快速注释多行 以及 取消

快速注释多行&#xff1a;Ctrl K 然后 Ctrl C 快速取消多行注释 &#xff1a;Ctrl K 然后 Ctrl U

前端的一些小的效果

1 . 移动端字体自适应大小&#xff08;暂时没用过&#xff0c;不过据说很有用也很好用&#xff09; body{font-family: "Microsoft YaHei";font-size: 0.14rem;color: #666;max-width: 640px;margin: auto;}media screen and (min-width: 360px) { html {font-s…

Java虚拟机规范阅读(二)IEEE754简介以及Java虚拟机中的浮点算法

什么是浮点数在计算机系统的发展过程中&#xff0c;曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数&#xff08;Fixed Point Number&#xff09;。在这种表达方式中&#xff0c;小数点固定的位于实数所有数字中间的某个位置。货币的表达就可以使用这种方式&#…

【ACM】杭电OJ 5055(Bob and math problem)

http://acm.hdu.edu.cn/showproblem.php?pid5055 注意几点&#xff1a; 1、全部都是偶数&#xff0c;输出-1 2、n-1个是0&#xff0c;第n个不论是奇数&#xff0c;还是偶数&#xff0c;输出-1 3、n1的情况 4、将所有数字从大到小排列&#xff0c;挑出最小的奇数放在最后…

每天工作4小时的程序员【转】

每个人都熟悉这种作息规律&#xff1a;早上9点去上班&#xff0c;坐在电脑前面&#xff0c;编一天的程序&#xff0c;下午5点下班回家。如今&#xff0c;非常感谢蒂莫西费里斯 (Timothy Ferriss)的《每周工作4小时》&#xff0c;我开始重新思考应该如何工作&#xff0c;如何让自…

ARKIT/ARCore对比分析(一)

ARKit简介 ARkit是什么&#xff1f; 苹果为什么发布ARkit&#xff1f;&#xff08;6月5日的苹果WWDC 2017全球开发者大会上&#xff0c;苹果发布了AR开发平台ARkit&#xff09; 1.概述&#xff1a;ARkit应用平台是苹果的首个 AR 产品。iOS 11引入了ARKit应用平台&#xff0c;…