标签归档:vim

一起来说 Vim 语

我们假设你已经了解了 Vim 的几种常用的工作模式(正常模式、插入模式、命令模式等),如果你还不了解,请先阅读 这里。现在就让我们一起来学习一下 Vim 语吧。

动词

动词代表了我们打算对文本进行什么样的操作。例如:

  • d 表示删除(delete)
  • r 表示替换(replace)
  • c 表示修改(change)
  • y 表示复制(yank)
  • v 表示选取(visual select)

名词

名词代表了我们即将处理的文本。Vim 中有一个专门的术语叫做文本对象(text object),下面是一些文本对象的示例:

  • w 表示一个单词(word)
  • s 表示一个句子(sentence)
  • p 表示一个段落(paragraph)
  • t 表示一个 HTML 标签(tag)
  • 引号或者各种括号所包含的文本称作一个文本块。

介词

介词界定了待编辑文本的范围或者位置。例如:

  • i 表示“在…之内”(inside)
  • a 表示“环绕…”(around)
  • t 表示“到…位置前”(to)
  • f 表示“到…位置上”(forward)

下面是几个有关范围的示意图,你们感受一下:

Prepositions

组词为句

有了这些基本的语言元素,我们就可以着手构造一些简单的命令了。文本编辑命令的基本语法如下:

动词 介词 名词

下面是一些例子(如果熟悉了上面的概念,你将会看到这些例子非常容易理解),请亲自在 Vim 中试验一番。

# 删除一个段落: delete inside paragraph
dip

# 选取一个句子: visual select inside sentence
vis

# 修改一个单词: change inside word
ciw

# 修改一个单词: change around word
caw

# 删除文本直到字符“x”(不包括字符“x”): delete to x
dtx

# 删除文本直到字符“x”(包括字符“x”): delete forward x
dfx

数词

数词指定了待编辑文本对象的数量,从这个角度而言,数词也可以看作是一种介词。引入数词之后,文本编辑命令的语法就升级成了下面这样:

动词 介词/数词 名词

下面是几个例子:

# 修改三个单词:change three words
c3w

# 删除两个单词:delete two words
d2w

另外,数词也可以修饰动词,表示将操作执行 n 次。于是,我们又有了下面的语法:

数词 动词 名词

请看示例:

# 两次删除单词(等价于删除两个单词): twice delete word
2dw

# 三次删除字符(等价于删除三个字符):three times delete character
3x

怎么样,是不是很容易理解?

通过php写wordpress博客

前言

vim,emacs什么的都有写wordpress的插件。
这篇就提供php版本的发博客的代码。

关键代码

require 'config.inc.php';
require 'common.inc.php';
require 'lib/Readability.inc.php';
require 'lib/class-IXR.php';
require 'lib/plugin.php';
require 'lib/xmlrpc.inc';

$xmlrpcurl='http://go2live.cn/xmlrpc.php';//请填入你自己的博客地址。

$blogid='1';
$username='xxxx';//请填入你的wordpress的用户名
$password='xxxxx';//请填入你的Wordpress的密码

$postTitle='博客标题';//要发布的博客的标题
$postContent='博客内容';//要发布的博客的内容

//$GLOBALS['xmlrpc_internalencoding'] = 'UTF-8';
define ('DOMAIN', 'go2live.cn'); // 博客的域名,请填入你自己的博客的域名
// 创建 xml-rpc client 
$cl = new xmlrpc_client ( "/xmlrpc.php", DOMAIN, 80); 
// 准备请求 
$req = new xmlrpcmsg('metaWeblog.newPost'); 
// 逐个列出请求的参数: 
$req->addParam ( new xmlrpcval ( 1, 'int')); // 博客ID 
$req->addParam ( new xmlrpcval ( $username, 'string' )); // 用户名 
$req->addParam ( new xmlrpcval ( $password, 'string' )); // 密码 
$struct = new xmlrpcval (
    array ( "title" => new xmlrpcval ( $postTitle, 'string' ), // 标题 
    "description" => new xmlrpcval ($postContent , 'string'), // 内容
    "author"=> new xmlrpcval("bjmayor","string"),//作者,可不填
    "post_type"=>new xmlrpcval("post",'string'),//发布类型,是页面还是博客。post为博客
    "post_status"=>new xmlrpcval("publish",'string'),//发布状态,
    "dateCreated"=>new xmlrpcval(strtotime("2015-12-12 09:23:22"),"dateTime.iso8601"),//发布时间,可不填,默认为当前时间。
    "categories"=>new xmlrpcval(array(new xmlrpcval("美文赏析","string")),"array")//分类信息,分类信息是需要已经存在的分类。
),
"struct" );
$req->addParam ( $struct ); 
$req->addParam ( new xmlrpcval (1, 'int')); // 立即发布
// 发送请求 
$ans = $cl->send($req); 
var_dump ( $ans );

参考

MetaWeblog API中文说明
demo代码下载

自动化运维工具之ansible

一、什么样的情形需要批量部署

1、操作系统的安装

常见的有collber,red hat satelite(redhat)系统专用。

2、操作系统的配置

常见的有cfengine,puppet,chef,func。其中puppet最受欢迎

3、批量程序的部署

4、批量命令的运行查看状态信息

二、ansible介绍

ansible的架构大致如下

1

ansible是新出现的运维工具是基于Python研发的糅合了众多老牌运维工具的优点实现了批量操作系统配置、批量程序的部署、批量运行命令等功能。

  1. 运维工具常见的工作模式  
  2. 1、agent模式: 基于ssl实现。代理工作在被监控端。像puppet。  
  3. 2、agentless模式: 基于ssh服务实现工作在被监控端。监控端是ssh的客户端。 

ansible是工作在agentless模式下具有幂等性。ansible在控制端只需要告诉监控端的期望状态就可以实现批量部署。

  1. 名词解释  
  2. 幂等性不会重复执行相同的指令。例如不会重复安装软件  
  3. 期望状态只需要告诉被监控端的期望状态 

