免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 94020 | 回复: 6

【话题讨论+送书福利】如何啃透Python自动运维工具Ansibel开源项目的源码? [复制链接]

论坛徽章:
169
申猴
日期:2013-10-09 10:10:16天秤座
日期:2013-10-10 15:28:08天蝎座
日期:2014-07-17 14:02:54丑牛
日期:2014-07-17 14:03:04处女座
日期:2014-07-17 14:03:12双子座
日期:2014-07-17 14:03:21天秤座
日期:2014-07-17 14:03:29酉鸡
日期:2014-07-17 14:03:39金牛座
日期:2014-07-21 10:37:54水瓶座
日期:2014-07-22 16:56:09巳蛇
日期:2014-07-23 11:48:03天蝎座
日期:2014-07-31 10:16:36
发表于 2021-11-18 15:02 |显示全部楼层
本期活动获奖名单,记得尽快站内短信联系 @飘絮絮絮丶(发帖子用了别的账号~)记得站内短信联系飘絮絮絮丶 重要事 多说一遍

renxiao2003   2楼      @renxiao2003
aloki     4楼                @aloki
seesea2517     5楼      @seesea2517





话题背景:

      Ansible是基于Python开发的一款优秀的自动化运维工具,它的简单易用性使其深受运维人员的喜爱。学习开源工具源码是掌握该工具的最有效途径,但是面对海量的源码内容,往往会让人无从下手。对对于大部分人而言,学习开源项目源码的一个好方法是从最初的源码版本开始,依次深入学习和跟踪源码的演进过程,这能帮助他们最大程度理解相应的核心源码。此外,从GitHub上的Bug记录也可以追踪源码的演进过程,这也是深入学习源码的一个方法。为了帮助读者掌握Ansible并展现Python项目源码案例,机械工业出版社近期出版了《吃透Ansible:核心源码剖析与项目实战》一书。该书以Ansible为例,给大家展现了一个探索开源项目内部源码的完整过程。本次活动便是以此为契机,和各位运维工程师、Python爱好者就学习开源项目源码的相关话题展开讨论,欢迎大家踊跃发言。

话题讨论:

(1)谈谈你所了解的Ansible源码极其内部模块的运行机制,以及使用Ansible时的依赖和限制。
(2)如何高效地学习一个开源项目的源码?
(3)相比C++和Go语言,阅读基于Python的开源项目源码有何优势?
(4)你有哪些给相关项目的开源社区提交Bug记录甚至贡献过代码的经历?
(5)如果你想成为社区的代码贡献者,你觉得需要从哪些方面着手?


本期奖品:

吃透Ansible:核心源码剖析与项目实战立体封.jpg


最佳积极参与经验分享奖5名,各奖励价值149元的《吃透Ansible:核心源码剖析与项目实战》图书1本。

参与方式:

直接在该主题下回帖即可。

图书购买:

京东:https://item.jd.com/12898815.html
当当:http://product.dangdang.com/29276646.html


图书试读:内容简介+前言+目录    1.1-1.4节(试读) 前言 目录.pdf (277.61 KB, 下载次数: 43)

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2021-11-18 16:09 |显示全部楼层
本帖最后由 renxiao2003 于 2021-12-15 17:04 编辑

(1)谈谈你所了解的Ansible源码极其内部模块的运行机制,以及使用Ansible时的依赖和限制。

