Jan 3
安装 && 介绍:http://blog.puppeter.com/read.php?7
github: https://github.com/puppeter/clip/tree/master/clip.0.02

新增功能:

clip ssh && clip scp && clip lt 支持ssh打通关系信任执行系统命令与同步文件;
clip ssh && clip scp && clip lt 支持多线程并发执行系统命令与同步文件;
clip ssh && clip scan 支持json格式返回执行命令结果;
clip scp && clip lt 支持rsync同步文件;
clip scp && clip lt 支持反向下载服务器文件;
修复程序bug && 优化功能;
clip version 增加版本功能。


Clip SDK使用
Clip SDK 功能用于获取Server上的IP关系,并在Client上重新组织编排IP关系。(注:目前clip也支持将IP存放到本地文件中管理)。目前Clip 提供8个子命令,以下Clip子命令的参数解释与演示(更多案例参考:Clip SDK 案例):
clip scan (用于对String对应的IP进行端口存活状态扫描)

--query_string(-q)# 根据String扫描IP的端口
--ip (-i) # 扫描指定IP的端口
--query_string (-q) *-test-*-*,*-docker-*-* # 多String扫描用逗号分隔
--append (-a) # 在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除String原有IP列表的IP
--limit(-l)# 扫描String中指定范围的IP范围
--port (-P) # 指定自定义扫描端口(注:默认为80端口)
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip
--json (-j) # 一次性输出json格式({ip:status} 其中0位成功,1为失败)

clip scan 使用演示:
扫描*-puppet-*-* 对应开放的端口
点击在新窗口中浏览此图片

clip cstring(正解与反解String对应IP关系)

--query_string(-q)# 解析String对应的IP列表
--ip (-i) # 解析IP对应的String
--query_string (-q) *-test-*-*,*-docker-*-* # 解析多个String对应IP列表,多String用逗号分隔
--limit(-l)# 解析String中指定范围的IP范围
--append (-a) #在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除String原有IP列表的IP
--join (-j) # 指定输出的格式,支持(“|” “,” “\n”,space) 4种格式输出
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip
--count (-c) # 统计输出IP个数
--dryrun (-d) # 输出调用接口用例

clip cstring演示:
解析*-qq-*-* 对应的IP关系。
点击在新窗口中浏览此图片
解析192.168.0.7 对应的String。
点击在新窗口中浏览此图片

clip ssh (远程命令执行工具)

--password (-p) # 密码 (如果打通了机器信任关系,密码字段请使用null)
--append (-a) # 在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除String原有IP列表的IP
--limit(-l)# 解析String中指定范围的IP范围
--port (-P) #指定自定义端口(注:默认为22端口)
--dryrun (-d) # 输出调用接口用例
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip
--worker (-w) 以worker形式并发启动(限200并发)
--json (-j) 一次性输出json格式

clip ssh演示:
查看string(sh-docker-base_v1-*) 对应机器上负载.
点击在新窗口中浏览此图片
查看string(sh-docker-base_v1-*)的第一台服务器对应负载
点击在新窗口中浏览此图片

clip scp (远程命令执行工具)

--password (-p) # 密码(如果打通了机器信任关系,密码字段请使用null)
--append (-a) #  在原有String基础上,追加IP,追加多个(192.168.0.1,192.168.0.2)IP用逗号分隔
--remove_ip (-r) # 删除cstring原有IP列表的IP
--limit(-l)# 解析String中指定范围的IP范围
--port (-P) # 指定自定义端口(注:默认为22端口)
--dryrun (-d) # 输出调用接口用例
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip
--worker  以worker形式并发启动(限200并发)
--json (-j) 一次性输出json格式
--rsync (-R) 通过rsync方式做增量文件传输
--download (-D) 反向从远程服务器下载文件



clip scp演示:
将ip文件推送到string(sh-docker-base_v1-*)对应机器的/tmp目录上。
点击在新窗口中浏览此图片

tree(String关系遍历工具)