ansible是基于模块工作的ansible本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块ansible只是提供一种框架。架构包括

  • 连接插件connection plugins负责和被监控端实现通信。
  • Host Inventory:指定操作的主机,是一个配置文件里面定义监控的主机
  • 各种模块核心模块command模块自定义模块
  • 借助于插件完成记录日志邮件等功能
  • PlayBooks:剧本执行多个任务时。并非必需可以让节点一次性运行多个任务

三、ansible的基本使用

  1. 安装软件yum install ansible -y # 对应的软件在 epel 仓库中也可自己手动编译  
  2. #源码地址 https://pypi.python.org/packages/source/a/ansible/ansible-1.5.tar.gz 

2 

  1. 2、定义Host Inventory  
  2. # vim /etc/ansible/hosts  
  3. [webhosts]  
  4. 172.16.10.22 ansible_ssh_user=root ansible_ssh_pass=guoting 
  5. 172.16.10.33 ansible_ssh_user=root ansible_ssh_pass=guoting 
  6. 解释  
  7. #ansible_ssh_user=root 是ssh登陆用户  
  8. #ansible_ssh_pass=guoting 是ssh登陆密码3、测试各个模块  
  9. # 注意每个模块的用法可以使用 ansible-doc MOD 来查看例如ansible-doc copy  
  10.    
  11. ansible命令最常用的用法  
  12. ansible <Host-partten> -m MOE -a ‘MOD_ARV’所支持的模块可以使用ansible-doc -l来查看 

ansible示例

1、查看时间信息。command、shell模块

3

2、在控制端添加添加用户。user模块

4

3、实现ssh秘钥认证。shell、copy模块

6

此时就可以实现基于ssh秘钥通信了此时/etc/ansible/hosts可以修改如下

  1. ###### /etc/ansible/hosts  
  2. [webhosts]  
  3. 172.16.10.22  
  4. 172.16.10.33 

7

4、安装软件和启动服务。yum、service模块

8

9

5、支持管道的命令。raw模块,类似于shell模块

wKioL1QaeV6QK9YUAACu77PB1cY454.jpg

四、YAML语言介绍

1、YAML简介

  1. YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言包括XML、C语言、Python、Perl以及电子邮件格式RFC2822等。Clark Evans在2001年在首次发表了这种语言另外Ingy dtNet与Oren Ben-Kiki也是这语言的共同设计者。  
  2. YAML Ain’t Markup Language即YAML不是XML。不过在开发的这种语言时YAML的意思其实是”Yet Another Markup Language”仍是一种标记语言。其特性  
  3. YAML的可读性好  
  4. YAML和脚本语言的交互性好  
  5. YAML使用实现语言的数据类型  
  6. YAML有一个一致的信息模型  
  7. YAML易于实现  
  8. YAML可以基于流来处理  
  9. YAML表达能力强扩展性好  
  10.    
  11. 更多的内容及规范参见http://www.yaml.org。  
  12.    
  13. ##########################YAML语法  
  14.    
  15. YAML的语法和其他高阶语言类似并且可以简单表达清单、散列表、标量等数据结构。其结构Structure通过空格来展示序列Sequence里的项用”-“来代表  
  16. Map里的键值对用”:”分隔。YAML文件扩展名通常为.yaml或者.yml。下面是一个示例。  
  17.    
  18. name: John Smith  
  19. age: 41gender: Male  
  20. spouse:  
  21. name: Jane Smith  
  22. age: 37  
  23. gender: Female  
  24. children:  
  25. – name: Jimmy Smith  
  26. age: 17  
  27. gender: Male  
  28. – name: Jenny Smith  
  29. age 13  
  30. gender: Female  
  31.    
  32. YAML 2 个重要的结构组成部分list和directory  
  33. ################################# list  
  34.    
  35. 列表的所有元素均使用“-”打头例如  
  36. # A list of tasty fruits  
  37. – Apple  
  38. – Orange  
  39. – Strawberry  
  40. – Mango  
  41.    
  42. ##############################dictionary  
  43.    
  44. 字典通过key与valuef进行标识例如  
  45. —  
  46. # An employee record  
  47. name: Example Developer  
  48. job: Developer  
  49. skill: Elite  
  50.    
  51. 也可以将key:value放置于{}中进行表示例如  
  52. —  
  53. # An employee record  
  54. {name: Example Developer, job: Developer, skill: Elite}  
  55.    
  56. 多个映射关系组成一个字典一个列表可以包含多个字典。 

2、ymal中的变量

  1. ################################## 变量命名  
  2. 变量名仅能由字母、数字和下划线组成且只能以字母开头。  
  3.    
  4. ################################## facts  
  5. facts是由正在通信的远程目标主机发回的信息这些信息被保存在ansible变量中。要获取指定的远程主机所支持的所有facts可使用如下命令进行  
  6. # ansible hostname -m setup 这个命令可以获得被监控端主机的各种信息将这些信息得到后保存到变量中。  
  7.    
  8. ################################ 自定义变量  
  9. 在 yaml 中可以使用vars关键字来定义变量  
  10. vars:  
  11. var_name: value  
  12.    
  13. ############################# 变量的引用  
  14. {{ var_name }}  
  15.    
  16.    
  17. ########################### 特殊的变量迭代  
  18. 当有需要重复性执行的任务时可以使用迭代机制。其使用格式为将需要迭代的内容定义为item变量引用并通过with_items语句来指明迭代的元素列表即可。  
  19.    
  20. #######################################示例  
  21. 例如在被控端添加 2 个用户  
  22.    
  23. 方式1一般做法  
  24. – name: add user testuser1  
  25. user: name=testuser1 state=present groups=wheel 
  26. – name: add user testuser2  
  27. user: name=testuser2 state=present groups=wheel 
  28.    
  29. 方式2使用变量方式  
  30. – name: add several users  
  31. vars:  
  32. user1: testuser1  
  33. user2: testuser2  
  34. user: name={{ user1 }} state=present groups=wheel 
  35. user: name={{ user2 }} state=present groups=wheel 
  36.    
  37. 方式3使用迭代方式  
  38. – name: add several users  
  39. user: name={{ item }} state=present groups=wheel 
  40. with_items:   
  41. – testuser1   
  42. – testuser2  
  43. 事实上with_items中可以使用元素还可为hashes例如  
  44. – name: add several users  
  45. user: name={{ item.name }} state=present groups={{ item.groups }}  
  46. with_items:  
  47. – { name: ‘testuser1’, groups: ‘wheel’ }  
  48. – { name: ‘testuser2’, groups: ‘root’ } 