ansible运行是不需要客户端的,其依赖底层通信系统软件,linux系统下基于openssh通信,windows系统下基于powershell,管理端必须是Linux系统,使用者认证通过后在管理节点通过ansible工具调用各应用模块将指令推送至管理端执行,并在执行完毕后自动删除产生的临时文件.ansible具体的工作机制官方有专栏介绍https://www.ansible.com/how-ansible-works,写的比较简单.
ansible的工作机制
如上图:根据ansible使用过程中的不同角色,我们将其分为:
使用者:
使用者来源多种维度:
CMDB(Configuration Management Database, 配置管理数据库),CMDB存储和管理着企业IT架构中的各项配置信息,是构建ITIL项目的核心工具,运维人员可组合CMDB和ansible,通过CMDB直接下发指令调用ansible工具集完成操作者下发任务
PUBLIC?PRIVATE方式,ansible除了丰富的内置模块外,同时提供丰富的API语言接口,如PHP,python,perl等多种语言,基于公有云/私有云,ansible以api调用的方式运行
用户直接使用ad-hoc临时命令集调用ansible工具集来完成任务执行
用户预先编写好ansible playbooks,通过执行playbooks中预先编排好的任务集按序完成任务执行.
ansible工具集
ansible命令是ansible的核心工具,ansible命令并非自身完成所有的功能集,其只是ansible执行任务的调用入口,可以理解为"指挥部",所有命令的执行通过其"下达指令"来完成.ansible主要模块如上图:inventory(目的管理终端的配置文件),api(供第三方程序调用的应用程序编程接口),modules(丰富的内置模块,ansible完成任务的大部分管理工作都是通过Modules里的模块来完成的),plugins(内置和可自定义的插件).
作用对象
ansible的作用对象,不仅仅是linux和非linux操作系统的主机(HOSTS),同样也可以作用于各类公有云/私有云,商业和非商业设备的网络设施.
ansible的工具集主要由以下部分组成
playbooks: 任务剧本,编排定义ansible任务集的配置文件,由ansible就顺序执行,通常是json格式的yml文件:当然你也可以通过自己写strategy来自定义任务集通过怎么顺序或者方式来运行
inventory: 管理主机清单
modules: ansible执行命令的功能模块,多数为内置 的核心模块,也可自定义
plugins:模块功能的补充,如连接类型插件,循环插件,变量插件,过滤插件等,
api: 供第三方程序调用的接口
ansible执行任务,这些组件相互调用关系如下图:
使用者使用ansible或ansible-playbook(会额外读取playbook文件)时,在服务器终端输入ansilbe的ad-hoc命令集或playbook后,ansible会遵循预先编排的规则将playbooks逐条拆解为play,再将play组织成ansible可识别的任务(task),随后调用任务涉及的所有模块(module)和插件(plugin),根据inventory中定义的主机列表通过ssh将任务集以临时文件或命令的形式传输到远程客户端执行并返回执行结果,如果临时文件则执行完毕后自动删除.
ansible通信发展史
ansible主推的卖点是其无需任何daemon维护进程即可实现相互间的通信,且通信方式是基于业内统一标准的安全可靠的ssh安全连接.同时因为ssh是每台linux主机系统必装的软件,所以ansible夫需在远程主机端安装任何额外进程,即可实现agentless(无客户端),进而助力其实现去中心化的思想.尽管稳定,快速,安全的ssh连接是ansible通信能力的核心,但ssh的连接效率一直被诟病,所以ansible的通信方式和效率在过去的数年中也在不停地改变和提高.基于以上认识,我们先来了解ansible ssh 的工作机制,再来回顾其发展史.
1)ansible ssh工作机制
ansible执行命令时,通过其底层传输连接模块,将一个或数个文件,或者定义一个play或command命令传输到远程服务器/tmp目录的临时文件,并在远程执行这些play/comman命令,然后删除这些临时文件,同时回传整体命令执行结果.这一系列操作在未来的ansible版本中会越来越简单,直接,同时快速,稳定,安全.通过了解其工作机制及其一直以来秉承的去中心化思想,我们可以总结,ansible是非c/s架构,自身没有client端,其主要特点如下:
无客户端,只需安装ssh,python即可,其中python建议版本为2.6.6以上.
基于openssh通信,底层基于ssh协议(windows基于powershell)
支持密码和ssh认证,因可通过系统账户密码认证或公私钥方式认证,所以整个过程简单,方便,安全.建议使用公私钥方式认证,因为密码认证方式的密码需明文写配置文件,虽然配置文件可加密,但会增加ansible使用的复杂度.
支持windows,但仅支持客户端,服务端必须是linux系统.
clear(简易): yaml语法,python语言编写,易于管理,api简单明了
fast(敏捷):快速学习,设置简单,无需任何第三方软件
complete(全面):配置管理,应用部署,任务编排等功能集于一身,丰富的内置模块满足日常功能所需
efficient(高效):没有额外软件包消耗系统性能
secure(安全):没有客户端,底层基于openssh,保证通信的安全可靠性
ansible通信方式发展历程
ansible底层基于安全可靠的ssh协议通信,但一直被人们诟病于效率,通信功能作为ansible最核心的功能之一,官方也一直在做改进.
1)paramiko通信模块
最初,ansible只使用paramiko实现底层通信功能,但是paramiko只是python语法的一个第三方库,发展速度远不及openssh.
在后续发布的新版本中,ansible仍断续兼容paramiko,甚至在诸如RHEL 5/6等不支持ControlPersist(只在openssh 5.6+版本中支持)的系统中封装其为默认通信模块.
2)openssh
从ansible 1.3版本开始,ansible默认使用openssh连接实现各服务器间通信,以支持ControlPersist(持续管理).ansible从0.5版本起即支持openssh功能,但直到1.3版本开始才将其设置为默认.
多数本地ssh配置参数,诸如Hosts,公私钥文件等是默认支持的,但如果希望通过非默认的22端口运行命令等操作则需要在inventory文件中配置ansible_ssh_port的值.openssh相比paramiko更快,更可靠.
3)加速模式
据官网介绍:开启加速模式后ansible通信速度 有质的提升,是开启ControlPersist后的ssh的2~6倍,是paramiko通信速度的10倍.
尽管加速模式对ad-hoc命令不友好,但是playbook通过加速模式会收到更高的性能.加速模式摒弃ssh多次连接的方式,通过ssh初始化后,带着AES key的初始化连接信息通过特定的端口(默认5099,但可配置)执行命令传输文件.使用加速模式唯一需要的额外包是python-keyczar,如此一来,几乎所有的常规模块openssh/paramiko均工作在加速模式,但如下使用sudo的情况:
        1. sudoers文件需要关闭其中的requiretty功能,注释掉或者设置每个用户的默认值为usrename !requiretty. sudoers的man文档说明如下.
         2. 开启加速模块必须事先设置sudo文件NOPASSWD配置,禁用sudo后的PASSWORD交互认证过程.加速模式相对openssh可以提供2~4倍的性能提升(尤其对于文件传输功能),在playbook的应用中可以通过增加配置开关来实现