--query_string(-p) # 密码
--json (-j) # 指定输出的格式
--dryrun (-d) # 输出调用接口用例
--log_disable(-o)# 默认日志会上报服务器,并通过history命令查看历史,通过此命令可以关闭日志上报,建议频繁使用clip关闭clip

clip tree 演示:
遍历*-*-*-* 下的节点
点击在新窗口中浏览此图片

import(IP关系导入工具)

--insert (-i) # 将文件内的clip对应关系导入数据库
--bulid (-b) # 创建clip导入数据库,关系模板文件
--list_struct (-l) # 显示clip数据库结构

clip import 演示:
clip import -b 创建导入string与关系模板
点击在新窗口中浏览此图片

lt(Local tools 本地获取IP关系管理工具)

--password (-p) # 密码
--append (-a) # 追加IP,多个IP用逗号分隔
--remove (-r) # # 删除原有IP列表的IP
--port (-P) # 指定自定义端口(注:默认为22端口)
--worker (-w)  #以worker形式并发启动(限200并发)
--json (-j)  #一次性输出json格式


clip import 演示:
clip lt 根据本地文件IP文件,进行远程ssh command,其中root@“本地IP关系文件名”
点击在新窗口中浏览此图片


Clip 使用案例
最近有同学发现在使用clip过程中不能远程执行awk命令。说一下这里的原因,因为clip最终是将命令通过ssh方式进行远程调用,这里涉及到特殊字符的转义。在使用clip ssh 时 命令部分建议用单引号('')引起,awk 命令通过双引号,另外注意awk中的($)符号是特殊字符需要转义,最终使用方式(clip ssh -p null root@*-qq-*-*  'ps -ef|grep ssh | awk "{print \$2}" ' )这样就可以方便的使用ssh执行远程awk命令了见截图。

未转义前
点击在新窗口中浏览此图片
转义后
点击在新窗口中浏览此图片

Dec 19
最近调研了一下开源的监控系统,最终选择了open-falcon。从以下列表可以了解到各监控系统都有他在特定场景下的优势,如果以时间进行分类可以了解到新起之秀譬如open-falcon和prometheus设计思路都很像。 但最终选择open-falcon的原因主要还是在当前笔者所在的场景下解决了一些痛点、譬如大量数据上报页面展示渲染速度很快、模块化开发、有丰富的插件和中文文档等。

点击在新窗口中浏览此图片