3、Inentory文件的格式

  1. inventory文件遵循INI文件风格中括号中的字符为组名。可以将同一个主机同时归并到多个不同的组中此外当如若目标主机使用了非默认的SSH端口还可以在主机名称之后使用冒号加端口号来标明。  
  2.    
  3. [webservers]  
  4. www1.magedu.com:2222  
  5. www2.magedu.com  
  6. [dbservers]  
  7. db1.magedu.com  
  8. db2.magedu.com  
  9. db3.magedu.com  
  10.    
  11. 如果主机名称遵循相似的命名模式还可以使用列表的方式标识各主机例如  
  12. [webservers]  
  13. www[01:50].example.com  
  14. [databases]  
  15. db-[a:f].example.com  
  16.    
  17. #################### 主机变量  
  18. 可以在inventory中定义主机时为其添加主机变量以便于在playbook中使用。例如  
  19. [webservers]  
  20. www1.magedu.com http_port=80 maxRequestsPerChild=808 
  21. www2.magedu.com http_port=303 maxRequestsPerChild=909 
  22.    
  23. ################### 组变量  
  24. 组变量是指赋予给指定组内所有主机上的在playbook中可用的变量。例如  
  25.    
  26. [webservers]  
  27. www1.magedu.com  
  28. www2.magedu.com  
  29.    
  30. [webservers:vars]  
  31. ntpntp_server=ntp.magedu.com  
  32. nfsnfs_server=nfs.magedu.com  
  33.    
  34. ################## 组嵌套  
  35. inventory中组还可以包含其它的组并且也可以向组中的主机指定变量。不过这些变量只能在ansible-playbook中使用而ansible不支持。例如  
  36.    
  37. [apache]  
  38. httpd1.magedu.com  
  39. httpd2.magedu.com  
  40.    
  41. [nginx]  
  42. ngx1.magedu.com  
  43. ngx2.magedu.com  
  44.    
  45. [webservers:children]  
  46. apache  
  47. nginx  
  48.    
  49. [webservers:vars]  
  50. ntpntp_server=ntp.magedu.com  
  51.    
  52. ######################### inventory参数  
  53.    
  54. ansible基于ssh连接inventory中指定的远程主机时还可以通过参数指定其交互方式常用的参数如下所示  
  55. ansible_ssh_host # 要连接的主机名  
  56. ansible_ssh_port # 端口号默认是22  
  57. ansible_ssh_user # ssh连接时默认使用的用户名  
  58. ansible_ssh_pass # ssh连接时的密码  
  59. ansible_sudo_pass # 使用sudo连接用户是的密码  
  60. ansible_ssh_private_key_file # 秘钥文件如果不想使用ssh-agent管理时可以使用此选项  
  61. ansible_shell_type # shell的类型默认sh  
  62. #########################################################################################  
  63. ansible的循环机制还有更多的高级功能具体请参见官方文档http://docs.ansible.com/playbooks_loops.html。 

4、playbooks

  1. playbook是由一个或多个“play”组成的列表。play的主要功能在于将事先归并为一组的主机装扮成事先通过ansible中的task定义好的角色。  
  2. 从根本上来讲所谓task无非是调用ansible的一个module。将多个play组织在一个playbook中即可以让它们联同起来按事先编排的机制同唱一台大戏。  
  3.    
  4. ###########################playbook基础组件  
  5. 1、Hosts和Users  
  6.    
  7. playbook中的每一个play的目的都是为了让某个或某些主机以某个指定的用户身份执行任务。  
  8. hosts用于指定要执行指定任务的主机其可以是一个或多个由冒号分隔主机组。  
  9. remote_user则用于指定远程主机上的执行任务的用户。  
  10.    
  11. 不过remote_user也可用于各task中。也可以通过指定其通过sudo的方式在远程主机上执行任务其可用于play全局或某任务。  
  12. 此外甚至可以在sudo时使用sudo_user指定sudo时切换的用户。  
  13.    
  14. – hosts: webnodes  
  15. remote_user: mageedu  
  16. tasks:  
  17. – name: test connection ping:  
  18. remote_user: mageedu sudo: yes  
  19.    
  20. 2、任务列表和action  
  21. play的主体部分是task list。task list中的各任务按次序逐个在hosts中指定的所有主机上执行即在所有主机上完成第一个任务后再开始第二个。  
  22. 在运行自下而下某playbook时如果中途发生错误所有已执行任务都将回滚因此在更正playbook后重新执行一次即可。  
  23. task的目的是使用指定的参数执行模块而在模块参数中可以使用变量。模块执行是幂等的这意味着多次执行是安全的因为其结果均一致。  
  24. 每个task都应该有其name用于playbook的执行结果输出建议其内容尽可能清晰地描述任务执行步骤。如果未提供name则action的结果将用于输出。  
  25.    
  26. 定义task的可以使用“action: module options”或“module: options”的格式推荐使用后者以实现向后兼容。  
  27. 如果action一行的内容过多也中使用在行首使用几个空白字符进行换行。  
  28.    
  29. tasks:  
  30. – name: make sure apache is running  
  31. service: name=httpd state=running 
  32.    
  33. 在众多模块中只有command和shell模块仅需要给定一个列表而无需使用“key=value”格式例如  
  34. tasks:  
  35. – name: disable selinux  
  36. command: /sbin/setenforce 0如果命令或脚本的退出码不为零可以使用如下方式替代  
  37. tasks:  
  38. – name: run this command and ignore the result  
  39. shell: /usr/bin/somecommand || /bin/true  
  40. 或者使用ignore_errors来忽略错误信息  
  41. tasks:  
  42. – name: run this command and ignore the result  
  43. shell: /usr/bin/somecommand  
  44. ignore_errors: True   
  45.    
  46. 3、handlers  
  47.    
  48. 用于当关注的资源发生变化时采取一定的操作。  
  49.    
  50. “notify”这个action可用于在每个play的最后被触发这样可以避免多次有改变发生时每次都执行指定的操作取而代之仅在所有的变化发生完成后一次性地执行指定操作。在notify中列出的操作称为handler也即notify中调用handler中定义的操作。  
  51.    
  52. – name: template configuration file  
  53. template: src=template.j2 dest=/etc/foo.conf  
  54. notify:  
  55. – restart memcached  
  56. – restart apache   
  57.    
  58. handler是task列表这些task与前述的task并没有本质上的不同。  
  59.    
  60. handlers:  
  61. – name: restart memcached  
  62. service: name=memcached state=restarted 
  63. – name: restart apache  
  64. service: name=apache state=restarted 