其中的端口也可以在ansible.cfg中单独配置.
加速模式是现在已经被刻度的Fireball模式的进化版,类似于ansible加速通信方式,但需控制机事先安装ZeroMQ服务(这与ansible简单,无依赖,无Daemon的理念是相违背的),并且一点也不支持sudo操作.
4) Faster openssh in ansible 1.5+
       ansible 1.5+版本中的openssh有了非常大的改进,旧版本中实现方式是复制文件至远程服务器后运行,然后删除这些临时文件,而新版本的替代方案是通过openssh发送扫行命令,将所有操作附带在ssh连接过程中同步实现.该方式只在ansible 1.5+版本有效,且需在/etc/ansible/ansible.cfg的[ssh_connection]区域开启pipelining=True功能.
        关于加速模式我们还需要关注如下内容:
pipeling=True需结合sudo的requiretty配置方可生效,请确保/etc/sudoers的defaults requiretty为注释状态.绝大多数现有流行系统默认开启该选项.
在 Mac OSX,Ubuntu,Windows的Cygwin或其他流行OS最好选择5.6以上的openssh版本,这些版本对ControlPersist额更友好的支持.
如ansible运行的主机系统是RHEL或CentOS,然而希望升级当前openssh到最新版本以支持Faster/Persistent连接模式,可以通过yum update openssh升级最新版本.
(2)如何高效地学习一个开源项目的源码?

