Skip to content

《DevOps和自动化运维实践》精读笔记

写在前面

  • 书籍介绍:本书涉及大量的DevOps及自动化运维知识点和专业术语,全书共分8章,分别介绍了DevOps与自动化运维在运维中的意义和存在的必要性、生产环境下的Shell脚本、Python在DevOps与自动化运维中的应用、搭建自动化分布式虚拟环境的Vagrant、自动化运维工具Farbic、分布式自动化运维工具Ansible、自动化配置管理工具SaltStack,以及自动化运维中的后续思考等内容。
  • 我的简评:暂无
  • !!福利:文末有pdf书籍、笔记思维导图、随书代码打包下载地址哦

第1章 DevOps与自动化运维第意义

    1. DevOps(英文Development和Operations的组合)是一组过程、方法与系统的统称,用于促进开发(应用程序/软件工程)、技术运营和质量保障部门之间的沟通、协作与整合。

1.1.DevOps在企业中存在的意义

    1. 如下几个因素更加促进了DevOps的发展:虚拟化和云计算基础设施的日益普及;业务负责要求加快产品交付的速度;数据中心自动化配置管理工具的普及;
    1. DevOps是一个完整的、面向IT运维的工作流,其以IT自动化以及持续集成(CI)、持续部署(CD)为基础,用于优化程序开发、测试、系统运维等所有环节。
    1. DevOps其实包含了三个部分:开发、测试和运维
    1. “黑盒运维”的特点是开发和运维的目标是相反的。开发团队的任务是为产品增加新功能、不断升级产品,并以此制定绩效;运维团队的目标则是稳定第一
    1. DevOps希望做到的是打通软件产品交付过程中的IT工具链,它的核心理念在于生产团队(研发、运维和QA)之间的高效沟通和协作,使得各个团队减少时间损耗,从而更加高效地协同工作
    1. DevOps的一个巨大的好处就是可以高效地交付。DevOps的另外一个好处就是其还能改善公司组织文化、提高员工的参与感。
    1. 持续集成(Continuous Integration,CI)是一种软件开发实践,即团队开发成员经常集成它们的工作,通常每个成员每天至少集成一次
    1. 持续部署(Continuous Deployment,CD)是通过自动化的构建、测试和部署循环来快速交付高质量的产品

1.2.为什么企业需要自动化运维

    1. 自动化运维把周期性、重复性、规律性的工作交给自动化平台(或产品)去处理,通过标准化、自动化、架构化、过程优化来降低运维成本、提高运维效率。
    1. 自动化运维可能带来的好处,具体如下:消除无效率;减少错误;最大化员工使用;提高满意度水平;降低成本;

1.3.Web编程相关体系知识点

    1. RESTful是目前最为流行的一种互联网软件架构。因为它结构清晰、符合标准、易于理解、扩展方便,
    1. 几种常用的认证机制:HTTP Basic Auth;OAuth;Cookie Auth;Token Auth;
    1. Token Auth的优点:支持跨域访问;无状态;更适用CDN;去耦;更适合于移动应用;CSRF;性能;不需要为登录页面做特殊处理;基于标准化;
    1. 同步和异步关注的是消息通信机制。阻塞与非阻塞关注的是程序在等待调用结果(消息、返回值)时的状态。
    1. Socket通信则用于在双方建立起连接之后直接进行数据的传输,还可以在连接时实现信息的主动推送,而不需要每次都由客户端向服务器端发送请求。Socket的主要特点包括数据丢失率低,使用简单且易于移植等
    1. WebSocket的最大特点就是,服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息,是真正的双向平等对话,属于服务器推送技术的一种
    1. 相比传统HTTP,WebSocket具有如下好处:一个Web客户端只建立一个TCP连接;WebSocket服务端可以推送(PUSH)数据到Web客户端;具有更加轻量级的头,减少了数据传送量;
    1. RabbitMQ是由Erlang语言编写的、实现了高级消息队列协议(AMQP)的开源消息代理软件(也可称为面向消息的中间件)
    1. AMQP(Advanced Message Queuing Protocol)是一个提供统一消息服务的应用层标准高级消息队列协议,是应用层协议的一个开放标准,为面向消息的中间件设计
    1. RabbitMQ在工作中的常用应用场景:异步处理;流量削峰;应用解耦;
    1. 服务器健康检测技术,主要方法是通过发送不同类型的协议包并检查能否接收到正确的应答来判断后端的服务器是否存活,如果后端的服务器出现故障就会自动剔除
    1. 主要的服务器健康检测技术包括以下三种:ICMP-负载均衡器向后端的服务器发送ICMP ECHO包(俗称的“ping”);TCP-负载均衡器向后端的某个端口发起TCP连接请求;HTTP-负载均衡器向后端的服务器发送HTTP请求;
    1. 负载均衡器实现会话保持一般包含如下几种方案:基于源IP地址的持续性保持;基于Cookie数据的持续性保持;基于HTTP报文头的持续性保持;
    1. Session是由应用服务器维持的一个服务器端的存储空间,用户在连接服务器时,会由服务器生成一个唯一的SessionID,该SessionID可作为标识符用于存取服务器端的Session存储空间。
    1. 解决网站跨服务器的Session共享问题的需求变得迫切起来,最终催生了多种解决方案:基于Cookie的Session共享;基于数据库的Session共享;Session复制;基于Memcache/Redis的Session共享;