关于open-falcon的安装与使用文档见(http://book.open-falcon.org/zh_0_2/api/)
Nov 6
今天在一些机器上批量执行命令,将10多个ip追加到指定文件中(ip)通过以下shell方式来批量执行。


#!/bin/bash
while read line
do
         ssh $line "command"
done < ip


奇怪的是每次执行1行就退出。 网上google以下原因,while read 会从标准输入读取1行数据赋值给line变量,在while中循环嵌套ssh,ssh命令就会截取所有标准输入的数据这就导致read再次读数据时数据已经被ssh读取,line变量获取为空值最终导致循环结束。

解决方式:
1. ssh -n ,其中-n参数含义如下:
-n 把 stdin 重定向到 /dev/null (实际上防止从 stdin 读取数据). 在后台运行时一定会用到这个选项. 它的常用技巧是远程运行 X11 程序. 例如, ssh -n shadows.cs.hut.fi emacs 将会在 shadows.cs.hut.fi 上启动 emacs, 同时自动在加密通道中转发 X11 连接. 在后台运行. (但是如果 要求口令或密语, 这种方式就无法工作; 参见 -f 选项.)

2. ssh "command" < /dev/null
3. 或者循环时使用for
Sep 30
点击在新窗口中浏览此图片

点击在新窗口中浏览此图片
Aug 23
开篇

这篇文章是对之前几篇文章的一个续,主要介绍项目开发过程中发生的问题并以案例的方式介绍。

前两篇文章
Docker2.0 项目过程总结  http://blog.puppeter.com/read.php?52
Docker3.0 项目过程总结 http://blog.puppeter.com/read.php?56

你真的了解你的用户么?
一个项目能够成功需要看是否了解用户的真实的需求,但很多时候与用户沟通发现用户是不知道自己想要什么的,所以这里就要收集很多数据帮用户来排序与选择并最终给他一个选择题。以下是一个未了解用户真实需求的案例。
年中公司团建内部小鲜肉(kanesong)组织了一个泰国团,我个人是非常想去泰国的因为确实没有去过也很感兴趣泰国的美食,但从以往经历上看这团并不好组织所以也协助小鲜肉在拉人。 这里我提前设想了一下尽量的让泰国团能够真的筹集到人数成团的方法。
首先私下问了一些比较熟悉的朋友筹集首批用户而首批用户以女生为重点用户,因为女的多了男的才会有去的心思即便不去也可能会帮我们吆喝。人数很快筹到了13个人差2个人就可以成团了,但心里知道很多已经入团的人仍然处于犹豫期的未必会去,所以要了解大家真实的需求是什么好趁热打铁,我们收集了大家的想法与需求后经过汇总分类后如下:
1. 我想去泰国,但之前去过所以只想去指定的地点与路线,譬如芭提雅;
2. 我想去泰国,但是需要了解最终的团费是多少。而最终的团费和出团时间出团人数都是有关系的没有最终成团前这问题很难回答;
3. 我想去泰国,但只在6月中旬有时间;
4. 我想去泰国,去哪无所谓,主要是能吃到地道泰国美食,看到真正的泰国人妖;
5. 只要泰国能在短时间成团我就去;
6. 没说肯定去,也没说肯定不去。
从需求看上去真的是众口难调,但仔细思考问题也不大我想如果能满足这类人群中的大多数的需求那少数部分也就不成为问题了。我们边收集想法边推广,以以上需求的角度,以团内都是美女的角度,通过秘书与大家口口相传希望能筹集到最后的最少两个人,不过随着时间的渡过发现很多已经入团的同学没有了耐心已经有开始有退群的打算了,我都是先说等有新人进来再退但很无奈人就是凑不齐。 一天同组同学老司机(brinkmai)组织了一个休闲的广东省内团(http://blog.puppeter.com/read.php?59)开始我并不太看好,因为我觉得大家都是年轻人年轻的时候就应该能走多远就走多远多看一下外面的世界, 而吃惊的是两周后听说人数已经筹够达到出团的要求。 brinkmai也在邀请我来这团,其实我本想的是如果泰国不成团我就参加数据组同事组的台湾团,不过发现很多组内的同学都参与了,从更多与组内同学沟通的机会上看最终我还是选择了这个团,当我进入这团的RTX群后人数慢慢攀升到了30人这也给我了很大的触动,为什么泰国团组建就这么难而广东省内肇庆团就这样容易,分析后发现团内老员工占比比较多,大家主要还是借此机会能够得到充分的休息,所以用户最真是的需求是实惠休闲,当能聚类出这类用户的需求的情况下组织一个团成功率就会高很多,虽然不能满足每一位团友的需求但已经抓住了主体用户的需求组织起来也就没那么了。




Docker3.0的过去、现在和将来
开篇中提到的是一个生活的案例,可以看到在组团前我们是有意识通过历史经验来提升组团的成功概率的,工作中做项目也一样如何让做的项目能够成功? 这就需要考虑的维度更多一些。下面来介绍一下Docker3.0项目(Docker3.0是我们开发的一个内部系统版本代号)我主要通过时间维度来介绍一下此项目的过去、现在和将来,并介绍在每个环节中遇到的问题与思考。

“过去”
1. SNG运维场景;
2. 容器在场景下的需求分析。

1. SNG运维场景:
我个人觉得我们运维了业界最复杂的系统,复杂的原因产品线多、产品历史悠久譬如qq、qzone,腾讯成立于1998.11.11到2018.11.11日正好20周年,qq也从花季雨季步入小青年,qq和qzone是我们业务的主干为了不断满足用户的需求我们在主干上也不断迭代新的产品特性,但也有很多产品特性随着时间被主流的用户遗忘而变为了长尾业务,而这些业务都在我们的服务范畴内复杂程度可想而知。我们在运维这样复杂的系统同时也需要与时俱进不断跟上技术的革新,譬如Docker容器很火在公司内部其他BG如游戏王者荣耀都在应用,容器在技术上实现了弹性伸缩节约我们的成本也统一了“交付物”,在业务层面助力了王者荣耀的快速发展,所以我们有理由相信我们SNG也是可以用的。经过与同事的讨论与之前的运维经验,我们分析出玩容器在SNG可以分为4个场景,以下是4个场景的优缺点:
点击在新窗口中浏览此图片      

2. 容器在场景下的需求分析
容器应用场景已经分析出来了,如果站在我的角度出发,我可能先做离线再做在线业务与离线的混部,同时在开发系统过程中我们肯定会发现很多问题通过发现的问题在来迭代下一版本的需求,但主线依然是以上所提的SNG运维场景,所以假如我对SNG运维场景做一个排序的话,我的优先级排序是 1 3 2 4 这样做的方式优点是风险比较低相对容易出成果。但实际执行过程并没有想象的这样简单要综合很多人的意见权衡利弊,以下是前期与中期收集了大家的想法。
大老板: 我们要做容器、 不追求上量但能力一定要达到,希望我们做的不要比其他BG差;
中老板: 支持容器机器,底线是稳定与易用可推广,建议与织云体验融合可以无感知的推广与上量;
小老板: 系统一定要做出亮点。通过实现弹性伸缩,解决效率问题的同时也解决了我们成本问题。
经过各种权衡最终我们选择了在线业务的弹性伸缩(4)是四个场景中最难的一个场景,有时老板思路占比重会大一些。
确认应用场景后内部对开发形式又有一些争论:
开发同学1(t3): 建议使用lighthouse(内部开发系统代号),因为lxc(全称Linux Container)通过lighthouse管理对它做简单的改造就可以支持Docker的管理,无需重复照轮子。
开发同学2(t2): 是否使用lighthouse无所谓,但没有使用过python心里没底,希望开发同学1更多支持与帮助, 不过经过最终的权衡选择了重新开发。
我个人观点: 开发1与2的同学观点都对我们在做系统的时候要尽量避免的重复造轮子,但也要尊重每个人的选择让每个人在项目中得到收获与成长,而后者的权重通常要高于前者。

“现在”
时间到了年中,现状我们已经开发出了弹性扩容的系统灰度了很少一部分业务但并没有上量,从技术角度看此系统是成功的达到了预期效果,但从上量角度看还短期达不到还需要很多细节打磨。 一天坐公交偶遇一个老同事目前已经是一家创业公司的技术骨干,我们聊起了我做的Docker3.0项目,他其中一句话印象令我十分深刻,他说在腾讯内部开发的系统没有规模上量是有问题的。实际上从KPI角度看在年中没有上量也是有问题的,我复盘了一下整个过程个人总结有以下几点:

1. 缺少对用户需求的理解:
从“过去”这环节中大家可以看到我们前期分析了SNG的容器应用场景,在分析的过程中也与负责业务与开发天天打交道的业务运维进行了沟通分析了痛点这里要说一下强调一下“痛点“这词,在聊得过程中我个人感觉有时确实用户是不知道自己想要什么的,只能描述出业务特性比较复杂开发与运维“交付物”不明确等,如果可以通过镜像来实现开发与运维的“交付物”,通过容器来实现弹性伸缩是可以解决我们的效率问题降低运营的成本。而我们忽略了最真实的使用用户是开发,同时也没有一套简易的UI来描述开发后的用户体验而开始开工建设系统,最后导致系统建设出来但最终的使用用户反馈新系统学习成本比较高推动困难。 所以最开始如果我们做的是离线系统,通过此目标建设系统在后续做在线与离线系统混部的环节能给开发提前演示效果,有可能会比当前状态推动会更容易一些。

2. 没有遵循目标最小化原则:
其中目标最小化原则是以最小的代价来满足用户需求,再通过用户的反馈不断的迭代新的需求;以下这张截图很形象的说明了目标或产品最小化原则,这思路也是来自《精益创业》 一书中提出了“精益创业”(Lean Startup)的理念。

点击在新窗口中浏览此图片

而现状是(如截图no like this)确实初期定的目标有些高,短时间推动上量很多细节需要打磨,譬如页面的用户体验、对用户无感知和与旧运营系统融合等等。而目标较高在KPI的背景下短期没有过多收益会有很多流言蜚语影响大家的心态;

3. 没有推动上量的手段:
通常在内部开发的系统推动上量有几种方式:
1. 确实解决用户痛点,对整体(成本、质量、效率和安全)有明显受益;
2. 至高向下推,由leader或者更高职位的领导帮推动。 举个例子譬如安全,如果服务器不做安全加固短期可能没事,但万一出现安全漏洞服务器又没有加固就会导致数据泄露风险。而在没有安全漏洞的情况下,推动别人去做一些安全加固没有至高向下推是比较难推进的;
3. 通过其他手段譬如卡资源来推动本项目。 这里我们也没有做到,虽然我们组名叫计算资源组,但资源并不归我们负责用户上下线也不走计算资源组。2015年是节约成本年,很多产品业务快速发展拿不到资源,通过资源来卡业务是一个没有办法的办法,因为当时运营系统效率达不到弹性伸缩。但目前是17年业务手中不缺少资源,所以很难推动。
而目前1-3情况都不具备,没有一个很好的推动上量手段。

“将来”
0.  邮件记录每一个环节:
前期的需求分析、规划、里程碑、短期目标、中长期目标、参与人员和每次例会的内容都要记录邮件并定期输出,防止沟通不清楚和信息不对称导致项目出现的风险。

1. 不断的复盘与总结过程中发现的问题:
在“现在”这环节中,我们对项目的过往进行分析与总结,做项目还是要充分了解用户的需求,如果在用户说不清楚需求的情况下要拆分场景用产品最小化原则来建设系统,通过建设系统是否解决用户的痛点或是系统运营中的过程数据发现的细节问题来不断迭代下一版本,并在之前拆分的主线上慢慢前行同时还要不断的复盘过程中发现的问题并一一解决才做出一个好的系统。

2. 别迷信权威:
在项目开发很多思路来源于书本上的方法论,但书本上的知识方法论在项目过程中应用并落地还真不容易,所以不能不学这些方法论但又不能过于相信所有的方法论。

3. 尽量发现每个人的长处:
在项目过程中确实发现每个人性格是不一样的,所以在做项目的过程中根据性格特征每个人也有着自己的长处,有的同学不善于沟通但写代码很强,有的同学文档写的不错,有的同学推动能力很强,在做相同项目过程中发现每个人的长处可以让大家有成就感的同时推动最终项目的成功。



总结
本文标题是如何做一个项目,从本文第一个案例与第二个案例中看做的项目都不是十分的完美,大家看完可能觉得有些标题党的感觉所以这里介绍的并不是如何做一个成功的项目,而是在做项目过程中通过案例方式如如何将风险降到最低同时又能权衡利弊让大家受益最大化。当然在做项目过程中也有很多拿不准的东西以下留了一些过程中遇到的问题,如果是你应该如何应对也欢迎与我沟通讨论邮箱:8851970@qq.com 。 最后,引用爱迪生的一句话  "天才都是百分之九十九的汗水加百分之一的灵感。后面是那百分之一要比百分之九十九重要的多" 。

讨论的问题
0. 如果根据自己历史的项目经验觉得当前的方案是对的而老板又不这样认为应该怎么处理?
1. 项目开发过程中肯定会遇到很多细节的问题,当遇到细节问题争执不下时(在方案没有最终落地前,两方争执结论都是无懈可击的)这时找leader又两面为难不给最终建议,这时你应该怎么做?
2. 项目过程一但版本封板不准许增加需求,而产品为应对市场需求又怎需要增加一些需求导致版本期限延期,应该怎么处理?

分页: 3/11 第一页 上页 1 2 3 4 5 6 7 8 9 10 下页 最后页 [ 显示模式: 摘要 | 列表 ]