1.首先,查找和阅读该项目的博客和资料,通过google你能找到某个项目大体介绍的博客,快速阅读一下就能对项目的目的、功能、基本使用有个大概的了解。
2.阅读项目的文档,重点关注类似Getting started、Example之类的文档,从中学习如何下载、安装、甚至基本使用该项目所需要的知识。
3.如果该项目有提供现成的example工程,首先尝试按照开始文档的介绍运行example,如果运行顺利,那么恭喜你顺利开了个好头;如果遇到问题,首先尝试在项目的FAQ等文档里查找答案,再次,可以将问题(例如异常信息)当成关键词去搜索,查找相关的解决办法,你遇到了,别人一般也会遇到,热心的朋友会记录下解决的过程;最后,可以将问题提交到项目的邮件列表,请大家帮你看看。在没有成功运行example之前,不要尝试修改example。
4.运行了第一个example之后,尝试根据你的理解和需要修改example,测试高级功能等。
5. 在了解基本使用后,需要开始深入的了解该项目。例如项目的配置管理、高级功能以及最佳实践。通常一个运作良好的项目会提供一份从浅到深的用户指南,你并不 需要从头到尾阅读这份指南,根据时间和兴趣,特别是你自己任务的需要,重点阅读部分章节并做笔记(推荐evernote)。
6. 如果时间允许,尝试从源码构建该项目。通常开源项目都会提供一份构建指南,指导你如何搭建一个用于开发、调试和构建的环境。尝试构建一个版本。
7. 如果时间允许并且有兴趣,可以尝试阅读源码:
(1)阅读源码之前,查看该项目是否提供架构和设计文档,阅读这些文档可以了解该项目的大体设计和结构,读源码的时候不会无从下手。
(2)阅读源码之前,一定要能构建并运行该项目,有个直观感受。
(3)阅读源码的第一步是抓主干,尝试理清一次正常运行的代码调用路径,这可以通过debug来观察运行时的变量和行为。修改源码加入日志和打印可以帮助你更好的理解源码。
(4)适当画图来帮助你理解源码,在理清主干后,可以将整个流程画成一张流程图或者标准的UML图,帮助记忆和下一步的阅读。
(5)挑选感兴趣的“枝干”代码来阅读,比如你对网络通讯感兴趣,就阅读网络层的代码,深入到实现细节,如它用了什么库,采用了什么设计模式,为什么这样做等。如果可以,debug细节代码。
(6)阅读源码的时候,重视单元测试,尝试去运行单元测试,基本上一个好的单元测试会将该代码的功能和边界描述清楚。(7)在熟悉源码后,发现有可以改进的地方,有精力、有意愿可以向该项目的开发者提出改进的意见或者issue,甚至帮他修复和实现,参与该项目的发展。
8.通常在阅读文档和源码之后,你能对该项目有比较深入的了解了,但是该项目所在领域,你可能还想搜索相关的项目和资料,看看有没有其他的更好的项目或者解决方案。在广度和深度之间权衡。
以上是我个人的一些习惯,我自己也并没有完全按照这个来,但是按照这个顺序,基本上能让你比较高效地学习和使用某个开源项目。

(3)相比C++和Go语言,阅读基于Python的开源项目源码有何优势?

1. 简单 Python的语法非常优雅,甚至没有像其他语言的大括号,分号等特殊符号,代表了一种极简主义的设计思想。阅读Python程序像是在读英语。2. 易学 Python入手非常快,学习曲线非常低,可以直接通过命令行交互环境来学习Python编程。
3. 免费/开源 Python的所有内容都是免费开源的,这意味着你不需要花一分钱就可以免费使用Python,并且你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。4. 可以移植 由于Python是开源的,它已经被移植到了大多数平台下面,例如:Windows、MacOS、Linux、Andorid、iOS等等。
5. 解释性 大多数计算机编程语言都是编译型的,在运行之前需要将源码编译为操作系统可以执行的二进制格式(0110格式的),这样大型项目编译过程非常消耗时间,而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码运行程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。
6. 面向对象 Python既支持面向过程,又支持面向对象,这样编程就更加灵活。
7. 可扩展 Python除了使用Python本身编写外,还可以混合使用像C语言、Java语言等编写。
(4)你有哪些给相关项目的开源社区提交Bug记录甚至贡献过代码的经历?

曾经给阿里云的PolarDB数据库,基于PGAdmin(Python)做过管理插件开发(原生PGAdmin不支持PolarDB)。