1.4.从事DevOps工作应该掌握的语言

    1. 除了我们所熟悉的Shell和Python之外,建议在此基础上熟悉下Go(Golang)的特性和语法
    1. Go语言的优势:部署简单;并发性好,天生支持高并发;良好的语言设计;执行性能好;
    1. Go语言适用的场景:服务器编程;分布式存储、数据库代理器等;Key-Value存储;网络编程;内存数据库;游戏服务器的开发;云平台;

1.5.从事DevOps工作应该掌握的工具

    1. 版本控制管理(SCM):GitHub、GitLab、SubVersion,一般是选择GitLab。
    1. 构建工具:Ant、Gradle、Maven
    1. 持续集成(CI):Jenkins,大名鼎鼎的软件
    1. 配置管理:Ansible、Chef、Puppet、SaltStack
    1. 虚拟化:Xen或KVM、Vagrant
    1. 容器:Docker、LXC、第三方厂商如AWS
    1. 服务注册与发现:Zookeeper、etcd
    1. 日志管理:大家都很熟悉的ELK
    1. 日志收集系统:Fluentd、Heka
    1. 压力测试:JMeter、Blaze Meter、loader.io
    1. 消息中间件:ActiveMQ、RabbitMQ

1.6.了解网站系统架构设计和高并发场景

    1. 可以参考吞吐量、每秒查询率(QPS)、响应时间(Response Time)、并发用户数,PV等作为辅助指标,但它们并不能真实地反映网站的性能。
    1. 网站架构一般分成网页缓存层、负载均衡层、Web服务器层、数据缓存层及数据库层,其实一般还会多加一层,即文件服务器层,
    1. 秒杀系统的核心思想:层层过滤。 ?尽量将请求拦截在上游,以降低下游的压力。 ?充分利用缓存与消息队列,提高请求处理的速度及削峰填谷的作用

1.7.了解数据库集群主从复制的基本原理

    1. redis主从复制的具体流程
    1. MySQL数据库的主从Replication同步(又称为主从复制)是一个很成熟的架构
    1. 主从复制是MySQL数据库提供的一种高可用、高性能的解决方案,其原理其实并不复杂

1.8.Linux服务器的安全防护

    1. 做好基础的安全措施,可以从如下几个方面着手:1.首先要保证自己的Linux服务器的密码绝对安全;防止SSH暴力破解是一个老生常谈的问题;分析系统的日志文件,寻找入侵者曾经试图入侵系统的蛛丝马迹;建议不定期使用grep error/var/log/messages检查自己的服务器是否存在硬件损坏的情况;建议不定期使用Chkrootkit应用程序对rootkit的踪迹和特征进行查找;推荐使用Tiprwire开源软件来检查文件系统的完整性;
    1. 还可以设计代码级别的WAF软件防火墙,主要是通过ngx_lua模块来实现的

第2章 Shell脚本在DevOps下的应用

