自动化运维ansible

1,Ansible介绍

1.1,Ansible简介

ansible是新出现的开源的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。

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

(1)、connection plugins:连接插件,Ansible和Host通信使用,负责和被监控端实现通信;

(2)、host inventory:记录了每一个由Ansible管理的主机信息,信息包括ssh端口,root帐号密码,ip地址等等。可以通过file来加载,可以通过CMDB加载;指定操作的主机,是一个配置文件里面定义监控的主机;

(3)、各种模块核心模块、command模块、自定义模块;

Core Modules:Ansible执行任何管理任务都不是由Ansible自己完成,而是由核心模块完成;Ansible管理主机之前,先调用core Modules中的模块,然后指明管理Host Lnventory中的主机,就可以完成管理主机。

Custom Modules:自定义模块,完成Ansible核心模块无法完成的功能,此模块支持任何语言编写。

(4)、借助于插件完成记录日志邮件等功能;

(5)、playbooks:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。

(6)、Ansible:Ansible的核心程序

ansible的特点:

(一)批量管理工具

(二)模块

(三)python

(四)无终端,是基于ssh实现管理的

(五)也支持主从模式

(六)也支持playbook

Ansible的优点:

(1)部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作

(2)默认使用SSH协议 ,安全,无需安装客户端

(3)配置简单、功能强大、扩展性强

(4)支持API(应用程序接口)及自定义模块,可通过Python轻松扩展

(5)通过Playbooks来定制强大的配置、状态管理

(6)提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台(收费产品,一般很少用)

(7)幂等性:一种操作重复多次结果相同

1.2,ansible 任务执行

ansible 任务执行模式

Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhocplaybook

  • ad-hoc模式(点对点模式)
      使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。

  • playbook模式(剧本模式)
      是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。

ansible 执行流程

简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。

ansible 命令执行过程:

  1. 加载自己的配置文件,默认/etc/ansible/ansible.cfg
  2. 查找对应的主机配置文件,找到要执行的主机或者组;
  3. 加载自己对应的模块文件,如 command;
  4. 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
  5. 对应执行用户的家目录的.ansible/tmp/XXX/XXX.PY文件;
  6. 给文件 +x 执行权限;
  7. 执行并返回结果;
  8. 删除临时py文件,sleep 0退出;

1.3,ansible的安装

1、安装

yum install epel-release #需要安装epel源

yum install ansible -y

2、查看ansible的版本信息

ansible --version

3、查看ansible配置文件

[root@ren5 ~]# rpm -qc ansible

/etc/ansible/ansible.cfg

/etc/ansible/hosts

4、调用模块(python)

paramiko #模拟ssh协议批量管理主机

jinja2 #模板语言,主要用来传递变量

yaml #相当于是一种编程语言

5、控制方式:

(1)免密钥:key-gen

server: ssh-keygen

scp id_rsa.pub root@192.168.254.25:/root/.ssh/authorized_keys

(2)用户密码:

参数形式:ansible_ssh_user=root; ansible_ssh_pass=root ansible_ssh_port=22

host inventory:记录着客户端的ip信息

[root@ren5 ~]# vim /etc/ansible/hosts

在文件最后添加:

[test_ren1]

192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=0304 ansible_ssh_port=22

192.168.11.6 ansible_ssh_user=root ansible_ssh_pass=0304 ansible_ssh_port=22

注意:/root/.ssh/known_hosts需在此文件中有ssh连接的记录才可

或者取消/etc/ansible/ansible.cfg文件中#host_key_checking = False的注释

如果用了密钥登录,则密码登录无效;也就是说这两种方式无法混合使用

6、调用ansible的三种模式:

hoc:命令行

playbooks:剧本|脚本

roles:角色

1.4,Ansible使用基本格式

1、使用格式

[root@ren5 ~]# ansible

Usage: ansible [options]

2、参数:

-m:(–module-name=MODULE_NAME)指定模块名称

-a:(–args=MODULE_ARGS)指定模块的具体参数

-s:以sudo的方式运行操作