(5)如果你想成为社区的代码贡献者,你觉得需要从哪些方面着手?

你要是真正想从事一方面,不要在那抱怨没有机会,你真正对那一方向感兴趣,你就去自己做,甚至成为那方面的开源项目的积极贡献者,你都不需要怎么证明自己,你再去找这方面的工作,业内也自然会认可你。你首先去做出一些成绩出来,不要在那抱怨没机会。
哪怕是写了一些很好的博客,拍了一些很好的视频,你真正有实力而且做出了一些东西,互联网不会埋没你的。
你真正对无人机,SLAM感兴趣,你就去做这方面的嘛,包括积极参与GAAS的建设。你一直坚持弄下去就好了。
而不是今天东弄一下这个明天弄一下那个,也没做说明项目,就看了下原理想面试胡弄下人,这样肯定是走不远的
你想弄异常检测就真正去深钻做出点成果出来,而不是看两篇论文,糊弄过关,为了简历上好写写项目,这样是不行的。
我觉得你不要在那抱怨没有机会,你很多时候就没有真正去深钻一个东西并且做出点成功出来。应该是让企业来找你而不是你找企业。你自己好好体会一下。你真正去在一个领域做出建设性成果。业内不会忽视你的存在的。
但你很多时候不是这么想的,你很多时候是想着怎么简历上写些好看的项目,怎么面试好些,尽想这些去了。你都没有真正去深钻一个项目。要从你找工作转变为工作找你。

论坛徽章:
0
发表于 2021-11-20 15:47 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
8
2017金鸡报晓
日期:2017-01-10 15:13:2915-16赛季CBA联赛之天津
日期:2019-06-20 14:25:4015-16赛季CBA联赛之天津
日期:2019-08-20 23:06:5319周年集字徽章-庆
日期:2019-08-27 13:24:4219周年集字徽章-19
日期:2019-09-06 18:55:5019周年集字徽章-年
日期:2019-09-06 18:55:5019周年集字徽章-周
日期:2019-09-20 17:18:2220周年集字徽章-CU
日期:2020-11-11 13:06:03
发表于 2021-11-21 17:46 |显示全部楼层
(1)谈谈你所了解的Ansible源码及其内部模块的运行机制,以及使用Ansible时的依赖和限制。
ansible运行是不需要客户端的,其依赖底层通信系统软件,linux系统下基于openssh通信,windows系统下基于powershell,管理端必须是Linux系统,使用者认证通过后在管理节点通过ansible工具调用各应用模块将指令推送至管理端执行,并在执行完毕后自动删除产生的临时文件。

(2)如何高效地学习一个开源项目的源码?
1.首先,查找和阅读该项目的博客和资料,通过google你能找到某个项目大体介绍的博客,快速阅读一下就能对项目的目的、功能、基本使用有个大概的了解。从全局的视角去了解整个项目,这有助于形成整体的知识结构,上来就从细微处硬啃,效率极低。
2.其次,不要只盯着数据结构和算法,事实上这两点在学习开源项目的时候并没有那么重要。阅读项目的文档,重点关注类似Getting started、Example之类的文档,从中学习如何下载、安装、甚至基本使用该项目所需要的知识。
3.采取“自顶向下”的学习方法,源码不是第一步,而是最后一步。不要一上来就去看源码,而是要基本掌握了功能、原理、关键设计之后再去看源码:看源码的主要目的是为了学习其代码的写作方式,以及关键技术的实现。
4.重点切入,有了你对项目的熟练使用,有了对项目设计思想的了解,有了对项目整体的认知,那么我们就可以开始带着问题细啃源码,去了解这个项目的重点的实现原理。
5.模仿实现:当掌握了项目的宏观结构 + 重点特性的实现原理后。就可以开始自己动手,尝试实现一个类似的简单小项目。这个项目不需要完整的重复造轮子,不需要完美的关注细节,只需要把我们所学到的结构应用其中,把关键特性模仿实现即可。这个过程有助于我们查漏补缺,在自己动手踩坑的过程当中,把学到知识融会贯通。