5、tags

  1. tags用于让用户选择运行或路过playbook中的部分代码。ansible具有幂等性因此会自动跳过没有变化的部分即便如此有些代码为测试其确实没有发生变化的时间依然会非常地长。此时如果确信其没有变化就可以通过tags跳过此些代码片断。  
  2.    
  3. 示例基于playbooks实现web服务的部署  
  4. 1、提供好Inventory文件  
  5. # /etc/ansible/hosts基于秘钥认证  
  6. [webhosts]  
  7. 172.16.10.22  
  8. 172.16.10.33  
  9.    
  10. 2、编辑 palybooks 剧本  
  11. # vim /root/web.yaml  
  12. – name: web service  
  13. remote_user: root  
  14. hosts: webhosts  
  15. vars:  
  16. packages: httpd  
  17. tasks:  
  18. – name: install httpd yum: name={{ packages }} state=present 
  19. tags: install  
  20. – name: configuration httpd  
  21. copy: src=/root/httpd.conf dest=/etc/httpd/conf/httpd.conf  
  22. tags: conf  
  23. notify:  
  24. – restart httpd  
  25. – name: service httpd start  
  26. service: name=httpd enabled=no state=started 
  27. tags: start  
  28. – name: add centos and hadoop user  
  29. user: name={{ item }} state=absent 
  30. tags: adduser  
  31. with_items:  
  32. – centos  
  33. – hadoop  
  34. handlers:  
  35. – name: restart httpd  
  36. service: name=httpd state=restarted 
  37.    
  38. 3、准备好配置文件  
  39. 将web的配置放到指定目录 src=/root/httpd.conf  
  40.    
  41. 4、开始部署  
  42. ansible-playbooks /root/web.yml 

结果示例

11

查看端口

12

此时如果配置文件发生变化

13

至此基本使用配置完成。

博文地址:http://guoting.blog.51cto.com/8886857/1553446

【干货】大众点评运维架构的图文详解

张冠宇在大众点评做运维架构师。他在本文中介绍大众点评整个的运维架构。目前他们的运维分为4个组,相信跟大部分公司一样,运维团队分为:应用运维、系统运维、运维开发和监控运维,当然还有DBA团队和安全团队。整个运维团队全算上目前是不到40人规模。

嘉宾介绍

张冠宇:花名关羽,目前在大众点评做运维架构师一职。在大众点评这几年时间,见证了点评运维从无到有,从低效向高效的转变过程。

分享内容

今天分享专题大纲如图所示,从5个方面跟大家一起探讨:

1、点评运维团队的配置

目前我们运维分为4个组,相信跟大部分公司一样,运维团队分为:应用运维、系统运维、运维开发和监控运维,当然还有DBA团队和安全团队,这里就不一一罗列了。整个运维团队全算上目前是不到40人规模。

我们团队分工是这样的:

  1. 应用运维:负责支持线上业务,各自会负责对应的业务线,主要职能是保证线上业务稳定性和同开发共同支撑对应业务,以及线上服务管理和持续优化。

  2. 运维开发:帮助运维提升工作效率,开发方便快捷的工具,实现运维平台化自动化。

  3. 系统运维:负责操作系统定制和优化,IDC管理和机器交付,以及跳板机和账号信息管理。

  4. 监控运维:负责发现故障,并第一时间通知相关人员,及时处理简单故障和启动降级方案等。

2、点评的整体架构

先看下点评的机房情况。

点评目前是双机房结构,A机房主跑线上业务,B机房跑测试环境和大数据处理作业,有hadoop集群、日志备份、灾备降级应用(在建)等。点评目前机房物理机+虚拟机有近万台机器。

点评的整体架构,还是跟多数换联网公司一样,采用多级分层模式,我们继续来详细看下点评整体架构。

上面这幅图基本概括了点评的整体架构环境:

  1. 用户引导层用的是第三方的智能DNS+CDN。

  2. 负载均衡首先是F5做的4层负载均衡 之后是dengine做的7层负载均衡(Dengine是在tengine基础上做了二次开发)。再往后是varnish做的页面缓存  之后请求到web端 web端通过内部协议调用service(RPC)。

  3. 图片存储用的是mogileFS分布式存储 。

  4. 所有业务,全部有高可用方案,应用全部是至少2台以上。

  5. 当然,具体业务要复杂很多,这里只是抽象出简单层面,方便各位同学理解。

目前,点评运维监控是从4个维度来做的:


  1. 业务层面,如团购业务每秒访问数,团购券每秒验券数,每分钟支付、创建订单等(cat)。

  2. 应用层面,每个应用的错误数,调用过程,访问的平均耗时,最大耗时,95线等(cat)。

  3. 系统资源层面:如cpu、内存、swap、磁盘、load、主进程存活等 (zabbix)。

  4. 网络层面: 如丢包、ping存活、流量、tcp连接数等(zabbix cat)。

3、点评运维系统介绍


点评的运维和平台架构组做了很多实用的工具,这些工具组成了点评的整体运维体系。

目前自动化运维比较热,但自动化运维个人觉得是一种指导思想,没必要硬造概念和生搬硬套。自动化在很多公司百花齐放,各家有各家的玩法。但不管怎么定义,运维人员都必须从不同纬度去面对和解决企业所存在的问题。