-i:(–inventory=INVENTORY)指定被管理节点的主机列表

-f:(–forks=FORKS)一批连接几个主机进行操作(默认是5个主机,最高255)控制并发数

​ 线程是最小的调度单位,进程是最小的管理单元

ansible-doc -l #查看所支持的模块

ansible-doc -s MODEL_NAME #模块的具体用法和参数

ansible all --list-hosts #查看所有主机

1.5,ansible管理节点的三种方法

1、指定主机组名

[root@ren5 ~]# ansible test_ren1 -a “ip a” #默认调用command模块

2、指定一个特定IP

[root@ren5 ~]# ansible 192.168.11.4 -a “ls”

3、使用all

[root@ren5 ~]# ansible all -a “date”

1.6,配置文件

ansible配置文件:(/etc/ansible/ansible.cfg)

14#inventory = /etc/ansible/hosts 主机管理资产清单

15#library = /usr/share/my_modules/ ansible操作的动作,无论是本地或者远程,都使用一小段代码来执行,这小段代码称之为模块,这个library就是用来存放这些模块的路径

16#module_utils = /usr/share/my_module_utils/

17#remote_tmp = ~/.ansible/tmp

18#local_tmp = ~/.ansible/tmp

20#forks = 5 ansible默认操作主机的并发数

21#poll_interval = 15

22#sudo_user = root 这是默认的执行命令的用户,也可以在playbook中重新设置这个参数

23#ask_sudo_pass = True 用来控制Ansible playbook 在执行sudo之前是否询问sudo密码.默认为no

24#ask_pass = True Ansible 剧本playbook 是否会自动默认弹出弹出密码.默认为no

25#transport = smart

26#remote_port = 22 这个指定连接被管理节点的端口,默认是22,除非设置了特殊的ssh端口

27#module_lang = C 默认模块和系统之间通信的计算机语言,默认为’C’语言

28#module_set_locale = False

61#host_key_checking = False 这是设置是否检查ssh秘钥,可以设置为False和True

103#timeout = 10 ssh连接超时时间

111#log_path = /var/log/ansible.log ansible默认是不记录日志的,如果想把ansible系统输出的日志存放到文件中可以开启这个选项

136#private_key_file = /path/to/file 使用ssh公钥私钥登录系统的时候,使用的秘钥路径

还有更多的配置项,大家可以参考官方文档,如下:官方文档

1.7,常用模块

1、ping模块:指定ansible server跟client的连通性,测试成功会返回“pong”

[root@ren5 ~]# ansible all -m ping

2、command模块:命令模块,默认模块,用于在远程执行命令(不支持正则和管道符)

[root@ren5 ~]# ansible test_ren1 -m command -a “date ‘+%F %T’”

3、cron模块:管理定时任务

state:(prsent:安装;absent:移除)

day、env、hour、job、minute、month、name、state、user、weekday

[root@ren5 ~]# ansible test_ren1 -m cron -a “minute=*/5 job=‘echo HELLO’ state=present name=cron_test1”

[root@ren5 ~]# ansible test_ren1 -a “crontab -l”

[root@ren5 ~]# ansible test_ren1 -a “crontab -r”

4、user模块:管理用户账户

name=:指明创建的用户的名字

remove=USERNAME(state=absent)

state=present #创建用户 shell=:指定用户shell类型

#ansible testhosts -m user -a ‘name=user1 uid=250 group=group250’

5、group模块:添加或者删除用户组

#ansible testhosts -m group -a ‘name=group250 gid=250’

6、copy模块:复制本地文件到远程主机

src=:定义本地源文件路径

dest=:定义远程目标文件路径

[root@ren5 ~]# ansible test_ren1 -m copy -a “src=/root/a.txt dest=/root/a.txt”

content=:取代src,表示直接用此处指定的信息生成为目标的内容

#ansible all -m copy -a ‘content=nihao dest=/root/a.txt’

7、service模块:管理程序服务,指定运行状态

[root@ren5 ~]# ansible all -m service -a “name=httpd state=restarted”