2.1.Shell编程基础

    1. Shell是核心程序Kernel之外的命令解析器,其既是一个程序,同时也是一种命令语言和程序设计语言
    1. Shell脚本的第一行均会包含一个以“#!”为起始标志的文本行
    1. 正则表达式是操作字符串的一种逻辑公式
    1. 环境变量用于所有用户进程(包括子进程)
    1. 特殊变量“$*”和“$@”表示所有的位置参数。特殊变量“$#”表示位置参数的总数。
    1. Shell脚本有两种运行方式,第一种方式是利用sh命令,第二种执行方式是利用chmod命令设置Shell脚本文件。
    1. 一个Unix进程或命令终止运行时,将会自动向父进程返回一个出口状态。
    1. 从用途上考虑,变量可以分为内部变量、本地变量、环境变量、参数变量和用户自定义的变量
    1. Linux中含有两个重要的文件,“/etc/profile”和“$HOME/.bash_profile”,每当系统登录时都要读取这两个文件,用来初始化系统所用到的变量,其中“/etc/profile”是超级用户所用,“$HOME/.bash_profile”是每个用户自己独立的,可以通过修改该文件来设置PATH变量
    1. read命令用于接收标准输入(键盘)的输入,或其他文件描述符的输入(后面会讲到)
    1. Shell脚本默认按十进制解释字符串中的数字字符
    1. 命令替换的目的是获取命令的输出,且为变量赋值或对命令的输出作进一步的处理。
    1. test语句与if/then和case结构的语句一起,构成了Shell编程的控制转移结构
    1. 文件测试主要是指文件的状态和属性测试,其中包括文件是否存在、文件的类型、文件的访问权限以及其他属性等

2.2.Shell中的控制流结构

    1. Shell中的控制结构也比较清晰:if...then...else...fi语句;case语句;for循环;until循环; while循环;break控制;continue控制
    1. case取值后面必须为单词in,每一种模式都必须以右括号结束。
    1. Linux中包含了很多逐行读取一个文件的方法,其中最常用的就是下面脚本里的方法(管道法),而且这也是效率最高、使用最多的方法

2.3.sed的基础用法及实用举例

    1. sed是Linux平台下的轻量级流编辑器,一般可用于处理文本文件。
    1. sed与vim最大的区别是,sed不需要像vim一样打开文件,可以在脚本里面直接操作文档,所以大家将会发现它在Shell脚本里的使用频率是很高的

2.4.awk的基础用法及实用实例

    1. awk是一个强大的文本分析工具,相对于grep的查找、sed的编辑,awk在对数据进行分析并生成报告时显得尤为强大。
    1. awk就是逐行读入文件,以空格为默认分隔符对每行进行切片,切开的部分再进行各种分析处理。
    1. awk语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息,抽取信息之后才能进行其他的文本操作。
    1. 实现混合编程的关键是awk与Shell脚本之间的对话
    1. awk与Shell脚本之间的信息交流:awk从Shell脚本中获取所需要的信息(通常是变量的值)、在awk中执行Shell命令行、Shell脚本将命令执行的结果发送给awk处理,以及Shell脚本读取awk的执行结果等。

2.5. Shell应用于DevOps开发中应掌握的系统知识点

    1. 现代操作系统提供了三种基本的构造并发程序的方法:进程;I/O多路复用;线程;
    1. wait命令有一个很重要的用途就是在Shell的并发编程中,可以在Shell脚本中启动多个后台进程(使用“&”),然后调用wait命令,等待所有后台进程都运行完毕,Shell脚本再继续向下执行
    1. 可采用下面两种方式来调用外部的脚本,即exec方式和source方式
    1. 使用flock建立排它锁
    1. 在Linux系统中,一切皆可以看成文件,文件又可分为普通文件、目录文件、链接文件和设备文件。
    1. “并发”在微观上并不是同时执行的,其只是把时间分成若干段,使多个进程快速交替地执行,从宏观上来看,就好像是这些进程都在同时执行
    1. 管道(pipe)是Linux支持的最初的Unix IPC形式之一,具有以下特点:管道是半双工的,数据只能向一个方向流动;只能用于父子进程或者兄弟进程之间;单独构成一个独立的文件系统;数据的读出和写入;