点评在这方面,也是摸着石头过河,我们的思路是先造零件,再整合,通过零件的打造和之间的整合,慢慢勾勒出一条适合自己的运维自动化框架。

我们运维的理念是:

  1. 能用程序干活的,坚决程序化、平台化;

  2. 能用管理解决的问题,不用技术解决;

  3. 同一个错误不能犯三次;

  4. 每次故障,都是学习和提升的机会;

  5. 每个人都要有产品化思维,做平台产品让开发走自助路线;

  6. 小的,单一的功能,组合起来完成复杂的操作(任务分解);

所以,我们将自己的理念,融入到自己的作品中,做出了很多工具。

首先整体做个说明,点评运维工具系统汇总:

  1. 全方位监控系统:覆盖业务、应用、网络、系统等方面,做到任何问题,都可直观反馈。对不同应用等级,做到不同监控策略和报警策略。

  2. 自动化工具系统:对重复的、容易出错的、繁琐的工作尽可能工具化,通过小的策略组合,完成大的任务。

  3. 自动化工具系统:对重复的、容易出错的、繁琐的工作尽可能工具化,通过小的策略组合,完成大的任务。

  4. 记录和分析系统:对发生的问题和数据做记录并分析,不断的总结、完善和提升。

下面就跟大家来一一介绍下:

3.1 全方位监控系统

Zabbix大家应该非常熟悉了,这里就不做介绍,主要介绍下cat监控。

a.  业务监控:


这张是cat的应用监控图表,可直观从业务角度看出问题,可跟基线的对比,发现问题所在。如图所示,此时支付远偏离基线,流量正常,可能后端出了问题。

除了这些,还有创建订单、支付、首页访问、手机访问等业务数据。

这张图是从业务角度来监控的。

这张也是从业务层面来监控的,该图展示的是手机的访问量趋势图,下面包括延迟、成功率、链接类型、运营商等都有明确数据,该监控可全方位覆盖业务。

b.  应用监控:

从业务层面往下,就是应用层面。

应用状态大盘可清晰表示当前业务组件状态,如果某个业务不可用,其下面某个应用大量报错,说明可能是该应用导致。

该监控大盘十分清晰明的能展示业务下面的应用状态,可在某业务或者某域名打不开的时候,第一时间找出源头。

下图为应用报错大盘,出问题的应用会实时登榜(每秒都会刷新数据),当出现大故障时,运维人员可一眼看出问题;而当多个不同业务同时报错时,则可能是公共基础服务出了问题。


再看下图的这个功能,是Cat最强大的功能,能完整显示应用之间调用过程,做了什么事情,请求了那些,用了多长时间,成功率是多少,访问量是多大,尽收眼底。 Cat几乎无死角的覆盖到业务和应用层面的监控,当然还可做网络等层面监控,总之非常强大。这也是点评的鹰眼系统。

c.  Logscan日志扫描工具:



Logscan系统,是一套日志扫描工具,可根据你定义的策略,对日志内容进行定时扫描,该工具可覆盖到基于日志内容的检测,结合zabbix和cat,实现无死角覆盖。 比如有一些攻击的请求,一直遍历你的url,通过cat、zabbix等都无法灵活捕获,有了日志扫描,便可轻松发现。


3.2 自动化工作系统

首先介绍下点评的流程系统-workflow系统

顾名思义workflow是一套流程系统,其核心思想是把线上所有的变更以标准化流程的方式,梳理出来。

我们遵循一个理念,能用程序跑,就不去人操作。

流程有不同状态的转化,分别为发起、审计、执行、验证等环节。用户可自行发起自己的需求变更,通过运维审核,操作(大部分是自动的),验证。 如扩容、上线、dump内存、封IP等都为自动化流程。

以我们线上自动化扩容流程为展示,用户使用时,需要填写对应信息,提交后,运维在后台审核过后,就完全自动化扩容,扩容完成会有邮件通知,全程运维不需要登录服务器操作。(自动化倒不是太复杂的技术难题,通过小的任务组合,设置好策略即可). 几十台机器的扩容,运维只需点个审核通过按钮,数分钟而已。




经过长时间的推广,点评现在98%以上变更都是通过工作流平台完成的,所有变更全部有记录,做到出问题时 有法可依,违法可纠。

而且通过流程单的使用频率,可做数据分析,了解哪些操作比较频繁,能否自动化掉,是否还有优化空间。 这才是做平台的意义,以用户为导向。


流程系统就介绍到这里,朋友们可关注下其中核心思想。

下面介绍另一套重量级核心系统:Button系统

Button是一套代码管理、打包、部署上线系统,开发可完全自主化进行上传代码,自动化测试,打包,预发,灰度上线,全部上线,问题回滚等操作。 全程运维不用干预,完全平台自主化。

点评的运维,除了有些没法自动化的手动配置下,其他基本都是开发自助。 这就是自动化的威力!

Go平台系统,是一套运维操作系统,其中包含了很多常规操作、如批量重启、降级、切换、上下线、状态检测等。

该系统主要是解决运维水平参差不齐,工具又各有各的用法,比如说批量重启操作,有用ssh、有用fabric、有自己写shell脚本的。 干脆直接统一,进行规范,定义出来操作,通过平台化进行标准化。 由于长时间不出问题,偶尔出一下,运维长时间不操作,找个批量重启脚本还要找半天。 哪些不能自动化的,我们基本都做到go里了,在这里基本都是一键式的傻瓜操作了。

现在,我们监控团队就可以灵活操作,不需要有多高的技术含量,并且每次操作都有记录,做好审计和授权。


所有后台基本都是python、shell脚本实现,小的脚本组再整合成任务,这也是我们的重要理念之一。 对于比较复杂的任务,我们进行分解,然后用小的,单一的功能,组合起来完成复杂的操作(任务分解)。 其实我们实现自动化也是这个思路,先造零件,再拼装。

尽管有了puppet,go等工具,但对于一些job作业的管理,也显得非常吃力,我们架构组的同学做出一套任务调度系统。相当于分布式的crontab,并且有强大的管理端。 完全自主化管理,只需要定义你需要跑的job,你的策略,就完全不用管了。会自动去做,并且状态汇报、监控、等等全部都有记录,并实现完全自助化。