[root@ren5 ~]# ansible all -m shell -a “ss -tnl |grep 80”

enabled=:是否开机自动启动,取值为true或者false

name=:服务名称

state=:状态,取值有started,stopped,restarted

8、shell模块:和command模块类似,在远程主机上运行命令,支持变量等符号,尤其是在用到管道符等功能的复杂命令

[root@ren5 ~]# ansible all -m shell -a “ls /tmp |wc -l”

9、script模块:将本地脚本复制到远程主机并运行(无需加多余参数,只需要在-a后面加上本地脚本路径即可)

ansible testhosts -m script -a ‘/root/a.sh’

10、yum模块:安装程序包

[root@ren5 ~]# ansible all -m yum -a “name=httpd state=present”

[root@ren5 ~]# ansible all -m yum -a “list=httpd”

name=:指定要安装的程序包,可以带上版本号

state=:present,latest,installed表示安装,absent,removed表示卸载

list=:查看安装的程序包

11、setup模块:收集远程主机的facts

每个被管理的节点在接受并运行管理命令之前,会将自己主机相关信息,如操作系统版本,ip地址等报告给远程ansible主机

[root@ren5 ~]# ansible all -m setup

12、file模块:设置文件属性

[root@ren5 ~]# ansible all -m file -a “state=touch path=/root/test.txt”

2,playBooks

2.1,playbooks

如果用模块形式一般有幂等性,如果用shell或者command没有幂等性

playbooks相当于是shell脚本,可以把要执行的任务写到文件当中,一次执行,方便调用

tasks:一个task相当于是一个play

varibles:变量,一定定义,多处调用

template:模板,可以区分不同主机的特点

handlers:触发器,依赖于前一个任务,前一个任务如果执行改变,那么就会触发handlers

2.2,yaml介绍及格式

yaml是一个可读性高的用来表达资料序列的格式,yaml参考了其他多种语言,包括:xml,c语言,python,perl以及电子邮件格式RFC2822等,ClarkEvans在2001年在首次发表了这种语言。

特点:

(1)yaml的可读性好

(2)yaml和脚本语言的交互性好

(3)yaml使用实现语言的数据类型

(4)yaml有一个一致的信息模型

(5)yaml易于实现

(6)yaml可以基于流程来处理

(7)yaml表达能力强,扩展性好

编写说明:

(1)缩进:yaml 的缩进要求比较严格。一定不能使用tab键

(2)冒号:每个冒号后面一定要有一个空格

注意:1. 以冒号结尾不需要空格

​ 2. 表示文件路径的模版可以不需要空格

(3)短横线-:想要表示列表项,使用一个短横杠加一个空格。多个项使用同样的缩进级别作为同一个列表的一部分

注意:

1. 严格控制空格编写剧本的时候

2. 剧本编写不支持tab

书写规范注意点:

1、脚本名:***.yml 【不是.yml也行】

2、注释: “#”