2.6.生产环境下的Shell脚本

    1. 将生产环境下的Shell脚本分为备份类、统计类、监控类、运维开发类和自动化运维类

第3章 Python在DevOps与自动化运维中第应用

    1. Python是一种动态解释型的编程语言。Python功能强大,支持面向对象编程、函数式编程,同时还可以在Windows、Linux和Unix等多个操作系统上使用,因此Python也称为“胶水语言”

3.1.Python语言的应用领域

    1. 自动化构建(即持续集成CI)是因应用而易的,如果是Python应用,因为有setup-tools、pip、virtualenv及tox等工具的存在,自动化构建非常简单。
    1. 动化运维(自动化配置管理)工具,新生代Ansible、SaltStack,以及轻量级的自动化运维工具Fabric,均为Python所开发
    1. Python由于能够很好地支持协程(Coroutine)操作,基于此发展了很多并发库,如Gevent、Eventlet,还有Celery之类的分布式任务框架。
    1. Python本身就是一门工程性语言,数据科学家用Python实现的算法,可以直接用在产品中
    1. Python还广泛应用于Web开发、游戏开发、手机开发、数据库开发等众多领域

3.2.选择Python的原因

    1. 对于研发工程师而言,Python的优雅和简洁无疑是最大的吸引力
    1. 对于运维工程师而言,Python的最大优势在于,几乎所有的Linux发行版都内置了Python解释器

3.3.Python的版本说明

    1. Python 2.x版本和Python 3版本的差异是很大的,语法也有很多是完全不一样的

3.4.Python基础学习工具

    1. Python(x,y)是一个免费的科学和工程开发包,提供了数学计算、数据分析和可视化展示。
    1. 附带了科学计算方面的很多常用库,另外还有大量常用库比如用于桌面软件界面制作的PyQt,还有文档处理、EXE文件生成等常用库。
    1. IPython提供了改进的交互式Python Shell,我们可以利用IPython来执行Python语句,并且能够立刻看到结果
    1. ST3是一款具有代码高亮显示、语法提示、自动完成且反应快速的编辑器软件,其不仅具有华丽的界面,还支持插件扩展机制,用ST3来写代码,绝对是一种享受

3.5.Python基础知识进阶

    1. 正则表达式主要用于搜索、替换和解析字符串
    1. 原子是正则表达式中最基本的组成单位,每个正则表达式中至少要包含一个原子,常见的原子是由普通字符或通用字符和原子表构成的
    1. 贪婪模式就是尽可能多地匹配,而懒惰模式就是尽可能少地匹配
    1. re模块提供了一些函数可根据正则表达式进行查找、替换和分隔字符串
    1. Python程序是由包、模块和函数组成的
    1. 在Python的定义中,一个文件就是一个模块,模块是由类、函数及程序组成的,文件名是不能重复的
    1. 在开发Python程序的过程中,会涉及如下三个方面的编码:Python程序文件的编码;Python程序运行时环境的编码;Python程序读取外部文件、网页的编码;
    1. Python提供了强大的异常处理机制,通过捕获异常可以提高程序的健壮性。异常处理还具有释放对象、中止循环的运行等作用。
    1. Python的参数包括以下几种类型:必备参数;关键字参数;默认参数;不定长参数
    1. Python是支持面向对象、面向过程、函数式编程等多种编程范式的,它不强制我们使用任何一种编程范式
    1. Python的多线程实际上并不能真正利用多核,因为Python的多线程实际上还是在一个核上做并发处理。
    1. 如果使用多进程就可以真正利用多核,因为各进程之间是相互独立的,不共享硬件资源,可以在不同的核上执行不同的进程,以达到并行的效果
    1. 进程是具有一定独立功能的程序关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位
    1. 线程是进程的一个实体,是CPU调度和分派的基本单位,它是比进程更小的能独立运行的基本单位。线程自己基本上不拥有系统资源,只拥有少量的在运行中必不可少的资源(如程序计数器,一组寄存器和栈)
    1. 进程和线程的主要差别在于它们是不同的操作系统资源管理方式。进程有独立的地址空间,一个进程崩溃之后,在保护模式下不会对其他进程产生影响。而线程只是一个进程中的不同执行路径,线程有自己的堆栈和局部变量,但线程之间没有单独的地址空间,一个线程死掉就等于整个进程死掉,所以多进程的程序要比多线程的程序更健壮
    1. 线程执行开销小,但不利于资源的管理和保护;而进程则正好相反。同时,线程适合于在SMP机器上运行,而进程则可以跨机器迁移
    1. Python在设计之初就考虑在主循环中,同时只能有一个线程在执行,就像在单CPU的系统中运行多个进程那样,内存中可以存放多个程序,但在任意时刻,只有一个程序在CPU中运行。
    1. 对于多线程来说,其最大的特点就是线程之间可以共享数据,但是若要共享数据就会出现多线程同时更改一个变量,使用同样的资源,从而出现死锁、数据错乱等问题
    1. Queue模块实现了多生产者多消费者队列,尤其适合于多线程编程。

3.6.Python经常用到的第三方类库

    1. 工作中经常用到的第三方类库:django、tornado、flask、cherryPy、requests、yagmail、psutil、sh、Boto3、Srapy、BeautifulSoup、Selenium、Jinja2、rq、Celery、Supervisor

3.7.利用Flask设计后端Restful API

    1. Flask是轻量级、易于采用、文档化和流行的开发RESTful API的非常好的选择,也是笔者在工作中最常用的Flask Web框架之一
    1. 一个标准的API有4个接口:GET、PUT、POST、DELETE
    1. 总结一下Flask RESTful API的主要特点:客户端中服务器;无状态;可缓存;分层系统;统一的接口;按需编码;

3.8.工作中的Python脚本分享

第4章 Vagrant在DevOps环境中的应用

    1. 最常用的虚拟化工具有VMware Workstation和VirtualBox等
    1. 使用虚拟机的时候,用户往往会遇到下面这些问题:虚拟机工具学习成本;环境无法共享;虚拟机平台不统一;

4.1.Vagrant简单介绍

    1. Vagrant就是为了方便地实现虚拟化环境而设计的,使用Ruby开发,基于VirtualBox等虚拟机管理软件的接口,提供一个可配置的、轻量级的便携式虚拟开发环境
    1. Vagrant还会创建一些共享文件夹,以便我们在主机和虚拟机之间共享代码之用。

4.2.Vagrant安装

4.3.使用Vagrant配置本地开发环境

    1. Vagrant中一共提供了三种网络配置:端口映射(Forwarded port)、私有网络(Private network)、公有网络(Public network)

4.4.使用Vagrant搭建DevOps开发环境

4.5.使用Vagrant搭建分布式环境

4.8. Vagrant在工作中除了能够方便地团队之间共享开发环境之外,另外一个优点就是能在节约系统资源的前提下,方便快捷地搭建分布式环境

第5章 自动化部署管理工具Ansible

    1. 相比较于Puppet和Saltstack而言,Ansible是一款轻量级的服务器集中管理软件
    1. Ansible是基于Paramiko开发的。
    1. Paramiko是用Python语言编写的一个模块,遵循SSH2协议,支持以加密和认证的方式,进行远程服务器的连接
    1. Ansible与轻量级的自动化运维工具Fabric还有一个共同点,那就是不需要在远程主机上安装客户端,因为它们都是基于SSH来与远程主机进行通信的
    1. Ansible符合Red Hat希望通过开放式开发提供无障碍设计和模块化架构的目标,主要体现在以下几个方面:Ansible易于使用;Ansible是一个非常受欢迎的开源项目;Ansible支持多层部署;Ansible为架构的多个层次带来一致性;Ansible支持异构IT环境;

5.1.YAML介绍

    1. YAML是一个可读性高的用于表达资料序列的格式。它的主要特点是可读性好、语法简单明了、表达能力强、扩展性和通用性强等
    1. YAML中提供了多种常量结构,具体包括整数、浮点数、字符串、NULL、日期、布尔、时间等。

5.2.Ansible的安装和配置

5.3.定义主机与组规则(Inventory)

5.4.Ansible常用模块介绍

    1. Ansible常用模块有很多,包括云计算、命令行、包管理、系统服务、用户管理等,
    1. Ansible的模块所实现的行为是冥等性(idempotence)的,只需要运行一次playbook就可以将需要配置的机器都置为期望状态
    1. 运维工作中经常用到的几个模块:setup模块、copy模块、synchronize模块、file模块、ping模块、group模块、user模块、shell模块、script模块、get_url模块、yum模块、yum模块、cron模块、service模块
    1. facts组件是Ansible用来采集客户端机器设备信息的一个重要功能,setup模块可用于获取Ansible客户端机器的所有facts信息,并且可以使用filter来查看指定的信息
    1. 该模块可实现Ansible主机向客户端传送文件的功能,文件的变化是通过md5值来判断的
    1. synchronize模块用于将Ansible机器的指定目录推送(push)到客户机器的指定目录下
    1. file模块主要用来设置文件或目录的属性
    1. user模块用于创建用户
    1. command模块作为Ansible的默认模块,可以运行被控端机器权限范围内的所有shell命令
    1. script模块用于在远程被控端主机执行本地Ansible机器中的Shell脚本文件,相当于“scp+shell”的组合命令
    1. get_url模块可以实现在远程主机上下载url到本地,这个模块在平时的工作中应该用得比较多
    1. yum模块是用来管理Linux平台的软件包操作的
    1. cron模块,顾名思义就是创建计划任务,可以定义webserver组被控端机器每天凌晨一点过一分ntpdate自动对时
    1. service模块被控端服务管理,例如开启、关闭、重启服务等

5.5.playbook介绍

    1. playbook(也称为剧本)是一个不同于Ansible Ad-hoc命令行执行方式的模式,其功能更为强大灵活。简而言之,它是一个非常简单的配置管理和多主机部署系统。
    1. playbook的模板是使用Python的jinja2模块来处理的。

5.6.Ansible在AWS云平台中的应用

5.7.角色

  • Ansible的角色(roles)是1.2版本引入的新特性,用于层次性、结构化地组织playbook。角色能够根据层次型结构自动装载vars变量文件、tasks及handlers等。

5.8.Jinja2过滤器

5.9.Ansible速度优化

    1. Ansible默认是同步阻塞模式,它会等待所有的机器都执行完毕之后才会在前台返回
    1. Ansible默认只会创建5个进程并发执行任务,所以一次任务只能同时控制5台机器执行。
    1. Ansible控制端采用的是系统默认的OpenSSH程序与被控制端之间进行连通,因此Ansible对SSH的依赖性较强

5.10.利用Ansible API提供自动化运维后端

    1. 如果此API是在公网机器上提供访问的,那么建议一定要配置Access Token(最低限度也要开放iptables,只允许特定IP访问5000端口),不然很容易被恶意地大规模批量调用,从而使系统产生大量垃圾数据,系统资源被大量消耗,甚至无法正常使用。

5.11.Ansible2.2.新增功能

  • Ansible与其他自动化运维工具(例如Puppet)的关注方向不一样,其关注的是软件使用的便利性、简便性及扩展性

第6章 自动化配置管理工具SaltStack

    1. SaltStack(以下简称为Salt)是基于Python开发的一套C/S架构配置管理工具,其底层使用的是ZeroMQ消息队列PUB/SUB方式通信,并且使用SSL证书签发的方式来进行认证管理

6.1.Salt的相关知识点介绍

    1. 曾做过Salt与Ansible的对比,在连通性方面,Salt的速度要比Ansible快50倍左右
    1. Salt目前的通信模式总共分为两种模式:ZeroMQ和REAT。
    1. 所有的Salt被管理客户端节点(Minion),都是通过密钥进行加密通信的,使用端口为4506。客户端与服务器端的内容传输是通过消息队列完成的,使用端口为4505。Master可以发送任何指令让Minion执行

6.2.Salt的常见组件

    1. Salt的常用组件,其中包括Salt的基础语法、常用模块、Grains组件及pillar组件
    1. Grains是Salt组件中非常重要的组件之一,它相当于Puppet的Facter。主要作用是负责采集Minion端的常用属性信息,比如CPU、内存、磁盘及网络信息等
    1. pillar也是Salt最重要的组件之一,其作用是定义Master端与Minion端相关的所有数据,相当于是数据管理中心。
    1. 在Salt中执行任何一个操作都会在Master端产生一个jid号,而Minion端会在/var/cache/salt/minion/proc中创建一个以jid为名称的文件,
    1. State是Salt最核心的功能,我们首先通过预先定制好的sls(salt state file)文件来针对特定的Minion端进行状态管理,支持包括程序包(pkg)、文件(file)和系统服务等功能

6.3.Salt真是案例分享

    1. 例中Salt采用了两个环境,即base和prod,base环境主要用于存放系统初始化的功能文件,而prod主要用于存放生产线环境下的配置管理功能文件

6.4.Salt多Master搭建

    1. 线上环境采用的是双Master Salt,主要是防止单Master出现硬件故障的时候,会无法管理线上的Minion客户端。
    1. Salt本身是没有相应的同步机制来同步多Master的各种数据的

6.5.Salt API介绍

    1. Salt本身就提供了两类API(也称为接口)与之交互。 1)只有在Master端或Minion端机器上才能调用的Python API。 2)可以在远程通过HTTP调用的Restful API

第7章 Docker和Jenkins在DevOps中的应用

    1. Docker是现阶段最流行的容器技术,主要用于隔离,因为Docker镜像、容器运行简单便捷,适合于将应用快速部署上线、快速弹性扩充,所以Docker是非常适合DevOps
    1. Jenkins是一个开源的、提供友好操作界面的持续集成(CI)工具,起源于Hudson(Hudson是商用的),主要用于持续、自动地构建或测试软件项目、监控外部任务的运行(这个比较抽象,暂且写上,不做解释)
    1. 虚拟机是在硬件层面实现虚拟化,需要有额外的虚拟机管理应用和虚拟机操作系统层,而Docker容器是在操作系统层面上实现虚拟化,直接复用本地主机的操作系统,所以性能上更接近于原生,基本上是没有任何损耗的
    1. Docker容器除了运行其中的应用之外,基本上不消耗额外的系统资源,在保证应用性能的同时,尽量减小系统开销。
    1. DevOps的核心理念在于研发、运维及测试团队之间高效沟通与协作,以解决以下常见问题:更频繁的需求变更和持续部署;生产环境不受开发人员控制;开发与运维不能紧密切合;现在虚拟机不能满足开发与运营人员的协作;研发部署流程需要更多的成本和时间;

7.1.Docker的基础安装

7.2.Docker的三大核心概念

    1. Docker的三大核心概念列举如下:镜像(Image);容器(Container);仓库(Repository)
    1. Docker镜像类似于虚拟机镜像,可以将其理解为一个面向Docker引擎的只读模板,包含了文件系统
    1. 容器类似于一个轻量级的沙箱,Docker利用容器来运行和隔离应用。容器是从镜像创建的应用运行实例,可以对其进行启动、开始、停止、删除操作,而这些容器都是相互隔离、互不可见的。可以把容器看作一个简易版的Linux系统环境(这包括root用户权限、进程空间、用户空间和网络空间等),以及运行在其中的应用程序打包而成的应用盒子

7.3.Docker的基础架构

    1. Docker仓库是Docker集中存放镜像文件的场所。
    1. Docker镜像是完全不可写的,Docker容器是可写的,两者之间有着千丝万缕的关系。
    1. Docker是一个C/S模式的架构,后端是一个松耦合架构,各模块各司其职。用户使用Docker Client与Docker Daemon建立通信,并发送请求给后者
    1. Docker Client可以通过以下三种方式和Docker Daemon建立通信,即Port、Socket和Socketfd

7.4.Docker网络实现原理

    1. Docker的网络实现基本上就是利用了Linux的网络命令空间和虚拟网络设备(即veth设备对),熟悉这两部分的基本概念,有助于理解Docker网络的实现过程

7.5.利用Dockerfile文件技巧打包Docker镜像

    1. 其他很多的应用一样,例如Jumper、Jenkins及GitLab等都是以Docker容器的形式运行的
    1. COPY指令与ADD指令的唯一区别在于是否支持从远程URL获取资源。COPY指令只能从执行docker build所在的主机上读取资源并复制到镜像中。而ADD指令还支持通过URL从远程服务器读取资源并复制到镜像中
    1. ENTRYPOINT是配置容器启动后执行的命令,并且不可被RUN提供的参数覆盖

7.6.利用Docker-Compose编排和管理多容器

    1. depends_on,这个标签解决了容器的依赖、启动先后的问题

7.7.利用Docker搭建Jenkins Master/Slave分布式环境

    1. 用Docker来部署Jenkins的好处还有以下几点:避免冲突;部署和滚动更新方便;

7.8.实际运行Jenkins时遇到的问题及使用心得

    1. Jenkins的机器磁盘很容易爆满
    1. 建议采用Jenkins的Role-based Authorization Strategy插件中的“Manage and Assign Roles”功能来进行控制,每种环境的Jenkins job只能由相关项目组的人员使用
    1. Jenkins的Shell控制台中使用英文字符不会出现乱码的情况,但是如果使用中文,则会出现乱码
    1. 用于了解Jenkins中job是否构建成功的插件:钉钉通知器

第8章自动化运维的后续思考

    1. 自动化运维是指将IT运维中日常的、大量的重复性工作自动化,把过去的手动执行转为自动化操作。

8.1.自动化运维系统中应该实现的系统

    1. 三个系统在自动化运维体系中是不可缺少的:CMDB管理系统;持续集成系统;运维调度管理系统。
    1. 每个公司的CMDB记录机器资产的情况是不一样的,但大致有机器主机名、IP名、业务角色、隶属平台、机器类型、归属线路。

8.2.自动化运维经历的阶段

    1. 自动化运维一般都会经历以下几个阶段:标准化、Web化、服务化、智能化

8.3.自动化运维的必备技能:定制RPM包

    1. 现在我们都是先将业务软件以RPM包的形式打包,建立自己的yum源,通过Ansible、SaltStack或Puppet来管理这些RPM包
    1. 制作RPM软件包并不是一项复杂的工作,其中的关键在于编写SPEC软件包描述文件

8.4.因地制宜地选择自动化运维方案

    1. 需要选择一款支持sudo的自动化配置管理工具,还要方便进行二次开发,如果是这种场景的话,那么这里推荐用Ansible来作为其自动化配置管理工具。如果数据中心比较分散,而且又要考虑网络方面的问题和二次开发的问题,那么这里会推荐大家采用SaltStack
    1. k8s在很多方面占据了巨大的优势,例如容器编排、水平自动扩展、滚动升级、负载均衡还有资源监控
    1. 打造自动化运维平台,最难的不是如何开发,而是积累场景,长期积累各种业务场景才能打造出最合适的自动化运维平台。

附录

    1. GitLab在DevOps工作中的实际应用:1. Git可以使用四种主要的协议来传输数据,分别为本地传输(Local)、SSH协议、Git协议和HTTP(包含HTTPS);2. Git Flow就是为项目开发一个新功能需要的操作流程:创建新的分支;实现功能;发起merge request;code review;合并master;
    1. 用Gunicorn部署高性能Python WSGI服务器:1.正确的做法是底层代码由专门的服务器软件来实现,我们专注于用Python代码生成HTML文档;2. Gunicorn也称为“绿色独角兽”,是一个使用广泛的、高性能的Python WSGI UNIX HTTP服务器,移植自Ruby的独角兽(Unicorn)项目,使用pre-fork worker模式,具有使用非常简单,轻量级的资源消耗,以及高性能等特点
    1. Supervisor在DevOps工作中的应用:1. 工作中,经常需要在一个机器上开启多个服务。最简单的方法就是把多个启动命令放到一个启动脚本里面,启动时直接启动这个脚本即可;2. Supervisor,简单来说就是Python编写的一个多进程管理工具。
    1. 分布式队列管理Cerely简介:1. Celery是一个基于Python开发的分布式异步消息任务队列,其可以有助于轻松地实现任务的异步处理;2. Celery的优点:简单;高可用;快速;灵活;3. Celery的默认设置就能满足基本的要求。Worker以Pool模式启动,默认大小为CPU核心数量,序列化机制默认是pickle,但也可以指定为JSON。

写在后面

  • pdf书籍、笔记思维导图、随书代码打包下载地址:暂无,后面补上
  • 思维导图在线查看:点击打开
  • 得到电子书地址:点击阅读