以上这些系统都非常注重体验,都有非常详细的数据统计和分析,每过一段时间,都有人去看,不断改进和优化,真正做到产品自运营。还有一些自动化系统就不一一介绍了。

3.3 配置和管理系统

先介绍下puppet管理系统,相信不少同学对puppet语法格式深恶痛绝,并且也领教过一旦改错造成的故障严重性。

而且随着多人协同工作后,模板和文件命名千奇百怪,无法识别。

针对这些问题,点评就做了一套管理工具,主要是针对puppet语法进行解析,实现web化管理,并进行规范化约束。

跟go系统一样的想法,将puppet中模块进行组合,组合成模块集(方法集),可方便识别和灵活管理。


下面展示的是我们的软负载均衡管理页面,该系统是线上SLB的管理系统。 其核心在于把nginx语法通过xml进行解析,实现web化管理,傻瓜式配置,规范化配置,避免误操作,版本控制,故障回滚等。

点评系统很多,基本上遇到个痛点,都会有人想办法把痛点解决。

下面就介绍下点评另一套强大配置系统,lion。



Lion是一套应用配置管理系统,点评的所有应用用到的配置,不在本地文本文件存储,都在一个单独系统存储,存储以key/value的方式存储。并且也是完全平台化,运维负责做好权限控制和审计。开发全部自助。

其核心是用了zookeeper的管理机制,将配置信息保存在 Zookeeper 的某个目录节点中,然后将所有需要修改的应用机器监控配置信息的状态,一旦配置信息发生变化,每台应用机器就会收到 Zookeeper 的通知,然后从 Zookeeper 获取新的配置信息应用到系统中。

是不是在点评做运维轻松很多?各种操作都工具化,自助化,自动化了。那运维还需要做什么。

3.4 记录和分析系统

此类系统虽然不怎么起眼,但对我们帮助也是特别大的,我们通过一些系统的数据记录和分析,发现了不少问题,也解决不少潜在问题,更重要的是,在这个不断完善总结的过程中,学习到了很多东西。

这个是我们故障分析系统,所有的故障都会做记录,故障结束后都会case by case的进行深入分析和总结。其实以上很多系统,都是从这些记录中总结出来的。

该系统为故障记录系统,每个故障都有发生的缘由和改进的方案,定期有人review。

运维起来很轻松吗?也不轻松,只是工作重点有了转移,避开了那些重复繁琐的工作,和开发同学深度结合,共同注重运营质量和持续优化。

再来看下图所示是点评的DOM系统,即运营质量管理平台,该平台汇总了线上的服务器状态、应用响应质量、资源利用率、业务故障等全方位的数据汇总平台。


并通过同比和环比,以及平均指标等数据,让各开发团队进行平台化PK,性能差的运维会去推动改进。




最后一个需要介绍的是雷达系统,该系统是我们最近在做的,一个比较高大上的项目。

朋友们也感受到了,我们系统之多,出问题查起来也比较费时。 不少同学生产环节也遇到过类似问题,出了问题到底是什么鬼?到底哪一块引起的呢? 结合这个问题,我们把线上的问题做了个分类,并给了一些策略层面的算法,能快速显示。 可让故障有个上下文的联系,如:上线时间、请求数下降、错误数增多等,哪个先出现,哪个后出现? 当然,这块功能还在做,目标是实现 出问题的时候,一眼就能从雷达系统定位问题类型和范围。


以上向大家演示的就是点评的运维系统,相信我们点评的运维思想都在里面体现了。

运维点评这几年的发展,主要目标是实现平台规范化、运维高效化、开发自主化 。

之前也是通过运维root登录,然后写脚本批量跑命令的低效运维。也经历过CMDB系统信息不准确,上线信息错乱的尴尬局面。也遇到过出了很大问题,运维忙来忙去,找不到rootcase。

好在,通过努力,这些问题现在都有了很大改观,相信朋友们通过展示的系统,能感觉出点评运维的进步。

4、运维踩过的坑和改进的地方

我就这些年,点评运维出的一些case案例,跟大家聊一聊我们做了哪些具体工作:

  1. 变更不知道谁做的,无法恢复,变更完也找不到根据,造成重大故障。//之前线上puppet通过vim的管理方式,由于运维同学失误推了一个错误配置,导致全部业务不可用1个小时,我们后面通过规范puppet配置修改并做成工具,进行权限控制,还加了流程系统,进行避免。

  2. 出了问题,开发说代码没问题,运维说环境没问题,该找谁?//我们后面做了工具,通过DOM和cat系统,可进行深度诊断,基本很容易定位问题所属。

  3. 执行了个错误命令,全线都变更了,导致服务不可用。//我们通过go系统,进行日常操作梳理,并做成工具,运维90%操作都可通过自动化流程和go平台完成。大大缩减故障产生率,并且之后进行权限回收。

  4. 出问题了,各种系统翻来查去,无法快速定位,找不到rootcase。//点评正在做雷达系统,就是将历史存在的问题,进行复盘,将一些故障类型,进行分级,然后通过策略和算法,在雷达系统上进行扫描,出问题环节可快速第一时间优先显示。

  5. 运维天天忙成狗,还不出成绩,天天被开发吐槽。点评这两年完全扭转了局势,现在是运维吊打开发,因为我们目前,大部分系统都实现了开发自助化,运维被解放出来,开始不断完善平台和关注业务运营质量,我们dom系统是可定制的,运维每天都把各业务的核心指标报表发到各位老大那里,哪些服务质量差,响应慢,开发都会立即去改。(当然,需要老大们支持)。


5、未来关注的领域和方向

点评也有些前沿的关注点,比如比较热的Paas技术。

PaaS和云很热,还有docker技术,点评也不能掉队,目前点评有数千个docker的实例在跑线上的业务。


上图java都是跑的docker实例


目前点评Docker这块可做到10秒内快速部署业务并可响应用户请求。30秒内可完成一次实例无缝迁移。 个人感觉docker技术不在于底层这块,在于上层管理系统的构造。底层一方面是持续优化,挖掘性能,但更重要的是在策略层和调度层。 如何快速部署、迁移、恢复、降级、扩容等,做好这些还有不少挑战。