3、tasks: (后不能加任何字符-可以加注释#)

4、- name: 一个 - name: 下不能有两条功能(行)

.每个-和:即冒号之后要有一个空格,task除外。

剧本格式:

— ### 剧本的开头,可以不写

- hosts: all <- 处理所有服务器,找到所有服务器; -(空格)hosts:(空格)all

tasks: <- 剧本所要干的事情; (空格)(空格)task:

- command: (空格)(空格)-(空格)模块名称:(空格)模块中对应的功能

测试剧本命令后面可以跟多个-v进行调试检查

常用命令:

1、对剧本语法检测

ansible-playbook --syntax-check /root/ansible/httpd.yaml

2、-C模拟执行剧本

ansible-playbook -C /root/ansible/httpd.yaml

3、执行剧本

ansible-playbook /root/ansible/httpd.yaml

3,roles介绍

3.1,roles介绍

什么情况下用到roles?

假如我们现在有3个被管理主机,第一个要配置成httpd,第二个要配置成php服务器,第三个要配置成MySQL服务器。我们如何来定义playbook?

第一个play用到第一个主机上,用来构建httpd,第二个play用到第二个主机上,用来构建php,第三个play用到第三个主机上,用来构建MySQL。这些个play定义在playbook中比较麻烦,将来也不利于模块化调用,不利于多次调。比如说后来又加进来一个主机,这个第4个主机既是httpd服务器,又是php服务器,我们只能写第4个play,上面写上安装httpd和php。这样playbook中的代码就重复了。

也就是说playbooks的所有的方式有个弊端—无法实现重复使用且代码重复;假设在同时部署httpd,php,mayql时或不同服务器组合不同的应用就需要写多个yaml文件。很难实现灵活的调用。

roles 用于层次性、结构化地组织playbook。roles 能够根据层次型结构自动装载变量文件、tasks以及handlers等。要使用roles只需要在playbook中使用include指令即可。简单来讲,roles就是通过分别将变量(vars)、文件(file)、任务(tasks)、模块(modules)及处理器(handlers)放置于单独的目录中,并可以便捷地include它们的一种机制。角色一般用于基于主机构建服务的场景中,但也可以是用于构建守护进程等场景中。roles的作用是减少代码的复写。

3.2,角色集合

角色集合:roles

phpserver

webserver

mysqlserver

files:存储由copy或script等模块调用的文件;src直接指定文件名称,不需要写绝对路径;

tasks:此目录中至少应该有一个名为main.yaml的文件,用于定义各task;其它的文件需要由main.yaml进行“包含”调用;

handlers:此目录中至少应该有一个名为main.yaml的文件,用于定义各handler;其它的文件需要由main.yaml进行“包含”调用;

vars:此目录中至少应该有一个名为main.yaml的文件,用于定义各variable;其它的文件需要由main.yaml进行“包含”调用;

templates:存储由template模块调用的模板文本;src只写文件名即可,不需要写绝对路径;

meta:此目录中至少应该有一个名为main.yaml的文件,定义当前角色的特殊设定及其依赖关系;其它的文件需要由main.yaml进行“包含”调用;

default:此目录中至少应该有一个名为main.yaml的文件,用于设定默认变量;

site.yaml:入站文件(站点文件),用于调用roles中的角色,一般创建在roles目录下,和角色同级;也可在roles同级目录下创建playbook执行文件(yaml)

3.3,角色定制实例

1、在roles目录下生成对应的目录结构

[root@ren6 ~]# mkdir -pv ansible/roles/{webserver,phpserver,mysqlserver}/{files,tasks,vars,templates,handlers}

[root@ren6 ansible]# tree

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接

2、配置角色(webserver)

(1)配置files文件:将httpd配置文件上传到files目录下(线配置一台主机)

[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/files/httpd.conf

(2)编写tasks任务列表

[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

- name: install httpdyum: name=httpd state=presentignore_errors: yes
- name: copy httpd.confcopy: src=httpd.conf dest=/etc/httpd/conf/httpd.conftags:- confnotify:- restart httpd
- name: start httpdservice: name=httpd state=started
- name: echo http_portshell: echo {{ http_port }} > /root/port.txt

(3)由于上面的tasks中定义了notify,所以要定义handlers

[root@ren6 ~]# vim ansible/roles/webserver/handlers/main.yaml

1 - name: restart httpd
2   service: name=httpd state=restarted

(4)tasks中定义了变量,需要在vars目录下创建main.yaml文件,并在文件中写入变量,以key: value的形式定义

[root@ren6 ~]# vim ansible/roles/webserver/vars/main.yaml

http_port: 88

(5)在roles下编辑站点文件site.yaml

[root@ren6 ~]# vim ansible/roles/site.yaml

1 ---
2 - hosts: 192.168.11.4
3   remote_user: root
4   roles:
5   - webserver

(6)语法检测及模拟运行

[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

[root@ren6 ~]# ansible-playbook -C ansible/roles/site.yaml

(7)使用模板文件templates ,复制httpd的配置文件至templates目录下

[root@ren6 ~]# cp /etc/httpd/conf/httpd.conf ansible/roles/webserver/templates/

(8)编辑templates文件

[root@ren6 ~]# vim ansible/roles/webserver/templates/httpd.conf

Listen {{ http_port }}

(9)修改tasks文件

[root@ren6 ~]# vim ansible/roles/webserver/tasks/main.yaml

- name: install httpdyum: name=httpd state=presentignore_errors: yes
- name: copy httpd.conftemplate: src=httpd.conf dest=/etc/httpd/conf/httpd.conftags:- conf_varsnotify:- restart httpd
- name: start httpdservice: name=httpd state=started

(10)修改站点文件

[root@ren6 ~]# vim ansible/roles/site.yaml

1 ---
2 - hosts: test1
3   remote_user: root
4   roles:
5   - webserver

(11)修改主机信息管理文件

[root@ren6 ~]# vim /etc/ansible/hosts

1 [test1]
2 192.168.11.5 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=81
3 192.168.11.4 ansible_ssh_user=root ansible_ssh_pass=root ansible_ssh_port=22 http_port=82

(12)语法检测及运行

[root@ren6 ~]# ansible-playbook --syntax-check ansible/roles/site.yaml

[root@ren6 ~]# ansible-playbook ansible/roles/site.yaml

PLAY [test1] *************************************************************************************************************************TASK [Gathering Facts] ***************************************************************************************************************
ok: [192.168.11.5]
ok: [192.168.11.4]TASK [webserver : install httpd] *****************************************************************************************************
ok: [192.168.11.5]
ok: [192.168.11.4]TASK [webserver : copy httpd.conf] ***************************************************************************************************
changed: [192.168.11.5]
changed: [192.168.11.4]TASK [webserver : start httpd] *******************************************************************************************************
changed: [192.168.11.4]
changed: [192.168.11.5]RUNNING HANDLER [webserver : restart httpd] ******************************************************************************************
changed: [192.168.11.4]
changed: [192.168.11.5]PLAY RECAP ***************************************************************************************************************************
192.168.11.4               : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0
192.168.11.5               : ok=5    changed=3    unreachable=0    failed=0    skipped=0    rescued=0    ignored=0

3.4,注意

1、在tasks文件下可以创建多个yaml文件,但roles只会调用main.yaml文件,所以可以用include关键字来调用其他yaml文件(- include_tasks: a.yaml)

2、roles目录下的角色名称可以随意起,不过,最好和其功能联系在一起

3、角色下的几个目录名称必须正确,s必须加上(files,tasks,vars,templates,handlers)

4、站点文件(site.yaml)内可以定义多个hosts,每个hosts下可以调用多个角色

AP ***************************************************************************************************************************
192.168.11.4 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
192.168.11.5 : ok=5 changed=3 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0


#### 3.4,注意1、在tasks文件下可以创建多个yaml文件,但roles只会调用main.yaml文件,所以可以用include关键字来调用其他yaml文件(- include_tasks: a.yaml)2、roles目录下的角色名称可以随意起,不过,最好和其功能联系在一起3、角色下的几个目录名称必须正确,s必须加上(files,tasks,vars,templates,handlers)4、站点文件(site.yaml)内可以定义多个hosts,每个hosts下可以调用多个角色

2021-7-28-自动化运维Ansible相关推荐

  1. 自动化运维—ansible

    2019独角兽企业重金招聘Python工程师标准>>> 自动化运维-ansible 一.Ansible介绍 Ansilbe是一个部署一群远程主机的工具.远程的主机可以是远程虚拟机或物 ...

  2. 自动化运维---ansible常用模块之文件操作(findreplace模块)

    自动化运维-ansible常用模块之文件操作(find&replace模块) 文章目录 自动化运维---ansible常用模块之文件操作(find&replace模块) 1.find模 ...

  3. linux自动化运维ansible

    linux自动化运维ansible 一.概述 二.安装 1.配置安装源 2.安装 3.查询版本信息 三.设置主机清单 1.添加ip及账号信息 2.修改主配置文件 3.测试是否成功 四.模块应用 1.模 ...

  4. 企业自动化运维ansible

    自动化运维工具ansible 运维自动化发展历程及技术应用 云计算工程师核心职能 Linux运维工程师职能划分 自动化动维应用场景 文件传输 命令执行 应用部署 配置管理 任务流编排 企业实际应用场景 ...

  5. 自动化运维-Ansible详解

    ansible 简介 ansible 是什么? ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet.chef.func.fabric)的优点,实现了批量系统 ...

  6. 自动化运维-Ansible 运维自动化 ( 配置管理工具 )

    当下有许多的运维自动化工具( 配置管理 ),例如:Ansible.SaltStack.Puppet.Fabric 等. Ansible 一种集成 IT 系统的配置管理.应用部署.执行特定任务的开源平台 ...

  7. 自动化运维-Ansible(redhat 8)

    在控制节点安装Ansible redhat 8自带python 3:如果没有安装,需要自行安装 查看是否安装python3 [root@localhost ~]# yum list installed ...

  8. 自动化运维-Ansible (第三部:Playbook 介绍)

    前言 之前有两篇文章分别讲了 Ansible 的部署.Ansible 的 模块使用,对 Ansible 有了最初的了解,这篇文章最主要是要介绍 Playbook. 需要了解 Ansible 的部署请点 ...

  9. 自动化运维: Ansible

    文章目录 为什么选择 Ansible Ansible 基本架构 Ansible 基本组成 Ansible 工作原理 Ansible 安装 主机清单 1. 简单的主机和组 2. 端口与别名 3. 指定主 ...

  10. ansible自动化运维从入门到精通

    ansible自动化运维 Ansible介绍 Ansible是一个同时管理多个远程主机的软件(任何可以通过SSH协议登录的机器),因此Ansible可以管理远程虚拟机.物理机,也可以是本地主机. An ...

最新文章

  1. Rendering Problems Exception raised during rendering:
  2. Ipad写代码真香,包邮送一个!
  3. java script valueof_Javascript new Date().valueOf()的作用与时间戳由来详解
  4. php检测网址是否有效,php 检测因特网址是否有效
  5. boost::mpi模块非阻塞点对点操作的测试
  6. 浅析Windows7的睡眠、休眠、混合睡眠、离开模式
  7. apachacxf项目使用@WebService报错
  8. 使用GUI工具Portainer.io管控Docker容器
  9. 千寻和省cors精度对比_测量员新手上路攻略:解析省CORS和千寻CORS账号区别及其如何选择运用...
  10. Android开发笔记(一百四十四)高仿支付宝的头部伸缩动画
  11. CVE-2021-2429:MySQL InnoDB Memcached 插件中的堆缓冲区溢出漏洞详解
  12. No_16_0224 Java基础学习第五天
  13. 计算机组成原理完整学习笔记(八):控制器设计
  14. 计算机组成原理 确定片选逻辑,唐朔飞 计算机组成原理习题答案.ppt
  15. adb最新版下载地址
  16. 03-平方矩阵的快速解法
  17. python+opencv制作电脑摄像头扫描二维码并自动打开
  18. java实现getch_Java中是否有C++中的getch()等效项? - java
  19. vue 美食杰项目 登录验证
  20. Python求两个或三个正整数的最大公约数和最小公倍数

热门文章

  1. python虚拟宠物猫
  2. python数据录入和分析_基于 Python 和 Pandas 的数据分析(3) --- 输入/输出 基础
  3. Oracle dmp文件结构探秘
  4. lzr 登机牌扫描access_lzr1.top
  5. GDB调试总结和实例
  6. 天呐?发现一个媲美 “百度” 的程序员网站
  7. 去除字符串中的特殊符号及表情
  8. fpga驱动rgb液晶屏_[转载]基于FPGA的VGA驱动显示
  9. 手动生成linux中Qt的moc文件,手动生成Qt的moc文件的方法
  10. 投影幕尺寸参数对照表