Linux
文化
有一些文章并不涉及具体的技术细节, 但是对于新人快速进入Linux/Unix世界很有帮助:
- 提问的智慧
- <<大教堂与市集>>
- <<操作系统革命>>, 这是一部记录片, 讲述了GNU, Linux, Richard stallman相关的很多故事.
shell
运维工程师的工作大部分时间是在和shell打交道, 所以掌握好shell相关的知识是非常重要的.
shell基础二十篇
shell 脚本学习指南
sed&awk
Awk简明教程 from coolshell
Sed简明教程 from coolshell
无插件Vim编程技巧 from coolshell
尽量不要写超过1屏的 shell 脚本. 如果超过1屏, 说明逻辑已经非常复杂了, 又或者你的shell太过冗余, 需要优化. shell超过一定规模后非常难以维护, 极易出错, 所以这个时候就应该考虑使用 python/perl 等真正可以称得上语言的东西.
kernel
Linux内核设计与实现
Linux/Unix设计思想
上面两本书相对来讲比较容易, 适合非科班背景的同学阅读.
Ops
在掌握了基本的 shell 知识后, 其实已经可以完成基本的运维工作, 但是还远远不够. 一个典型的运维工程师至少需要管理上百台设备, 包括服务器, 网络设备等. 规模和差异化永远是运维工程师最大的敌人.
比如, 面对一台服务器你可以很轻松的完成安装系统或者修改某个配置文件的工作. 但是相同的任务, 如果需要在100台, 或者1000台服务器上完成, 那就....不那么简单了, 尤其是面对不同的服务器, 多种不同的操作系统版本的情况下, 就.....基本没法干了. 当然, 你可以一台一台的人肉去搞, 但是我相信, 你还没做完就被公司fire掉了. 所以, 我们还需要借助一些更为给力的工具, 完成一些复杂的任务.
系统安装
想想你可能一天要给上百台设备安装操作系统的场景.
每个Linux的发行版都有自己的自动应答机制, redhat系列的是Kickstart, debian系的是FAI. 可以实现无人值守安装(安装过程不需要鼠标点击或者键盘输入), 这是批量化安装系统的前提. 自动应答机制只能解决单机的自动安装, 批量化得操作还需要用到另外几个东西.
- PXE, 可以让服务器通过网卡加载系统安装程序.
- ipmitool, 服务器远程管理卡(ilo)的命令行管理程序, 可以远程关机/开机, 指定boot order.
安装系统相关的工具/系统非常多, 比如: Cobbler, 这是一个建立在PXE基础之上的, 对系统安装过程提供了更高级抽象的系统.
监控
运维工程师的另一项重要工作就是监控系统的运行状态, 这里的"系统"指的不是"操作系统", 而是你管理的整个服务器集群, 里面可能有DB, 有Web Server, 有Cache等等. 需要监控的指标也不仅仅是cpu, 内存, 硬盘这些常规指标, 还会包括一些应用上的指标, 比如: 并发数量, QPS. 甚至还会有一些业务指标需要监控.
要建立完善的监控系统, 单靠监控软件本身是不够的, 还需要被监控的软件/系统配合才行. 被监控方需要将需要监控的数据暴露出来, 方便监控系统获取才行. 比如, 你想监控操作系统相关的指标, 那你可能要学一些shell知识----知道如何获取自己想要的数据.
以下是几个常见的监控系统软件:
- nagios
- ganglia
- zabbix
配置管理
想想你可能一天要更新成百上千台设备的配置.
cfengine是最早的, 得到大规模使用的配置管理工具. 类似的工具还有: puppet, saltstack, ansible...
这些工具的功能不尽相同, 但是一些基本的功能是差不多的:
- 管理服务器进程
- 管理配置文件
- 管理软件包
- 管理进程, 配置文件, 软件包之间的依赖
- 远程批量命令执行
比如你有一批机器需要安装Apache, 然后更新Apache的配置, 然后重启Apache使配置生效. 类似的任务, 你可能每天都会遇到, 而且不止一次. 而这正是配置管理工具应用的典型场景. 理想的情况下, 工程师只需要编写一些简单的规则, 并且指定应用这些规则的服务器, 然后配置管理系统会帮你完成软件安装, 配置下发, 服务重启等一些列的工作. 工程师不在需要关心自己面对的是10台服务器, 还是100台服务器.
配置管理工具, 帮助工程师实现了对硬件, 对软件环境的抽象, 实现了基础设施可编程, 这很重要. 基础设施可编程的概念之所以重要, 是因为这一概念是所有云服务的基石.
Dev
对于运维工程师而言, 除了 shell 还必须掌握一门真正语言, 个人建议以 python 入门, 原因有几个:
- "自带电池", 通常你只需要python 的标准库就能完成大部分的工作.
- python的哲学是"一个问题只需要一种解决办法". 如果你遇到过一些你不敢碰的, 充满Magic的perl脚本, 你就会了解这一点有多重要了.
当然工作中具体用什么语言应当视公司环境而定, 有可能是 python, 也有可能是perl/ruby/ 甚至是lua.
但是我要强调的是, 语言是相通的, 只要你掌握了一门语言, 学新语言将会很快, 所以刚开始学习编程时, 不要过多纠结于选什么语言好. Just do it!
python
对于 python 而言最好的教程我认为是官方文档,
但因为是英文的, 所以看起来可能会比较吃力.
python 相关的书籍还是比较丰富的. 这里随便推荐几本.
Python语言入门
Python基础教程
Python核心编程
做一个"懒惰"的工程师
这里的懒惰是加引号的, 不是让工程师真的变得懒惰, 而是需要工程师通过工具, 通过代码将工作变得自动化, 从而解放自己.
可以说, "懒惰"应该是工程师毕生的追求. 这里推荐两篇文章:
“懒惰”Linux:“懒惰”集群管理员的 11 个秘诀
“懒惰” Linux 管理员的 10 个关键技巧