点评这两年成长很多,但需要走的路也很多,未来关注的点会在多系统的有机整合和新技术的尝试以及发展,还会更多的关注智能策略层面。

结束语

在最后结束时,感谢各位到场朋友捧场,也感谢点评运维和平台架构的每一位同事,有了你们,点评运维才走到了今天,我们共同努力,来创造新时代的运维体系。

点评很多系统都是第一次拿出跟大家分享,大家可看一下设计理念和思想。



如果您喜欢这篇文章,请记得点赞哦



Vim作者创造新编程语言Zimbu

<

div id=”content” contentScore=”466″>

开源文本编辑器Vim的作者Bram Moolenaar推出了新的编程语言Zimbu,一种不拐弯抹角直截了当的实验性编程语言。Moolenaar表示Zimbu集现有语言的优点于一身,同时避开它们的不足。Zimbu代码清晰易读,使用范围广泛——既能写OS kernel,又能写脚本,还能写大的GUI程序,可以编译和运行在几乎所漯div>

Ubuntu定时执行.sh脚本

Ubuntu中备份svn上传的代码,将备份的文件命名为svn_backup+当前时间.dump文件(例svn_backup20100525.dump)

1.编写脚本文件(backup.sh)

sudo touch backup.sh

创建脚本文件,并编辑文件

sudo vim backup.sh

上图为配置的文件内容,代码如下:

#!/bin/sh

sudo svnadmin dump /srv/svn/repos/works > /home/jordy/svn_back_up$(date + %Y%m%d).dump

echo success!

中间那句是将/srv/svn/repos/works 目录下的代码备份到/home/jordy/目录下,文件名为

svn_backup+当前时间.dump文件,最后一句只是提示备份成功,可以删掉。

使用命令

sh -x  backup.sh

测试脚本是否成功。   

上面脚本文件编写完成后,下面执行定时任务:

sudo vim /etc/crontab

如图

代码中的最后一行,其中:

是表示备份的时间,按照 m h dom mon dow 填写

emacs 一文入门

引言

一直是用vim的,之前虽然知道有emacs,也知道emacs和vim之争,印象中只有一句话:”vim是编辑器之神,emacs是神的编辑器。” 那会试了下emacs,不知道怎么关闭,直接强关的终端。 看了《黑客与画家》后,看作者对lisp的推崇,产生了点兴趣,百科了下。发现说法看得我晕了,当时放弃了。之后又看到本书 《程序员的呐喊》,一个google工程师写的。也是比较推荐lisp。然后各种搜索看大家的看法。兴趣又调了起来。于是开始学习, 发现教程都是以emacs开始的,于是也学习了emacs,折腾了一天一夜,终于觉得可以开始实际用起来了。于是开始写这个笔记了。

阅读一年成为emacs高手

安装emacs配置

犯了个错误,用了很久的vim,为了安装evil花了点时间,其实配置里面已经有了。 平时会写php,所以搞了个 php-mode, 但是系统函数的自动补没有弄好。 大师的配置

阅读了一下emacs的使用手册。C-h t即可看手册,C-x C-c关闭emacs。(C在mac上是control,windows是ctrl?),懒得看手册的可以参考Emacs入门系列:3分钟学会Emacs基本操作

实践准备

org-mode 阅读

为了编辑做准备。平时用的印象笔记和wordpress都可以用这个格式统一管理。同时 也可以管理自己的todo list.org简明使用教程

安装evernote-mode 平时都是用印象笔记管理

evernote-mode安装的有两篇文章可以参考。evernote-mode参考1 在emacs中使用evernote

一是一直安装不成功,报错,权限受限。后来终于发现是mac的sip机制。

找到篇文章解释了这个问题,怎么关闭sip。 不过我没有选择关闭,而是brew install了一个ruby, path环境变量指向了新安装的ruby。

还是报错,并且错误一闪而过。状态栏一直有其它插件的状态更新。

想起来C-x C-b 可以选报buffer,终于找到错误,原来是evernote-mode.el写死了路径,我因为ruby路径不一样, 按实际的修改就可以了。

然后还是报错,gem install gdbm, gem install ffi, brew install gdbm 才好

安装org2blog,发表wordpress

其它待研究的

多窗口编辑,buffer

w3m怎么玩

怎么收发邮件

怎么远程登陆,是否可以记住密码

宏怎么玩

怎么自定义插件。

后记

学习的方法只有一个,提需求,然后想办法满足自己的需求。 推荐书箱: Learning GNU emacs, 作者:Eric Raymond 计算机程序的构造和解释,作者:Julie Sussman, 程序员可以看下,说是里面用lisp做的示例。 lisp 语言,作者:陈光喜

 

vim文章收集

这个博主的文章可以学习下。vim常用的编辑功能。
http://blog.sina.com.cn/s/articlelist_1188742767_3_1.html

有人有汇总各种教程
http://www.iplaysoft.com/vim.html

无题
为什么vim使用hjkl做为方向健

为什么 Vim 使用 HJKL 键作为方向键

Vim使用笔记
http://www.cnblogs.com/jiqingwu/archive/2012/06/14/vim_notes.html

vim练级攻略

简明 Vim 练级攻略

打造成ide
http://blog.csdn.net/fbfsber008/article/details/7055842


自定义代码片段

Vim(2)

  1. vim常用功能

vim的常用功能,包括块的选择,复制,多文件的编辑,多窗口等功能。

  1. vim块选择

块选择是将文档中的一块可以选择复制,粘贴,不用整行的处理。
按下 v , V , Ctrl+v 时进入块选择。
在左下角出现

  • — VISUAL LINE —

v : 字符选择,光标经过的地方反白选择
V : 行选择,光标经过的整行反白选择
Ctrl+v : 块选择,长方形的方式选择
y :将选中的地方复制
d :将选中的地方删除

将 y 复制的数据,找到适当的位置按 p 进行粘贴。

  1. 多文件编辑

多文件编辑是vim一次打开多个文件,这些文件可以方便的复制,粘贴,否则用两个vim的话,只能用鼠标来复制,粘贴。
打开多个文件:

  • vim test1 test2

:n :编辑下个文件
:N : 编辑上个文件
:files : 列出这个vim打开的所有文件

  • $ vim test test1
  • :files
  • 1 %a= “test” line 1
  • 2 # “test1” line 2

  • 4yy #复制4行
  • :n #打开另一个文件
  • p #粘贴
  • :q! #退出

  • 多窗口

vim的多窗口展示非常方便的显示多个文件,两个窗口数据可以yy复制,粘贴。
:sp [filename] :打开新窗口,filename可以为空,为空打开当前文件
Ctrl+w+j :移动下方窗口,先按Ctrl+w放开,然后 j 或者↓键
Ctrl+w+k :移动上方窗口
Ctrl+w+q :退出文件,同 :q

5、列编辑模式
删除列
1.光标定位到要操作的地方。
2.CTRL+v 进入“可视 块”模式,选取这一列操作多少行。
3.d 删除。

插入列
插入操作的话知识稍有区别。例如我们在每一行前都插入”() “:
1.光标定位到要操作的地方。
2.CTRL+v 进入“可视 块”模式,选取这一列操作多少行。
3.SHIFT+i(I) 输入要插入的内容。
4.ESC 按两次,会在每行的选定的区域出现插入的内容。

vim(1)

【基础篇】
http://blog.csdn.net/yonggang7/article/details/38148075

  1. vim的模式

vim分为三种模式:一般模式,编辑模式,命令行模式。

  1. 一般模式

用vim打开一个文件就进入一般模式,在该模式可以删除字符和行,复制粘贴文件数据。

2.1 移动光标

h: ← 向左一个字符
j: ↓ 向下一个字符
k: ↑ 向上一个字符
l: → 向右一个字符
上面四个可与数字组合使用 10j, 向下10个字符, 20l:向右20个字符。
Ctrl + f 向下翻一页
Ctrl + b 向上一页
Ctrl + d 向下半页
Ctrl + u 向上半页
n+空格 如 5空格 向右移动5个字符
0 移动行首
$ 移动行末尾
H 移动到屏幕最上方第一个字符
M 移动到屏幕中间第一个字符
L 移动到屏幕最下方第一个字符
G 移动到文件末尾
nG n为数字,移动到第n行
gg 移动到文件开始
n+Enter n为数字, 向下移动n行

2.2 查找和替换

/word 向下查找word
?word 向上查找word
n 重复前一次查找
N 重复前一次查找,反向进行
:n1,n2s/word1/word2/g n1,n2为数字,从n1到n2行,将word1替换为word2
:1,$s/word1/word2/g 从第一行到最后一行,将word1替换为word2
:1,$s/word1/word2/gc 替换前确认confirm是否需要替换。

2.3 删除

x 向后删除一个字符
X [Backspace] 向前删除一个字符
nx n为数字,向后删除n个字符
dd 删除当前行
ndd n为数字,删除n行
d1G 删除光标所在到第一行
dG 删除光标所在到最后一行
d$ 删除光标所在到行末尾字符
d0 删除光标所在到行首字符

2.4 复制和粘贴

yy 复制当前行
nyy n为数字,复制向下的n行
y1G 复制从第一行到当前行
yG 复制当前行到最后一行
y0 复制从行首到光标之间的字符
y$ 复制光标所在到行尾之间的字符
p 粘贴到下一行
P 粘贴到上一行
J 将当前行和下一行合并成一行

u 还原上次操作, 复原
Ctrl+r 重做上一个操作, 重做
. 小数点,重复前一个操作

  1. 编辑模式

要编辑文字,按 i, a 等进入, 在左下角出现 INSERT 或 REPLACE 字符。
进入编辑模式命令:
i 光标所在处插入
I 当前行第一个非空字符出插入
a 光标下一个字符开始
A 所在行最后一个字符开始插入
o 下一行开始
O 上一行开始
r 替换光标所在字符,值执行一次
R 一直替换光标所在字符,直到Esc退出

[Esc] Ctrl+c 退出编辑模式,进入一般模式

  1. 命令行模式

在一般模式下,输入 : , /, ? ,三个中一个,光标会到最下面,输入写相应命令。
主要有文件保存,退出vim, 设置vim环境变量。
:w 保存文件
:w! 强制保存
:q 退出vim
:q! 退出不保存文件
:wq 退出并保存文件
ZZ 若文件没改动,退出不保存,若改动,退出并保存
:w filename 文件另存为filename
:r filename 读入另一个文件内容,并追加在光标下一行
:n1,n2 w filename n1,到n2 行保存到另一个文件
:! command 执行命令, 如 “:! ls -l” 列出当前目录文件

下面这篇vim语讲的好形象,推荐阅读。
http://www.jianshu.com/p/a361ce8c97bc#rd?sukey=fc78a68049a14bb23fe32c0df282f31736d7a0bae06c52ee32d3e10e74afb8e4a7ee7b7b416ed67b2d30df151dc90a05

大概介绍如下:
动词
d 表示删除(delete)
r 表示替换(replace)
c 表示修改(change)
y 表示复制(yank)
v 表示选取(visual select)

名语
w 表示一个单词(word)
s 表示一个句子(sentence)
p 表示一个段落(paragraph)
t 表示一个html标签(tag)

介词
i 表示“在…之内” (inside)
a 表示”环绕…”(around)
t 表示”到…位置前”(to)
f表示”到…位置上” (forward)

组词有名有:
1、动词 介词 名词

dip(delete inside paragraph 删除一个段落)
vis (visual select inside sentence 选择一个句子)
2、动词 介词/数词 名词

d2w (delete 2 word 删除两个单词)

3、数词 动词 名词

3dw ( 3 delete word 3次删除单词=删除3个单词)

【经验篇】
1、复制粘贴防止 自动缩进
方法有2
a、set fo-=r set noautoindent
粘贴完后,记得恢复
set fo=r set autoindent
b、set paste 完后,恢复用 set nopaste
http://www.cnblogs.com/end/archive/2012/06/01/2531147.html
可以备份下自己常用的配置。把习惯带着走。