(3)相比C++和Go语言,阅读基于Python的开源项目源码有何优势?
1.简单:Python 是一种代表简单主义思想的语言。阅读一个良好的 Python 程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python 的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。
2.易学:就如同你即将看到的一样,Python 极其容易上手。前面已经提到了,Python 有极其简单的语法。
3.可移植性:由于它的开源本质,Python 已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有 Python 程序无需修改就可以在下述任何平台上面运行。
4.解释性:这一点需要一些解释。一个用编译性语言比如 C 或 C++ 写的程序可以从源文件(即 C 或 C++ 语言)转换到一个你的计算机使用的语言(二进制代码,即 0 和 1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接 / 转载器软件把你的程序从硬盘复制到内存中并且运行。而 Python 语言写的程序不需要编译成二进制代码。你可以直接从源代码 运行 程序。在计算机内部,Python 解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用 Python 更加简单。由于你只需要把你的 Python 程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的 Python 程序更加易于移植。


(4)你有哪些给相关项目的开源社区提交Bug记录甚至贡献过代码的经历?
暂时没有

(5)如果你想成为社区的代码贡献者,你觉得需要从哪些方面着手?
为开源项目做贡献并不一定意味着你必须为代码库做贡献。 你可以通过多种不同方式为开源做贡献,例如:
·你可以在项目文档中添加描述以详细说明某一点
·你可以针对特定的项目提供指南
·你可以添加示例来展示代码的工作原理
·你可以为项目编写教程
·你可以为项目添加翻译
·你可以回答有关项目的问题
·你可以对其他贡献者提供建议
·你可以修复错误并正确地安排项目的工作文件夹
所有包括但不限于这些方式都可以为开源项目做贡献。

论坛徽章:
93
2015年辞旧岁徽章
日期:2019-10-10 10:51:15CU大牛徽章
日期:2014-02-21 14:21:56CU十二周年纪念徽章
日期:2020-10-15 16:55:55CU大牛徽章
日期:2014-02-21 14:22:07羊年新春福章
日期:2019-10-10 10:51:39CU大牛徽章
日期:2019-10-10 10:55:38季节之章:春
日期:2020-10-15 16:57:40ChinaUnix元老
日期:2019-10-10 10:54:42季节之章:冬
日期:2019-10-10 10:57:17CU大牛徽章
日期:2014-02-21 14:22:52CU大牛徽章
日期:2014-03-13 10:40:30CU大牛徽章
日期:2014-02-21 14:23:15
发表于 2021-11-22 16:38 |显示全部楼层
ansible 很强大,运维利器,不过从来没想过研究它的源码,如果真要研究的话,我觉得根据自己使用的功能的熟悉程度来安排先后顺序可能比较有助于理解,毕竟功能熟悉的再去了解它的实现应该可以省一些理解上的门槛,你已经知道了这些代码里有哪些功能,那么只需要看作者怎么实现就可以了。
相比于C++,python 更集成,不用追究于一个功能的底层实现,看代码理解功能即可,而不用管实现,类比于吃个馒头,就是吃馒头就可以了,而不需要经过洗手、和面、揉面、发酵、蒸、吃这些步骤,这是阅读 python 代码的优势。

论坛徽章:
0
发表于 2021-11-25 17:21 |显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
59
2015七夕节徽章
日期:2015-08-24 11:17:25ChinaUnix专家徽章
日期:2015-07-20 09:19:30每周论坛发贴之星
日期:2015-07-20 09:19:42ChinaUnix元老
日期:2015-07-20 11:04:38荣誉版主
日期:2015-07-20 11:05:19巳蛇
日期:2015-07-20 11:05:26CU十二周年纪念徽章
日期:2015-07-20 11:05:27IT运维版块每日发帖之星
日期:2015-07-20 11:05:34操作系统版块每日发帖之星
日期:2015-07-20 11:05:36程序设计版块每日发帖之星
日期:2015-07-20 11:05:40数据库技术版块每日发帖之星
日期:2015-07-20 11:05:432015年辞旧岁徽章
日期:2015-07-20 11:05:44
发表于 2021-12-16 17:03 |显示全部楼层
要黄啊。基本上没人参加呢。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP