<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>DevOps技术分享 &#187; 其他</title>
	<atom:link href="http://www.showerlee.com/archives/category/others/feed" rel="self" type="application/rss+xml" />
	<link>http://www.showerlee.com</link>
	<description>与你共同学习运维开发</description>
	<lastBuildDate>Mon, 19 Oct 2020 05:51:41 +0000</lastBuildDate>
	<language>zh-CN</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.6</generator>
		<item>
		<title>CentOS7.4构建Docker swarm部署Jenkins Configuration as code</title>
		<link>http://www.showerlee.com/archives/2842</link>
		<comments>http://www.showerlee.com/archives/2842#comments</comments>
		<pubDate>Fri, 14 Jun 2019 14:01:23 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[DevTools]]></category>
		<category><![CDATA[Docker]]></category>
		<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=2842</guid>
		<description><![CDATA[话说如果把Jenkins作为一只可爱的宠物, 部署及配置Jenkins是一个及其复杂和头痛的过程，我们作为铲屎 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="font-size:14px;color:#337FE5;"><span style="font-size:14px;color:#000000;">话说如果把Jenkins作为一只可爱的宠物, 部署及配置Jenkins是一个及其复杂和头痛的过程，我们作为铲屎官需要给这只名叫Jenkins的爱宠从打生下起都要进行细心的呵护, 在Web UI给他装插件, 配slave节点, 配环境变量, 配CI工具, 配后台管理权限等等,说实话你不写个自动化shell或者ansible你都不好意思跟你同行打招呼.</span></span>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="font-size:14px;">不过作为我们DevOps, 不是所有语言都能拿得起放得下(自黑), 在写自动化脚本过程中势必要跟我们的Jenkins本家groovy脚本语言打交道, 这玩意可是直接能够调用Jenkins API的敲门砖, 但是前提你能玩得转他的API doc, 本铲屎官给Jenkins铲屎已经够意思了, 还让我去研究如果优雅的铲屎, 不留一丝痕迹?&nbsp;</span>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;font-size:12px;"><span style="font-family:Helvetica;background-color:#FFFFFF;font-size:14px;">这里多亏了Docker swam和</span><span style="font-family:Helvetica;background-color:#FFFFFF;font-size:14px;">JCasC</span><span style="font-size:14px;">, 他们组合起来就能把我们可爱的Jenkins小宠宠瞬间打回一只可以被随时替代的小牛, 我们可以不必一天在给Jenkins遛弯的过程, 怕他走丢啦, 怕他肚子吃坏啦, 怕他被人欺负了, 给他打一针JCasC, 扔进Docker Swarm牛圈, 瞬间变成一只可被随时打入冷宫的小牛,&nbsp;想怎么玩就怎么玩, 玩坏了分分钟扔掉并直接给他再克隆一只, 是不是很神奇?</span></span>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;font-size:14px;">闲话不多说, 其实宠物和牛对应的就是可变基础设施与不可变基础设施, 具体的基础设施我们可以拿vm与docker做比较.</span>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="font-family:Helvetica;background-color:#FFFFFF;color:#337FE5;font-size:14px;"><strong>可</strong></span><span style="font-family:Helvetica;background-color:#FFFFFF;color:#337FE5;font-size:14px;"><strong>变</strong></span><span style="font-family:Helvetica;background-color:#FFFFFF;color:#337FE5;font-size:14px;"><strong>基础设施vs不可变基础设施:</strong></span><strong><span style="color:#337FE5;"></span></strong>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<strong><span style="color:#337FE5;font-size:14px;">可</span></strong><strong><span style="color:#337FE5;font-size:14px;">变</span></strong><strong><span style="color:#337FE5;font-size:14px;">基础设施</span></strong><strong><span style="color:#337FE5;font-size:14px;">:&nbsp;</span></strong><strong><span style="color:#337FE5;font-size:14px;">服务器会不断更新和修改。使用此类基础架构的工程师和管理员可以通过SSH连接到他们的服务器，手动升级或降级软件包，逐个服务器地调整配置文件，以及将新代码直接部署到现有服务器上。换句话说，这些服务器是可变的; 它们可以在创建后进行更</span></strong><strong><span style="color:#337FE5;font-size:14px;">改。</span></strong>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<strong><span style="color:#337FE5;font-size:14px;">不可变基础设施:&nbsp;</span></strong><strong><span style="color:#337FE5;font-size:14px;">他们部署了服务器之后决不会被修改。如果需要以任何方式更新，修复或修改某些内容，则会根据具有相应更改的公共映像构建新服务器以替换旧服务器。经过验证后，它们就会投入使用，而旧的则会退役。</span></strong>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;font-size:14px;">比起传统的虚拟机基础环境, 使用docker本身就能让我们节省资源的同时快速构建我们的应用,&nbsp;他的持续集成、版本控制、可移植性、隔离性和安全性能够让我们摆脱传统的可变基础设施(宠物), 让我们不必去在对他创建后进行任何配置更改, 只需要把他当做牛一样, 所有的配置都在牛(镜像)使用前进行版本配置变更, 使用时直接扔到docker swarm, 做到召之即来挥之即去, 降低我们的运维成本.</span>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;font-size:12px;"><span style="font-size:14px;">这里的Jenkins CasC plugin对我们的Jenkins在不可变基础设施中又做了一次二次优化, 他让我们原本需要去在我们的自动化脚本内嵌入groovy语言变成了历史, 我们只需要按照插件的语法格式编写一个human readable的yaml文件并嵌入Jenkins docker启动, 他就能自动化帮我们完成</span><span style="font-family:Helvetica;background-color:#FFFFFF;font-size:14px;">装插件, 配slave节点, 配环境变量, 配CI工具, 配后台管理权限等工作, 真正做到快速版本迭代更新, 节省了我们大量版本更新时花费的人力物力.</span></span>
</p>
<p style="font-family:Helvetica;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;font-size:12px;"><br />
</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	OK, Let's rack and roll...
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<strong><span style="color:#337FE5;font-size:16px;">安装环境</span></strong>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	system: CentOS 7.4 x64
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	Docker:&nbsp;17.12.0-ce
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	Jenkins docker image:&nbsp;2.164.1
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	Docker manager node:&nbsp; 192.168.0.102
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">Docker worker1 node:&nbsp; &nbsp;192.168.0.102</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">Docker worker2 node:&nbsp; &nbsp;192.168.0.104</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;font-size:16px;"><strong>一. 系统环境配置</strong></span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">1.关闭iptables和selinux</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# su - root
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# systemctl stop firewalld
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="vertical-align:baseline;line-height:1.5;"># setenforce 0</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="vertical-align:baseline;line-height:1.5;"># vi /etc/sysconfig/selinux</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	修改
</p>
<pre class="prettyprint lang-bsh">SELINUX=disabled</pre>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="vertical-align:baseline;line-height:1.5;color:#337FE5;">2.在三台节点分别添加本地host DNS</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="vertical-align:baseline;line-height:1.5;"># vi /etc/hosts</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="vertical-align:baseline;line-height:1.5;"> </span>
</p>
<pre class="prettyprint lang-bsh">192.168.0.102  manage
192.168.0.103  worker1
192.168.0.104  worker2</pre>
<p><span style="color:#337FE5;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">3.更改对应系统主机名</span><br />
Manager:<br />
# hostnamectl set-hostname manager<br />
Worker1:<br />
# hostnamectl set-hostname worker1<br />
Worker2<br />
# hostnamectl set-hostname worker2</p>
<p>
	
</p>
<p>
	<strong><span style="color:#337FE5;font-size:16px;">二. 安装Docker Engine</span></strong>
</p>
<p>
	<span style="color:#337FE5;">1. 下载yum镜像源</span>
</p>
<p>
	#&nbsp;wget <a href="https://download.docker.com/linux/centos/docker-ce.repo" rel="nofollow">https://download.docker.com/linux/centos/docker-ce.repo</a> -O /etc/yum.repos.d/docker.repo
</p>
<p>
	<span id="__kindeditor_bookmark_start_36__" style="color:#337FE5;">2. 安装docker engine</span>
</p>
<p>
	<span># yum install docker-ce –y</span>
</p>
<p>
	<span style="color:#337FE5;">3.启动docker service&nbsp;</span>
</p>
<p>
	# systemctl start docker<br />
# systemctl enable docker
</p>
<p>
	<span style="color:#337FE5;">4.创建docker manager节点(manager)</span>
</p>
<p>
	#&nbsp;docker swarm init --advertise-addr 192.168.0.102
</p>
<pre class="prettyprint lang-bsh">Swarm initialized: current node (viwovkb0bk0kxlk98r78apopo) is now a manager.

To add a worker to this swarm, run the following command:

    docker swarm join --token SWMTKN-1-3793hvb71g0a6ubkgq8zgk9w99hlusajtmj5aqr3n2wrhzzf8z-    1s38lymnir13hhso1qxt5pqru 192.168.0.102:2377

To add a manager to this swarm, run 'docker swarm join-token manager' and follow the instructions.</pre>
<p><span style="color:#337FE5;">5.加入worker节点到manager节点(worker1, worker2)</span> </p>
<p>
	#&nbsp;docker swarm join --token SWMTKN-1-3793hvb71g0a6ubkgq8zgk9w99hlusajtmj5aqr3n2wrhzzf8z-1s38lymnir13hhso1qxt5pqru 192.168.0.102:2377
</p>
<p>
	<span style="color:#337FE5;">6.查看节点连接信息</span>
</p>
<p>
	# docker node ls
</p>
<pre class="prettyprint lang-bsh">ID                            HOSTNAME           STATUS              AVAILABILITY        MANAGER STATUS
viwovkb0bk0kxlk98r78apopo *   manager            Ready               Active              Leader
yf6nb2er69pydlp6drijdfmwd     worker1            Ready               Active              
yyavdslji7ovmw5fd3v7l62g8     worker2            Ready               Active         </pre>
<p><span style="color:#337FE5;">7.在docker swarm下创建http服务</span> </p>
<p>
	#&nbsp;docker service create -p 80:80 --name webservice --replicas 5 httpd
</p>
<pre class="prettyprint lang-bsh">ID                  NAME                IMAGE               NODE               DESIRED STATE       CURRENT STATE       ERROR           PORTS
xsa5wb0eg2ln        webservice.1        httpd:latest        manager            Running             Running about 10 minutes ago                                       
3sbscs7m9lnh        webservice.2        httpd:latest        worker2            Running             Running about 10 minutes ago                                      
yao2m5wi54kz        webservice.3        httpd:latest        worker2            Running             Running about 10 minutes ago                                 
dfg2mswa52sf        webservice.4        httpd:latest        worker1            Running             Running about 15 seconds ago                                 
kah1j5hs14as        webservice.5        httpd:latest        worker1            Running             Running about 15 seconds ago                                 </pre>
<p>
	8.测试http站点
</p>
<p>
	# curl 192.168.0.102
</p>
<pre class="prettyprint lang-html">It works...</pre>
<p>
	三.在docker swarm下构建Jenkins cluster with configuration as code
</p>
<p>
	详见作者的github仓库
</p>
<p>
	<a href="https://github.com/showerlee/docker-compose-with-JCasC">https://github.com/showerlee/docker-compose-with-JCasC</a>
</p>
<p>
	
</p>
<p>
	大功告成...
</p>
<p>
	</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/2842">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="CentOS7.4构建Docker swarm部署Jenkins Configuration as code" href="http://www.showerlee.com/archives/2842">http://www.showerlee.com/archives/2842</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/2842/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Kubernetes之python client连接k8s API cluster</title>
		<link>http://www.showerlee.com/archives/2804</link>
		<comments>http://www.showerlee.com/archives/2804#comments</comments>
		<pubDate>Tue, 23 Oct 2018 14:01:25 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[DevTools]]></category>
		<category><![CDATA[Kubernetes]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[k8s]]></category>
		<category><![CDATA[PYTHON]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=2804</guid>
		<description><![CDATA[大家在平时使用k8s可以说用到的最多的命令应该就是kubectl, 这个命令默认会在master上安装并与本地 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	大家在平时使用<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>可以说用到的最多的命令应该就是kubectl, 这个命令默认会在master上安装并与本地的<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a> API cluster绑定token认证, 实现日常<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>的数据交互. 不过问题在于, 如果我们需要远程调用<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a> API或者需要实现<a href="http://www.showerlee.com/archives/tag/k8s" title="查看k8s中的全部文章" class="tag_link">k8s</a>自动化集成, 仅靠每次远程ssh集成使用kubectl命令这种偷懒的办法是远远不够的.
</p>
<p>
	这里k8s官方给我们提供了两种比较主流的连接k8s API cluster的语言, 一种是GO, 另外一种就是我们DevOps比较主流的Python.
</p>
<p>
	今天这里我将给大家介绍如何使用python client扩展包去编写脚本并远程连接k8s API cluster.
</p>
<p>
	这样我们平时除了可以远程使用ssh+kubectl去与kubernetes进行命令行数据交互外, 同样可以在远程不依赖命令行直接连接k8s cluster API cluster, 与k8s进行python API交互, 方便我们后期利用python去对k8s进行自动化集成与二次开发.
</p>
<p>
	
</p>
<p>
	这里我们不多说, 直接进入我们的runbook配置环节:
</p>
<p>
	
</p>
<p>
	
</p>
<p>
	<span style="font-size:16px;color:#337FE5;"><strong>一.部署python client环境连接我们的k8s API cluster.</strong></span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">1.安装python3.6.5源及依赖包</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="vertical-align:baseline;line-height:1.5;"># yum install epel-release -y</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# yum groupinstall "Development tools" -y
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# yum install zlib-devel bzip2-devel openssl-devel ncurses-devel zx-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel -y
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">2.编译安装python3.6.5以及pip package manager</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# wget <a href="https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz" rel="nofollow">https://www.python.org/ftp/python/3.6.5/Python-3.6.5.tar.xz</a> --no-check-certificate
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# tar xf Python-3.6.5.tar.xz
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# cd Python-3.6.5
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# ./configure --prefix=/usr/local --with-ensurepip=install --enable-shared LDFLAGS="-Wl,-rpath /usr/local/lib"
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# make &amp;&amp; make altinstall
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">3.安装virtualenv</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	#&nbsp;pip3.6 install --upgrade pip
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	#&nbsp;pip3.6 install virtualenv
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;">4.配置加载virtualenv环境</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# <span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">virtualenv -p /usr/local/bin/python3 .py3env</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">#&nbsp;source .py3env/bin/activate</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p><span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#337FE5;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">5.安装kubernetes python client扩展包</span></span> </p>
<p>
	<span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"># pip install kubernetes</span></span>
</p>
<p>
	<span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><br />
</span></span>
</p>
<p>
	<span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><span style="color:#000000;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"><strong><span style="font-size:16px;color:#337FE5;">二.在k8s master获取API cluster URL与token</span></strong></span></span>
</p>
<p>
	<span style="color:#000000;">我们需要在创建python脚本前, 在k8s主机上创建一个admin权限的service account, 并获取其token 用来作为我们的脚本凭证.</span>
</p>
<p>
	<span style="color:#337FE5;">1.抓取Cluster URL地址</span>
</p>
<p>
	# APISERVER=$(kubectl config view --minify | grep server | cut -f 2- -d ":" | tr -d " ")
</p>
<p>
	# echo $APISERVER
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;">2.创建k8s admin-user</span>
</p>
<p>
	<span style="color:#000000;"># mkdir -p /kube/role</span>
</p>
<p>
	<span style="color:#000000;"># cd /kube/role</span>
</p>
<p>
	在kube-system下创建admin-user
</p>
<p>
	<span style="color:#000000;"># vi&nbsp;<span>CreateServiceAccount.yaml</span> </span>
</p>
<pre class="prettyprint">apiVersion: v1
kind: ServiceAccount
metadata:
  name: admin-user
  namespace: kube-system</pre>
<p>
	给admin-user赋予admin权限
</p>
<p># vi CreateServiceAccount.yaml</p>
<pre class="prettyprint">apiVersion: rbac.authorization.k8s.io/v1beta1
kind: ClusterRoleBinding
metadata:
  name: admin-user
roleRef:
  apiGroup: rbac.authorization.k8s.io
  kind: ClusterRole
  name: cluster-admin
subjects:
- kind: ServiceAccount
  name: admin-user
  namespace: kube-system</pre>
<p>#&nbsp;kubectl create -f CreateServiceAccount.yaml<br />
#&nbsp;kubectl create -f RoleBinding.yaml</p>
<p><span style="color:#337FE5;">3.获取admin-user token</span> </p>
<p>
	# Token=$(kubectl describe secret $(kubectl get secret -n kube-system | grep ^admin-user | awk '{print $1}') -n kube-system | grep -E '^token'| awk '{print $2}')
</p>
<p>
	# echo $Token
</p>
<p>
	<span style="color:#E53333;">最后将token与APISERVER地址返回内容复制到python client主机上, 供脚本使用.</span>
</p>
<p>
	
</p>
<p>
	<span style="font-size:16px;"><strong><span style="color:#337FE5;">三</span></strong><span style="color:#337FE5;"><strong>. 在python client主机上编写脚本</strong></span></span>
</p>
<p>
	<span style="color:#337FE5;">1. 创建目录结构</span>
</p>
<p>
	# mkdir -p /kube/auth
</p>
<p>
	# cd /kube/auth
</p>
<p>
	# touch token.txt
</p>
<p><span style="color:#337FE5;">2. 创建token.txt文件并将k8s主机上获取的Token字符串复制到该文件</span> </p>
<p>
	<span style="color:#E53333;">这里我们获取的token会引入到我们的脚本下, 作为bearer authorization的api key与远程k8s API建立认证连接.</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;">3. 编写python client脚本</span>
</p>
<p>
	# vi k8s_auth.py
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python


from kubernetes import client, config


def main():
    # Define the barer token we are going to use to authenticate.
    # See here to create the token:
    # <a href="https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/" rel="nofollow">https://kubernetes.io/docs/tasks/access-application-cluster/access-cluster/</a>

    with open('token.txt', 'r') as file:
        Token = file.read().strip('\n')

    APISERVER = 'https://10.110.16.14:6443'

    # Create a configuration object
    configuration = client.Configuration()

    # Specify the endpoint of your Kube cluster
    configuration.host = APISERVER

    # Security part.
    # In this simple example we are not going to verify the SSL certificate of
    # the remote cluster (for simplicity reason)
    configuration.verify_ssl = False

    # Nevertheless if you want to do it you can with these 2 parameters
    # configuration.verify_ssl=True
    # ssl_ca_cert is the filepath to the file that contains the certificate.
    # configuration.ssl_ca_cert="certificate"
    configuration.api_key = {"authorization": "Bearer " + Token}

    # configuration.api_key["authorization"] = "bearer " + Token
    # configuration.api_key_prefix['authorization'] = 'Bearer'
    # configuration.ssl_ca_cert = 'ca.crt'
    # Create a ApiClient with our config
    client.Configuration.set_default(configuration)

    # Do calls
    v1 = client.CoreV1Api()
    print("Listing pods with their IPs:")
    ret = v1.list_pod_for_all_namespaces(watch=False)
    for i in ret.items:
        print("%s\t%s\t%s" %
              (i.status.pod_ip, i.metadata.namespace, i.metadata.name))


if __name__ == '__main__':
    main()</pre>
<p>
	<span style="color:#E53333;">这个脚本通过抓取同目录的k8s token字符串, 以及我们之前获取到的api server地址,利用python kubernetes扩展模块连接我们的远程API, 最终实现打印我们k8s所有namespace下的所有pods.</span>
</p>
<p>
	<span style="color:#E53333;">实际效果与kubectl get pods --all-namespaces类似.</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;">4. 修改权限并执行</span>
</p>
<p>
	# chmod 755 k8s_auth.py
</p>
<p>
	# ./k8s_auth.py
</p>
<pre class="prettyprint lang-bsh">Listing pods with their IPs:
...
10.244.1.3	default	db
10.244.1.2	default	kubernetes-downwardapi-volume-example
10.244.1.245	default	nginx1-7-deployment-667547b6d8-c5nsr
10.244.1.239	default	nginx1-7-deployment-667547b6d8-mjxq4
10.244.1.247	default	nginx1-8-deployment-d46768cf9-888v8
10.244.1.242	default	nginx1-8-deployment-d46768cf9-fglq2
10.110.16.14	kube-system	etcd-kube-master
10.110.16.14	kube-system	kube-apiserver-kube-master
10.110.16.14	kube-system	kube-controller-manager-kube-master
10.244.1.241	kube-system	kube-dns-6f4fd4bdf-qsxrj
10.110.16.14	kube-system	kube-flannel-ds-5sdlg
10.110.16.15	kube-system	kube-flannel-ds-qctv4
10.110.16.14	kube-system	kube-proxy-5nscq
10.110.16.15	kube-system	kube-proxy-6g7jc
10.110.16.14	kube-system	kube-scheduler-kube-master
10.244.1.246	kube-system	kubernetes-dashboard-58f5cb49c-6dxgn
10.244.1.240	kube-system	tiller-deploy-cbb85d8dc-f6rsv
10.110.16.15	kube-system	traefik-ingress-lb-765c44656f-fkzxb
10.244.1.243	spinnaker	kubelive-create-bucket-wxlv4
10.244.1.244	spinnaker	kubelive-delete-jobs-zhn75</pre>
<p>这样我们就成功的编写完成python client脚本连接k8s API cluster, 将所有namespace下的pod的基本信息打印出来.</p>
<p>
	
</p>
<p>
	
</p>
<p>
	Finished...</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/2804">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Kubernetes之python client连接k8s API cluster" href="http://www.showerlee.com/archives/2804">http://www.showerlee.com/archives/2804</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/2804/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>[Python] 利用Beautiful Soup+Pandas+Pyqt5+Selenum进行python爬虫</title>
		<link>http://www.showerlee.com/archives/2109</link>
		<comments>http://www.showerlee.com/archives/2109#comments</comments>
		<pubDate>Thu, 07 Dec 2017 03:34:16 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[其他]]></category>
		<category><![CDATA[python3]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=2109</guid>
		<description><![CDATA[Beautiful Soup, pandas, pyqt5是一组非常方便的进行网络爬虫的python模块. B [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	Beautiful Soup, pandas, pyqt5是一组非常方便的进行网络爬虫的python模块.
</p>
<p>
	<span>Beautiful Soup主要从解析好的HTML源码中抓取我们所需要的关键内容</span>
</p>
<p>
	<span>Pandas与<span>Beautiful Soup类似, 不过它侧重去抓取源码中的表格信息</span></span>
</p>
<p>
	<span><span>pyqt5这里的作用是模拟浏览器去解析源码中的Javasript, 并最终抓取JS实际的返回值.</span></span>
</p>
<p>
	
</p>
<p>
	这里我在我的Flask env下创建了一个测试页面, 用这些模块进行一些简单的页面爬虫测试.
</p>
<p><a href="http://flask.showerlee.com/scrapingtest/" rel="nofollow">http://flask.showerlee.com/scrapingtest/</a></p>
<p>
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="font-size:16px;color:#337FE5;">安装环境</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	OS:&nbsp; &nbsp; &nbsp; &nbsp;Windows 7 x64&nbsp; &nbsp;<br />
Python:&nbsp; &nbsp;Python3.6.2<br />
Git Bash: Git-2.15.1.2-64-bit
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;font-size:16px;">一. 环境配置:</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;">1. 安装并运行Git bash</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;"><span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;">2. 安装并测试python版本</span><br />
</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;background-color:#FFFFFF;">
	<span style="color:#000000;"></span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;"><span style="color:#000000;">#</span><span style="color:#000000;">&nbsp;python -V</span></span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	<span style="color:#337FE5;"><span style="color:#000000;"> </span></span>
</p>
<pre class="prettyprint lang-py">Python 3.6.2</pre>
<p>
	
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;background-color:#FFFFFF;">
	3. 安装相关爬虫模块
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# python -m pip install beautifulsoup4&nbsp;lxml&nbsp;pandas&nbsp;html5lib&nbsp;<span>pyqt5&nbsp;selenum</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">二.&nbsp;</span><span style="color:#337FE5;font-size:16px;">Beautiful Soup演示</span>
</p>
<p style="font-family:Helvetica;font-size:13px;vertical-align:baseline;color:#111111;background-color:#FFFFFF;">
	# vi ~/scrap1.py
</p>
<p>
	<span style="color:#E53333;">Tip: 这里首先去调用io和sys模块是为了改变默认的标准输出为utf-8, 这么做是为了保证无论我们抓取的源页面是什么格式, 都不会在用BS解析时报</span><span style="color:#E53333;">UnicodeEncodeError.</span>
</p>
<pre class="prettyprint lang-py">import io
import sys
import bs4 as bs
import urllib.request

# 改变标准输出的默认编码为utf-8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')

# 获取该页面编码并解码成utf-8
sauce = urllib.request.urlopen(
&nbsp; &nbsp; 'http://flask.showerlee.com/scrapingtest/').read().decode('utf-8')

# 利用BS抓取页面源代码,并利用lxml规范格式
soup = bs.BeautifulSoup(sauce, 'lxml')

# 获取页面源代码
print(soup)

# 获取titile标签源代码
print(soup.title)

# 获取titile标签name
print(soup.title.name)

# 获取titile标签字符
print(soup.title.string)
print(soup.title.text)

# 获取第一个p标签源代码
print(soup.p)

# 获取p标签源代码
print(soup.find_all('p'))

# 获取p标签所有内容
for paragraph in soup.find_all('p'):
&nbsp; &nbsp; print(paragraph.text)

# 获取页面所有内容
print(soup.get_text())

# 获取a标签所有内容
for url in soup.find_all('a'):
&nbsp; &nbsp; print(url.text)

# 获取a标签所有href链接
for url in soup.find_all('a'):
&nbsp; &nbsp; print(url.get('href'))

# 获取nav标签源代码
nav = soup.nav
print(nav)

# 获取nav标签URL
for url in nav.find_all('a'):
&nbsp; &nbsp; print(url.get('href'))

# 获取body标签内容
body = soup.body
for paragraph in body.find_all('p'):
&nbsp; &nbsp; print(paragraph.text)

# 获取div标签下body下的内容
for div in soup.find_all('div', class_='body'):
&nbsp; &nbsp; print(div.text)

# 获取table标签源代码
table = soup.table
# table = soup.find('table')
print(table)

# 获取table每行内容
table_rows = table.find_all('tr')

for tr in table_rows:
&nbsp; &nbsp; td = tr.find_all('td')
&nbsp; &nbsp; row = [i.text for i in td]
&nbsp; &nbsp; print(row)
<div>
	
</div>
</pre>
<p>
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"># python scrap1.py</span>
</p>
<pre class="prettyprint lang-py">......</pre>
<p>
	<span style="color:#337FE5;font-size:16px;">三. Pandas</span><span style="color:#337FE5;font-size:16px;">演示</span>
</p>
<p>
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"># vi ~/scrap2.py</span>
</p>
<pre class="prettyprint lang-py">import pandas as pd

dfs = pd.read_html(
    'http://flask.showerlee.com/scrapingtest/', header=0)

for df in dfs:
    print(df)</pre>
<p>
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"># python scrap2.py</span>
</p>
<pre class="prettyprint lang-py">  Program Name  Internet Points    Kittens?
0       Python        932914021  Definitely
1       Pascal              532    Unlikely
2         Lisp             1522   Uncertain
3           D#               12    Possibly
4        Cobol                3         No.
5      Fortran            52124        Yes.
6      Haskell               24        lol.</pre>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">四. pyqt5</span><span style="color:#337FE5;font-size:16px;">演示</span>
</p>
<p>
	<span style="color:#000000;">这里我们首先不解析JS, 直接利用Beautiful Soup去抓取p标签下class=jstest的内容</span>
</p>
<p>
	# vi ~/scrap3.py
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">import io
import sys
import bs4 as bs
import urllib.request

# 改变标准输出的默认编码为utf-8
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')

# 获取该页面编码并解码成utf-8
sauce = urllib.request.urlopen(
    'http://flask.showerlee.com/scrapingtest/').read().decode('utf-8')

# 利用BS抓取页面源代码,并利用lxml规范格式
soup = bs.BeautifulSoup(sauce, 'lxml')

js_test = soup.find('p', class_='jstest')

print(js_test.text)</pre>
<p>
	
</p>
<p># python scrap3.py</p>
<pre class="prettyprint lang-py">No js loaded</pre>
<p><span style="color:#E53333;">可以看到实际抓取的为未被JS处理的标签内容</span> </p>
<p>
	
</p>
<p>
	
</p>
<p>
	这里利用pyqt5<span>去抓取p标签下class=jstest的内容</span>
</p>
<p>
	# vi ~/scrap4.py
</p>
<pre class="prettyprint lang-py">import bs4 as bs
import sys
from PyQt5.QtWebEngineWidgets import QWebEnginePage
from PyQt5.QtWidgets import QApplication
from PyQt5.QtCore import QUrl


class Page(QWebEnginePage):
    def __init__(self, url):
        self.app = QApplication(sys.argv)
        QWebEnginePage.__init__(self)
        self.html = ''
        self.loadFinished.connect(self._on_load_finished)
        self.load(QUrl(url))
        self.app.exec_()

    def _on_load_finished(self):
        self.html = self.toHtml(self.Callable)
        # print('Load finished')

    def Callable(self, html_str):
        self.html = html_str
        self.app.quit()


def main():
    page = Page('http://flask.showerlee.com/scrapingtest/')
    soup = bs.BeautifulSoup(page.html, 'html.parser')
    js_test = soup.find('p', class_='jstest')
    print(js_test.text)


if __name__ == '__main__':
    main()
</pre>
<p>
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"># python scrap4.py</span>
</p>
<p>
	<span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"> </span>
</p>
<pre class="prettyprint lang-py">js loaded successfully</pre>
<p>
	<span style="color:#E53333;">JS解析成功.</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;">四. selenum</span><span style="color:#337FE5;font-size:16px;">演示</span>
</p>
<p>
	首先我们需要从官网下载chrome driver, 并放到脚本同路径的driver目录里.
</p>
<p>
	
</p>
<p>
	这里需要查找匹配你当前chrome浏览器版本的driver版本. 这边我的chrome版本为62.0, 所以选择driver版本为2.35.
</p>
<p>
	
</p>
<p>
	# vi selenum.py
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">from selenium import webdriver
from selenium.common.exceptions import TimeoutException
from bs4 import BeautifulSoup
import time, sys, io

sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='utf8')

def scrape():

	chromedriver = r".\driver\chromedriver.exe"
	URL = "http://flask.showerlee.com/scrapingtest/"

	try:
		driver = webdriver.Chrome(chromedriver)
		driver.set_window_position(-10000, 0)
		driver.get(URL)
		time.sleep(10)
		result = driver.execute_script("return document.body.innerHTML").encode('utf-8')
	except TimeoutException as e:
		print(e)

	soup = BeautifulSoup(result, "lxml")

	print(soup)

	driver.close()

scrape()</pre>
<p><span style="color:#111111;font-family:Helvetica;font-size:13px;background-color:#FFFFFF;"># python selenum.py</span> </p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">...</pre>
<p>
	
</p>
<p>
	
</p>
<p>
	更多文档:
</p>
<p><a href="https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/" rel="nofollow">https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/</a></p>
<p><a href="http://pandas.pydata.org/pandas-docs/stable/" rel="nofollow">http://pandas.pydata.org/pandas-docs/stable/</a></p>
<p><a href="http://pyqt.sourceforge.net/Docs/PyQt5/" rel="nofollow">http://pyqt.sourceforge.net/Docs/PyQt5/</a></p>
<p><a href="https://sites.google.com/a/chromium.org/chromedriver/downloads" rel="nofollow">https://sites.google.com/a/chromium.org/chromedriver/downloads</a></p>
<p><a href="https://chromedriver.storage.googleapis.com/index.html" rel="nofollow">https://chromedriver.storage.googleapis.com/index.html</a></p>
<p>
	
</p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/2109">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] 利用Beautiful Soup+Pandas+Pyqt5+Selenum进行python爬虫" href="http://www.showerlee.com/archives/2109">http://www.showerlee.com/archives/2109</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/2109/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>使用Virtualenv隔离Ansible不同发行版</title>
		<link>http://www.showerlee.com/archives/1862</link>
		<comments>http://www.showerlee.com/archives/1862#comments</comments>
		<pubDate>Tue, 16 Feb 2016 08:56:40 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1862</guid>
		<description><![CDATA[在日常使用ansible的部署过程中, 由于我们常用的yum, apt包管理工具默认安装的ansible版本为 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	在日常使用ansible的部署过程中, 由于我们常用的yum, apt包管理工具默认安装的ansible版本为1.9, 在该版本应用一些新的ansible模块时下会遇到一些BUG.
</p>
<p>
	如何使我们在保留旧版本的同时, 使用最新发行版来Fix这个issue, 则是本文所要讨论的问题.
</p>
<p>
	因为ansible本身由python编写而成, 所以我们可以使用python下的virtualenv模块对我们所需的ansible发行版进行隔离安装, 这样既能保证我们原有的job还可以正常在stable version下safe running, 而且又不影响我们new job在新版本下适配新的模块.
</p>
<p>
	
</p>
<p>
	接下来我会使用virtualenv隔离安装ansible2.1, 并保留老版本ansible1.9.4
</p>
<p>
	详细配置步骤如下:
</p>
<p>
	
</p>
<p>
	安装环境:<br />
System: Centos 6.3 x64
</p>
<p>
	Python: 2.6.6
</p>
<p>
	Ansible: 1.9.4
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;"><strong>一.安装virtualenv</strong></span>
</p>
<p>
	<span style="color:#337FE5;">1.保证系统默认YUM源</span>
</p>
<p>
	<span style="color:#337FE5;">2.安装easy_install</span>
</p>
<p>
	# whoami
</p>
<pre class="prettyprint lang-bsh">root</pre>
<p>
	# yum install python-setuptools python-setuptools-devel
</p>
<p>
	<span style="line-height:1.5;color:#337FE5;">3.安装pip</span>
</p>
<p>
	<span style="line-height:1.5;"># easy_install pip</span>
</p>
<p>
	<span style="color:#337FE5;">4.安装virtualenv</span>
</p>
<p>
	#&nbsp;pip install virtualenv
</p>
<p>
	
</p>
<p>
	<span style="color:#337FE5;font-size:16px;"><strong>二.配置系统非root用户使用新版本ansible.</strong></span>
</p>
<p>
	<span style="color:#E53333;">Tip: 我们正常部署过程中建议使用一个普通用户来跑我们日常的ansible job</span>
</p>
<p>
	<span style="color:#337FE5;">1.创建用户</span>
</p>
<p>
	# useradd deploy
</p>
<p>
	<span style="color:#337FE5;">2.切换到该用户进行初始配置.</span>
</p>
<p>
	# su - deploy
</p>
<p>
	# virtualenv .virtualenv
</p>
<p>
	# cd .virtualenv
</p>
<p>
	# ls
</p>
<pre class="prettyprint lang-bsh">bin  include  lib  lib64  pip-selfcheck.json</pre>
<p><span style="color:#337FE5;">3.使用git下载ansible最新发行版.</span> </p>
<p>
	#&nbsp;git clone <a href="https://github.com/ansible/ansible.git" rel="nofollow">https://github.com/ansible/ansible.git</a>
</p>
<p>
	<span style="color:#337FE5;">4.进入virtualenv环境</span>
</p>
<p>
	$ source /home/deploy/.virtualenv/bin/activate
</p>
<pre class="prettyprint lang-bsh">(.virtualenv) [deploy@www .virtualenv]$ </pre>
<p><span style="color:#337FE5;">5.安装必要的ansible依赖包</span> </p>
<p>
	<span>#&nbsp;</span><span>pip install paramiko PyYAML jinja2</span>
</p>
<p>
	# cd ansible
</p>
<p>
	#&nbsp;git submodule update --init lib/ansible/modules/core
</p>
<p>
	#&nbsp;git submodule update --init lib/ansible/modules/extras
</p>
<p>
	<span style="line-height:1.5;color:#337FE5;">6. 加载ansible2.1</span>
</p>
<p>
	<span style="line-height:1.5;color:#337FE5;"><span style="color:#E53333;">Tip:&nbsp;</span><span style="color:#E53333;">env-setup 是 ansible 为 hacker 准备的一个脚本，用来设置一些ansible所需的环境变量</span></span>
</p>
<p>
	#&nbsp;. /home/deploy/.virtualenv/ansible/hacking/env-setup -q
</p>
<p>
	$ ansible --version
</p>
<pre class="prettyprint lang-bsh">ansible 2.1.0 (devel 6ddea3e915) last updated 2016/02/16 16:13:32 (GMT +800)
  lib/ansible/modules/core: (detached HEAD 8d126bd877) last updated 2016/02/16 16:19:09 (GMT +800)
  lib/ansible/modules/extras: (detached HEAD f6c5ed987f) last updated 2016/02/16 16:19:40 (GMT +800)
  config file = /etc/ansible/ansible.cfg
  configured module search path = Default w/o overrides</pre>
<p>
	<span style="color:#337FE5;">7. 退出virtualenv</span>
</p>
<p>
	(.virtualenv)&nbsp;#&nbsp;deactivate
</p>
<p>
	# exit
</p>
<p>
	# su - deploy
</p>
<p>
	#&nbsp;ansible --version
</p>
<pre class="prettyprint lang-bsh">ansible 1.9.4
  configured module search path = None</pre>
<p>
	
</p>
<p>
	<span style="color:#E53333;"><strong>配置完毕</strong></span>
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">Tip:</span>
</p>
<p>
	<span style="color:#E53333;">以后若想使用新版本ansible则直接执行下面两行命令即可.</span>
</p>
<p>
	<span style="color:#E53333;"># source /home/deploy/.virtualenv/bin/activate</span><span style="color:#E53333;"></span>
</p>
<p>
	<span style="color:#E53333;">#&nbsp;</span><span style="color:#E53333;">. /home/deploy/.virtualenv/ansible/hacking/env-setup -q</span>
</p>
<p>
	
</p>
<p>
	</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1862">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="使用Virtualenv隔离Ansible不同发行版" href="http://www.showerlee.com/archives/1862">http://www.showerlee.com/archives/1862</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1862/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>[Python] 调取MYSQL数据并插入到CSV文件</title>
		<link>http://www.showerlee.com/archives/1425</link>
		<comments>http://www.showerlee.com/archives/1425#comments</comments>
		<pubDate>Fri, 17 Apr 2015 06:35:12 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[PYTHON]]></category>
		<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1425</guid>
		<description><![CDATA[如何利用python脚本将远程数据库查询值,并将该值按照csv中"column A"对应关系整体插入到"col [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	如何利用python脚本将远程数据库查询值,并将该值按照csv中"column A"对应关系整体插入到"column B",最近handle了一个case,联想到python天生对数据处理较shell有明显的优势,最后尝试用脚本搞定这个看起来逻辑很简单,但又不简单的data processing.
</p>
<p>
	Target:
</p>
<p>
	column A 是DB内存储的若干Project name,需要通过查询数据库,获取这些project name在DB对应的Project key的具体值,并插入column A后保存.
</p>
<p>
	
</p>
<p>
	
</p>
<pre class="prettyprint lang-py">#!/usr/bin/env python
# encoding: utf-8

import MySQLdb
import csv
import sys

# Define csv list
Csv_content = []
Csv_content_edited = []

# Define project list
Project_names = []

# Define db list
Db_content = []

# Define the file that needs to be handled.
try:
	file_name = sys.argv[1]
	new_file_name = file_name.split('.')[0] + '_new.' + file_name.split('.')[1]
except IndexError:
	pass

def selectDB():
	# Open db connection
	db = MySQLdb.connect("test.com", "testuser", "testuser", "testdb")

	# Use cursor() fuction to get current db cursor
	cursor = db.cursor()

	Csv_content_edited = readContent(file_name)

	for c in range(1,len(Csv_content_edited)):
		Project_names.append(Csv_content_edited[c][0])

	Project_name_string = ",".join(['"' + p + '"' for p in Project_names])

	# SQL "SELECT" statement
	sql = 'select pname,pkey from project where pname in (%s)' %Project_name_string
	
	try:
		# Execute SQL
		cursor.execute(sql)
		# Obtain all the record list
		results = cursor.fetchall()

		for row in results:
			#lower_user_name = row[3]
			Db_content.append(row)

		return Db_content
	except:
		print "Error: unable to fecth data"

	# Close connection
	db.close()


def readContent(file_name):
	# Read the csv file,then put it into list.
	with open(file_name, 'r') as csvfile:
		csv_reader = csv.reader(csvfile, delimiter=',')
		for row in csv_reader:			 
			if row[0]:
				Csv_content.append(row)
	return Csv_content


def insert_col():
	Csv_content_edited = readContent(file_name)
	# Insert null value to each components of "Csv_content_edited" afterward.
	for i in range(0,len(Csv_content_edited)):
		Csv_content_edited[i].insert(1,'')

	# Define the second inserted column title.
	Csv_content_edited[0][1] = "Pkey"
	# Grab the users data from db.
	Db_content = selectDB()
	# print Db_content
	
	for d in range(0,len(Db_content)):
		Pkey = Db_content[d][1]
		Pname = Db_content[d][0]
		for c in range(0,len(Csv_content_edited)):  
			if Csv_content_edited[c][0] == Pname:
				Csv_content_edited[c][1] = Pkey
	# print Csv_content_edited

	pname_list = []
	Csv_content_edited_new = []
	
	for c in range(0,len(Csv_content_edited)):
		if not Csv_content_edited[c][0] in pname_list:
			pname_list.append(Csv_content_edited[c][0])
			Csv_content_edited_new.append(Csv_content_edited[c])
	# print Csv_content_edited_new
	
	return Csv_content_edited_new



# Write the csv file. 
def writeContent():
	with open(new_file_name,'wb') as csvfile:
		csv_writer = csv.writer(csvfile)
		csv_writer.writerows(insert_col())


# Execute the finnal function.	
if __name__ == '__main__':
	try:
		writeContent()
	except (IOError,NameError,IndexError):
		print "Please type the correct file name. e.g: '" + sys.argv[0] + " testfile.csv'"
	else:
		print 'The result file is: %s' %new_file_name

</pre>
<p>Result:</p>
<p>
	
</p>
<p>
	Before the change:
</p>
<p>
	
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-2.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-2.png" alt="QQ20150417-2" width="133" height="93" class="alignnone size-full wp-image-1427" /></a>
</p>
<p>
	after the change:
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-1.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2015/04/QQ20150417-1.png" alt="QQ20150417-1" width="132" height="90" class="alignnone size-full wp-image-1426" /></a>
</p>
<p>
	
</p>
<p>
	</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1425">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="[Python] 调取MYSQL数据并插入到CSV文件" href="http://www.showerlee.com/archives/1425">http://www.showerlee.com/archives/1425</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1425/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>让Mac OS X的终端多姿多彩(转)</title>
		<link>http://www.showerlee.com/archives/1407</link>
		<comments>http://www.showerlee.com/archives/1407#comments</comments>
		<pubDate>Fri, 24 Oct 2014 03:14:32 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[MAC]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1407</guid>
		<description><![CDATA[与Linux相比，Mac OS X的终端总是欠缺些什么。对了，是色彩，Linux的ls命令使用不同颜色区分各种 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	与Linux相比，Mac OS X的终端总是欠缺些什么。对了，是色彩，Linux的ls命令使用不同颜色区分各种文件类型，Vim编辑器也支持语法高亮，而Mac终端却总是以黑白示人<span>。</span>
</p>
<p>
	其实，只要稍微做一些工作，Mac的终端同样可以多姿多彩，请往下看。
</p>
<p>
	
</p>
<p>
	彩色化ls的输出
</p>
<p>
	
</p>
<p>
	Mac中BSD的ls命令可以使用-G参数彩色化输出的文件列表，需要配置LSCOLORS环境变量定义颜色，具体配置方法可以输入man ls查看。
</p>
<p>
	
</p>
<p>
	不过，我推荐安装Linux使用的GNU Coreutils替换Mac的ls命令，因为：
</p>
<p>
	
</p>
<p>
	Coreutils提供了配置工具，定义颜色代码更加方便；
</p>
<p>
	<span style="line-height:1.5;">Coreutils包含的不仅仅是ls，同时作为Linux用户，我更习惯于使用GNU的各种shell工具。</span>
</p>
<p>
	<span style="line-height:1.5;">Coreutils的安装与配置方法如下：</span>
</p>
<p>
	
</p>
<p>
	通过Homebrew安装Coreutils
</p>
<p>
	<span style="line-height:1.5;"># brew install xz coreutils</span>
</p>
<p>
	<span style="line-height:1.5;">注：Coreutils并不依赖于xz，但它的源码是用xz格式压缩的，安装xz才能解压。</span>
</p>
<p>
	
</p>
<p>
	生成颜色定义文件
</p>
<p>
	<span style="line-height:1.5;"># gdircolors --print-database &gt; ~/.dir_colors</span>
</p>
<p>
	
</p>
<p>
	在~/.bash_profile配置文件中加入以下代码
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">if brew list | grep coreutils &gt; /dev/null ; then</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">&nbsp; PATH="$(brew --prefix coreutils)/libexec/gnubin:$PATH"</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">&nbsp; alias ls='ls -F --show-control-chars --color=auto'</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">&nbsp; eval `gdircolors -b $HOME/.dir_colors`</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">fi</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">gdircolor的作用就是设置ls命令使用的环境变量LS_COLORS（BSD是LSCOLORS），我们可以修改~/.dir_colors自定义文件的颜色，此文件中的注释已经包含各种颜色取值的说明。</span>
</p>
<p>
	
</p>
<p>
	看看默认颜色的显示效果。
</p>
<p>
	<span style="line-height:1.5;"># ls screenshot</span>
</p>
<p>
	
</p>
<p>
	grep高亮显示关键字
</p>
<p>
	
</p>
<p>
	这个很简单，加上--color参数就可以了，为了使用方便，可以在~/.bash_profile配置文件中加上alias定义。
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">alias grep='grep --color'</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">alias egrep='egrep --color'</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">alias fgrep='fgrep --color'</span>
</p>
<p>
	
</p>
<p>
	Vim语法高亮
</p>
<p>
	
</p>
<p>
	在Vim中输入命令:syntax on激活语法高亮，若需要Vim启动时自动激活，在~/.vimrc中添加一行syntax on即可。</p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1407">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="让Mac OS X的终端多姿多彩(转)" href="http://www.showerlee.com/archives/1407">http://www.showerlee.com/archives/1407</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1407/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>SVN到Git迁移笔记</title>
		<link>http://www.showerlee.com/archives/1227</link>
		<comments>http://www.showerlee.com/archives/1227#comments</comments>
		<pubDate>Fri, 08 Aug 2014 10:11:08 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[Git]]></category>
		<category><![CDATA[Svn]]></category>
		<category><![CDATA[APACHE]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1227</guid>
		<description><![CDATA[本篇博文目的是将本地SVN服务器的project迁移为GIT格式,并上传到目前大家常用的github托管服务器 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>
	本篇博文目的是将本地SVN服务器的project迁移为GIT格式,并上传到目前大家常用的github托管服务器.
</p>
<p>
	
</p>
<p>
	<span style="line-height:1.5;">解决方案：</span>
</p>
<p>
	<span style="line-height:1.5;"><br />
</span>
</p>
<p>
	<span style="line-height:1.5;">一.环境部署</span>
</p>
<p>
	<span style="line-height:1.5;">操作系统： &nbsp; &nbsp; &nbsp; &nbsp;centos6.3 x64</span>
</p>
<p>
	<span style="line-height:1.5;">SVN: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; subversion-1.8.0</span>
</p>
<p>
	<span style="line-height:1.5;">apache: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;httpd-2.4.4</span>
</p>
<p>
	
</p>
<p>
	svn server(centos6.3 x64): node2.example.com
</p>
<p>
	<span style="line-height:1.5;">svn client(centos6.3 x64): node1.example.com</span>
</p>
<p>
	<span style="line-height:1.5;">git server: <a href="https://github.com/leonIi/" rel="nofollow">https://github.com/leonIi/</a></span>
</p>
<p>
	
</p>
<p>
	一.关闭iptables和SELINUX
</p>
<p>
	<span style="line-height:1.5;"># service iptables stop</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注：如需开启防火墙,则添加如下一条规则打开svn 3690端口</span>
</p>
<p>
	<span style="line-height:1.5;"># iptables -A INPUT -p tcp &nbsp;--dport 3690 -j ACCEPT</span>
</p>
<p>
	<span style="line-height:1.5;"># setenforce 0</span>
</p>
<p>
	<span style="line-height:1.5;"># vi /etc/sysconfig/selinux</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	<span style="line-height:1.5;">SELINUX=disabled</span>
</p>
<p>
	<span style="line-height:1.5;">---------------</span>
</p>
<p>
	
</p>
<p>
	二.同步时间
</p>
<p>
	<span style="line-height:1.5;"># ntpdate cn.pool.ntp.org</span>
</p>
<p>
	
</p>
<p>
	三.安装apache
</p>
<p>
	<span style="line-height:1.5;">传送门：<a href="http://www.showerlee.com/archives/6" target="_blank">http://www.showerlee.com/archives/6</a></span>
</p>
<p>
	
</p>
<p>
	四.关闭系统自带svnserve
</p>
<p>
	<span style="line-height:1.5;"># service svnserve stop</span>
</p>
<p>
	<span style="line-height:1.5;"># chkconfig svnserve off</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注：本文档为了与apache2.4.4配合不发生兼容问题，所以使用了最新编译版本的svn,这里关闭是为了保证与rpm的版本不冲突.</span>
</p>
<p>
	
</p>
<p>
	五.安装svn server
</p>
<p>
	<span style="line-height:1.5;">传送门：<a href="http://www.showerlee.com/archives/350" target="_blank">http://www.showerlee.com/archives/350</a></span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">注:安装完毕后:</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">svn根目录: /data/svn_repo</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">http访问URL: <a href="http://node2.example.com/svn/&#039;具体仓库" rel="nofollow">http://node2.example.com/svn/&#039;具体仓库</a>'</span>
</p>
<p>
	
</p>
<p>
	六.SVN到GIT迁移
</p>
<p>
	
</p>
<p>
	1.首先在github上面创建一个repository(略)
</p>
<p>
	
</p>
<p>
	2.创建一个SVN仓库(svn server)
</p>
<p>
	
</p>
<p>
	# cd /data/svn_repo/
</p>
<p>
	<span style="line-height:1.5;"># svnadmin create project01</span>
</p>
<p>
	<span style="line-height:1.5;">重启svn与apache</span>
</p>
<p>
	<span style="line-height:1.5;"># killall svnserve</span>
</p>
<p>
	<span style="line-height:1.5;"># /usr/local/svn/bin/svnserve -d -r /data/svn_repo/</span>
</p>
<p>
	<span style="line-height:1.5;"># /usr/local/apache2/bin/apachectl restart</span>
</p>
<p>
	
</p>
<p>
	3.SVN checkin and checkout(svn client)
</p>
<p>
	<span style="line-height:1.5;">1).客户端安装svn(若安装可略过)</span>
</p>
<p>
	<span style="line-height:1.5;"># yum install svn -y</span>
</p>
<p>
	
</p>
<p>
	2). svn checkout
</p>
<p>
	<span style="line-height:1.5;"># cd ~</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir svn_client_repo</span>
</p>
<p>
	<span style="line-height:1.5;"># cd svn_client_repo</span>
</p>
<p>
	<span style="line-height:1.5;"># svn co <a href="http://node2.example.com/svn/project01" rel="nofollow">http://node2.example.com/svn/project01</a></span>
</p>
<p>
	
</p>
<p>
	3). svn status
</p>
<p>
	<span style="line-height:1.5;"># svn status project01</span>
</p>
<p>
	<span style="line-height:1.5;"># cd project01</span>
</p>
<p>
	<span style="line-height:1.5;"># touch test01 test02 test03</span>
</p>
<p>
	
</p>
<p>
	4). svn add (添加)
</p>
<p>
	<span style="line-height:1.5;"># svn add test01</span>
</p>
<p>
	<span style="line-height:1.5;"># svn add test02</span>
</p>
<p>
	<span style="line-height:1.5;"># svn add test03</span>
</p>
<p>
	
</p>
<p>
	5). svn checkin(提交)
</p>
<p>
	
</p>
<p>
	# svn ci -m”project01”
</p>
<p>
	
</p>
<p>
	6). svn log (查看文件日志注释)
</p>
<p>
	<span style="line-height:1.5;"># svn log 1</span>
</p>
<p>
	
</p>
<p>
	常见错误提示:
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">Commit failed (details follow):</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">Error normalizing log message to internal format</span>
</p>
<p>
	<span style="line-height:1.5;color:#E53333;">Can't convert string from native encoding to 'UTF-8':</span>
</p>
<p>
	解决方法:
</p>
<p>
	<span style="line-height:1.5;"># vi ~/.subversion/config</span>
</p>
<p>
	<span style="line-height:1.5;">修改:log-encoding = UTF-8</span>
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">svn: Can't open file '/data/svn_repo/project01/db/txn-current-lock': Permission denied</span>
</p>
<p>
	<span style="line-height:1.5;">解决方法:</span>
</p>
<p>
	<span style="line-height:1.5;">将server端 /data/svn_repo/project01目录属主修改为apache用户,默认为daemon</span>
</p>
<p>
	# chown -R daemon.daemon /data/svn_repo/project01
</p>
<p>
	
</p>
<p>
	2.使用git迁移(svn client)
</p>
<p>
	<span style="line-height:1.5;">1).客户端安装git(若安装可略过)</span>
</p>
<p>
	<span style="line-height:1.5;"># yum install git* git-svn -y</span>
</p>
<p>
	<span style="line-height:1.5;"># cd ~</span>
</p>
<p>
	<span style="line-height:1.5;"># mkdir git_client_repo</span>
</p>
<p>
	<span style="line-height:1.5;"># cd <span>git_client_repo</span></span>
</p>
<p>
	建立SVN用户到git用户的映射文件
</p>
<p>
	<span style="line-height:1.5;"># echo "(no author) = test &lt;test@123.com&gt;" &gt;&nbsp;userinfo.txt&nbsp;</span>
</p>
<p>
	<span style="line-height:1.5;"># git svn init <a href="http://node2.example.com/svn/project01&nbsp;project01" rel="nofollow">http://node2.example.com/svn/project01&nbsp;project01</a></span>
</p>
<p>
	<span style="line-height:1.5;"># cd project01</span>
</p>
<p>
	<span style="line-height:1.5;">将svn用户映射到git上.</span>
</p>
<p>
	<span style="line-height:1.5;"># git svn fetch&nbsp;<span>--authors-file=../userinfo.txt</span></span>
</p>
<p>
	# git log
</p>
<p>
	-------------------------------------------------------------------------------------------------------------------------
</p>
<p>
	<span style="line-height:1.5;">commit edc2cdd658f8844ad4a883d083b84ef5dad2320c</span>
</p>
<p>
	<span style="line-height:1.5;">Author: </span><span style="line-height:1.5;color:#E53333;">test &lt;test@123.com&gt;</span>
</p>
<p>
	<span style="line-height:1.5;">Date: &nbsp; Mon Aug 11 05:50:09 2014 +0000</span>
</p>
<p>
	
</p>
<p>
	&nbsp; &nbsp; project01<br />
&nbsp; &nbsp;&nbsp;
</p>
<p>
	&nbsp; &nbsp; git-svn-id: <a href="http://node2.example.com/svn/project01@2" rel="nofollow">http://node2.example.com/svn/project01@2</a> 595a6c50-5861-48b1-ab0a-b1b54e0fc7cc
</p>
<p>
	commit 9bde3c02fbfa6f22088b442a519cfd3870433ebc
</p>
<p>
	Author: <span style="color:#E53333;">test &lt;test@123.com&gt;</span>
</p>
<p>
	Date: &nbsp; Fri Aug 8 07:55:54 2014 +0000
</p>
<p>
	&nbsp; &nbsp; &lt;E2&gt;&lt;80&gt;&lt;9D&gt;project01&lt;E2&gt;&lt;80&gt;&lt;9D&gt;<br />
&nbsp; &nbsp;&nbsp;
</p>
<p>
	&nbsp; &nbsp; git-svn-id: <a href="http://node2.example.com/svn/project01@1" rel="nofollow">http://node2.example.com/svn/project01@1</a> 595a6c50-5861-48b1-ab0a-b1b54e0fc7cc
</p>
<p>
	<span style="line-height:1.5;">-----------------------------------------------------------------------------------------------------------------------</span>
</p>
<p>
	当然上面的两步，可以作一步处理
</p>
<p>
	#&nbsp;git svn clone <a href="http://node2.example.com/svn/project01" rel="nofollow">http://node2.example.com/svn/project01</a> &nbsp;--authors-file=userinfo.txt &nbsp;project01
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">注: git svn fetch 这个步骤，可能碰到只想从某个版本开始进行fetch，那么请需要 –r 参数。</span>
</p>
<p>
	
</p>
<p>
	例如：
</p>
<p>
	
</p>
<p>
	# git svn fetch -r 1342:HEAD
</p>
<p>
	
</p>
<p>
	<span style="color:#E53333;">注：1342是你想要从这个版本开始fetch，如何查看这个版本号，你可以使用 svn 命令（windows下需要安装Subversion Client，e.g. sliksvn），简单使用就是 svn log svn_url&nbsp;</span>
</p>
<p>
	<span style="color:#E53333;">这个时候，你可能看到整屏在刷新，没关系，看到log就行。当然更简单的就是使用TortoiseSVN-&gt; Show log。</span>
</p>
<p>
	
</p>
<p>
	亦或者你可以这样使用：
</p>
<p>
	
</p>
<p>
	# git svn clone <a href="http://node2.example.com/svn/project01" rel="nofollow">http://node2.example.com/svn/project01</a> -sr 1342:HEAD project01
</p>
<p>
	
</p>
<p>
	2)创建本地SSH keys并上传到github,详见:
</p>
<p>
	<span style="line-height:1.5;"><a href="https://help.github.com/articles/generating-ssh-keys" rel="nofollow">https://help.github.com/articles/generating-ssh-keys</a></span>
</p>
<p>
	<span style="line-height:1.5;">并更改连接到github SSH端口</span>
</p>
<p>
	<span style="line-height:1.5;"># vim ~/.ssh/config</span>
</p>
<p>
	<span style="line-height:1.5;">增加:</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————</span>
</p>
<p>
	<span style="line-height:1.5;">Host github.com</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; Hostname ssh.github.com</span>
</p>
<p>
	<span style="line-height:1.5;">&nbsp; Port 443</span>
</p>
<p>
	<span style="line-height:1.5;">————————————————————————————</span>
</p>
<p></p>
<p>
	
</p>
<p>
	3).到这步的时候，本地已经clone了SVN仓库，现在需要的就是提交到远程了。首先，关联github远程仓库，如下：
</p>
<p>
	
</p>
<p>
	# git remote add origin <a href="mailto:git@github.com">git@github.com</a>:leonIi/project01
</p>
<p>
	<span style="line-height:1.5;"># git fetch</span>
</p>
<p>
	<span style="line-height:1.5;"># git commit -a -m "add file"</span>
</p>
<p>
	<span style="line-height:1.5;"># git add .</span>
</p>
<p>
	<span style="line-height:1.5;"># git push -f&nbsp;</span>
</p>
<p>
	
</p>
<p>
	到github上面查看这个仓库(repository),大致效果如下（https://github.com/leonIi/project01.git）
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140808-1@2x.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2014/08/QQ20140808-1@2x-1024x600.png" alt="QQ20140808-1@2x" width="1024" height="600" class="alignnone size-large wp-image-1233" /></a>
</p>
<p>
	
</p>
<p>
	<span>大功告成…</span>
</p>
<p>
	
</p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1227">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="SVN到Git迁移笔记" href="http://www.showerlee.com/archives/1227">http://www.showerlee.com/archives/1227</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1227/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CentOS6.3下修复yum安装工具</title>
		<link>http://www.showerlee.com/archives/1026</link>
		<comments>http://www.showerlee.com/archives/1026#comments</comments>
		<pubDate>Wed, 11 Dec 2013 03:49:23 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[其他]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=1026</guid>
		<description><![CDATA[一.删除自带的yum # rpm -aq&#124;grep yum&#124;xargs rpm -e --nodeps &#038;nb [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	一.删除自带的yum
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# rpm -aq|grep yum|xargs rpm -e --nodeps &nbsp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	二.从CentOS系统镜像中提取rpm包,这里以centos6.3_x64为例
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这里从镜像包Packages目录下提取如下rpm包:
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<a href="http://www.showerlee.com/wp-content/uploads/2013/12/1.png"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2013/12/1.png" alt="1" width="595" height="169" class="alignnone size-full wp-image-1027" /></a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	三.安装rpm包
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">注:这里我为了方便就将所有提取出来的包放到我的VPS上供大家下载</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# wget <a href="http://www.showerlee.com/down/python-iniparse-0.3.1-2.1.el6.noarch.rpm" rel="nofollow">http://www.showerlee.com/down/python-iniparse-0.3.1-2.1.el6.noarch.rpm</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# rpm -ivh python-iniparse-0.3.1-2.1.el6.noarch.rpm
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# wget <a href="http://www.showerlee.com/down/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm" rel="nofollow">http://www.showerlee.com/down/yum-metadata-parser-1.1.2-16.el6.x86_64.rpm</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# rpm -ivh yum-metadata-parser-1.1.2-16.el6.x86_64.rpm
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# wget <a href="http://www.showerlee.com/down/yum-3.2.29-30.el6.centos.noarch.rpm" rel="nofollow">http://www.showerlee.com/down/yum-3.2.29-30.el6.centos.noarch.rpm</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# wget <a href="http://www.showerlee.com/down/yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm" rel="nofollow">http://www.showerlee.com/down/yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# rpm -ivh yum-3.2.29-30.el6.centos.noarch.rpm yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">注：这一步要两个一起安装，要不会会出现如下错误：</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">----------------------------------------------</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;"># rpm -ivh yum-3.2.29-30.el6.centos.noarch.rpm</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">warning: yum-3.2.29-30.el6.centos.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">error: Failed dependencies:</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">yum-fastestmirror is needed by yum-3.2.29-30.el6.centos.noarch</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;"># rpm -ivh yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">warning: yum-plugin-fastestmirror-1.1.30-14.el6.noarch.rpm: Header V3 DSA signature: NOKEY, key ID e8562897</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">error: Failed dependencies:</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">yum &gt;= 3.0 is needed by yum-plugin-fastestmirror-1.1.30-14.el6.noarch</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">-----------------------------------------------</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# wget <a href="http://www.showerlee.com/down/PackageKit-yum-0.5.8-20.el6.x86_64.rpm" rel="nofollow">http://www.showerlee.com/down/PackageKit-yum-0.5.8-20.el6.x86_64.rpm</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# rpm -ivh PackageKit-yum-0.5.8-20.el6.x86_64.rpm
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# wget <a href="http://www.showerlee.com/down/PackageKit-yum-plugin-0.5.8-20.el6.x86_64.rpm" rel="nofollow">http://www.showerlee.com/down/PackageKit-yum-plugin-0.5.8-20.el6.x86_64.rpm</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# rpm -ivh PackageKit-yum-plugin-0.5.8-20.el6.x86_64.rpm
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	四.下载配置源：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd /etc/yum.repos.d/
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# wget <a href="http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo" rel="nofollow">http://docs.linuxtone.org/soft/lemp/CentOS-Base.repo</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	五.测试
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# yum version
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Loaded plugins: fastestmirror, refresh-packagekit
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Warning: RPMDB altered outside of yum.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Installed: 6/x86_64 &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1285:a2a18f0b8c3ca036a361579f6b22014aadfd680e
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Group-Installed: yum &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; 14:45bb88c01e2346ba8fe7ac401a053cfd42bda739
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	version
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	----------------------------------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	大功告成.....
</p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/1026">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="CentOS6.3下修复yum安装工具" href="http://www.showerlee.com/archives/1026">http://www.showerlee.com/archives/1026</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/1026/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Centos6.3下rsync+inotify安装配置笔记</title>
		<link>http://www.showerlee.com/archives/678</link>
		<comments>http://www.showerlee.com/archives/678#comments</comments>
		<pubDate>Tue, 27 Aug 2013 16:24:48 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[RSYNC]]></category>
		<category><![CDATA[Inotify]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=678</guid>
		<description><![CDATA[&#160;inotify是一种强大的，细粒度的，异步文件系统时间监控机制，它可以替代crond实现与rsyn [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp;inotify是一种强大的，细粒度的，异步文件系统时间监控机制，它可以替代crond实现与rsync的触发式文件同步，从而监控文件系统中添加，删除，修改，移动等细粒事件，从LINUX 2.6.13起，就已加入了对inotify的支持，所以我们只需要安装一个第三方软件inotify-tools即可管理此服务。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;之前利用的rsync+crond来触发实现同步的瓶颈在于，rsync在同步数据时，需要先扫描所有文件后进行比对，而后进行差异传输，如果文件数量级别很大而且变化会很快，扫描所有文件会非常耗时，而且会存在漏同步的问题，造成效率低下。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;而rsync+inotify则会弥补前者先扫描后同步的效率问题，采用系统级别监控各种变化，当文件发生任何变化，就会触发rsync同步，解决效率与实时性问题。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	LINUX操作系统: &nbsp;centOS6.3 64bit
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	rsync: &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;系统自带
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	inotify-tools: &nbsp;inotify-tools-master
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	www1(rsync server):192.168.7.73
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	www2(rsync client):192.168.7.74
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	拓扑图：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<a href="http://www.showerlee.com/wp-content/uploads/2013/08/112.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2013/08/112.jpg" alt="1" width="436" height="194" class="alignnone size-full wp-image-679" /></a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	(server)表示仅服务端配置
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	(client)表示仅客户端配置
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	(server,client)表示客户端与服务端都需配置
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	环境搭建：(server,client)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1.关闭iptables和SELINUX
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# service iptables stop
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# setenforce 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi /etc/sysconfig/selinux
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	SELINUX=disabled
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	---------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	判断LINUX系统内核是否达到2.6.13以上：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# uname -a
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	Linux www1.example.com 2.6.32-279.el6.x86_64 #1 SMP Fri Jun 22 12:19:21 UTC 2012 x86_64 x86_64 x86_64 GNU/Linux
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	查看inotify目录是否存在：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# ls -lsart /proc/sys/fs/inotify/
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	总用量 0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	0 dr-xr-xr-x 0 root root 0 6月 &nbsp; 4 14:04 ..
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	0 dr-xr-xr-x 0 root root 0 6月 &nbsp; 4 17:35 .
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	0 -rw-r--r-- 1 root root 0 6月 &nbsp; 4 17:35 max_user_watches
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	0 -rw-r--r-- 1 root root 0 6月 &nbsp; 4 17:35 max_user_instances
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	0 -rw-r--r-- 1 root root 0 6月 &nbsp; 4 17:35 max_queued_events
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	若返回以上内容，则系统支持inotify.
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	一.安装rsync:(server,client)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	传送门：<a href="http://www.showerlee.com/archives/419" target="_blank">http://www.showerlee.com/archives/419</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	配置：(server)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi /etc/rsyncd.conf
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	uid = root
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	gid = root
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	use chroot = no
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	max connections = 10
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	strict modes = yes
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	port = 873
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	address = 192.168.7.73
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	[test]
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	path = /test
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	comment = mirror for test
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	ignore errors
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	read only = no
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	list = no
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	auth users = user
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	secrets file = /etc/rsync.pas
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	hosts allow = *
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# hosts deny = 0.0.0.0/0
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	pid file = /var/run/rsyncd.pid
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	lock file = /var/run/rsync.lock
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	log file = /var/log/rsyncd.log
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	--------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	启动rsync
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# rsync --daemon --config=/etc/rsyncd.conf
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	重启xinetd使其配置生效：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# /etc/init.d/xinetd restart
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	二.安装inotify-tools：(server,client)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	可以到https://github.com/rvoicilas/inotify-tools/下载zip包，然后传到系统进行编译安装：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# unzip inotify-tools-master.zip
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd inotify-tools-master
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# ./autogen.sh
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# ./configure --prefix=/usr/local/inotify
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# make &amp;&amp; make install
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	配置client端的inotify：(client)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# vi /etc/rc.d/inotify.sh
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	该脚本在做客户端目录下文件若发生变化，则向服务端做同步上传操作，也就是保持客户端目录文件发生变化，服务端也相应改变。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	#!/bin/bash
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	src=/test
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	des=test
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	ip=192.168.7.73
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	/usr/local/inotify/bin/inotifywait -mrq --timefmt '%d/%m/%y/%H:%M' --format '%T%w%f' -e modify,delete,create,attrib $src | while read file
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; do
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp; &nbsp; &nbsp;rsync -vzrtopg --delete --progress $src user@$ip::$des --password-file=/etc/rsync.pas &amp;&amp;
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; &nbsp;echo "$src has been resynced"
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&nbsp; done
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	------------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	赋予执行权限
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# chmod +x /etc/rc.d/inotify.sh
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	执行脚本并做开机启动：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# /etc/rc.d/inotify.sh
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# echo "/etc/rc.d/inotify.sh" &gt;&gt; /etc/rc.local
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	注：这个脚本的作用是通过inotify监控文件目录的变化，进而触发rsync进行同步操作，由于这是通过内核完成的主动式触发操作，所以比rsync遍历整个目录的扫描方式效率要高很多。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	验证：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	在客户端创建5个文件，到服务端查看文件是否实时同步？
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	(client)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd /test
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# touch 1 2 3 4 5
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	(server)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# cd /test
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# ls
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1 &nbsp;2 &nbsp;3 &nbsp;4 &nbsp;5
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	-------------
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	验证成功，client端的目录发生变化会实时同步到server端，类似一个网络raid-1
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	总结：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	rsync+inotify比较适用于轻量级文件即时同步，如果量大建议还是使用共享存储方法解决。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">参考：酒哥的构建高可用LINUX服务器（第2版）</span>
</p>
<p></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/678">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="Centos6.3下rsync+inotify安装配置笔记" href="http://www.showerlee.com/archives/678">http://www.showerlee.com/archives/678</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/678/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>安卓手机变砖了怎么办？</title>
		<link>http://www.showerlee.com/archives/551</link>
		<comments>http://www.showerlee.com/archives/551#comments</comments>
		<pubDate>Mon, 26 Aug 2013 13:55:28 +0000</pubDate>
		<dc:creator>showerlee</dc:creator>
				<category><![CDATA[ANDROID]]></category>

		<guid isPermaLink="false">http://www.showerlee.com/?p=551</guid>
		<description><![CDATA[安卓手机变砖了怎么办？ 博主用的魅族MX2，所以是个实实在在魅粉+安卓root控，平时捣鼓完日常的运维工作后就 [&#8230;]]]></description>
				<content:encoded><![CDATA[<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	安卓手机变砖了怎么办？
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	博主用的魅族MX2，所以是个实实在在魅粉+安卓root控，平时捣鼓完日常的运维工作后就会找点安卓上有意思的APP研究下，这不这几天LEB安全大师（安卓公认的良心之作）又更新了，但苦于没有免杀版(也就是MX2自带任务管理器会杀掉LEB本身)，所以就到机锋找到了一个任务白名单APP，该软件相当于是自带魅族MX2 FLYME系统任务管理器的一个扩展插件，所以就按照教程一步步的操作，结果悲剧就发生。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	教程传送门：<a href="http://bbs.gfan.com/forum.php?mod=viewthread&amp;tid=6123114">http://bbs.gfan.com/forum.php?mod=viewthread&#038;tid=6123114</a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	按照教程所说：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">1.下载附件中apk</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">2.备份/system/app/下同名apk文件以及odex文件(如果有的话)</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">3.替换/system/app/下同名应用 修改权限</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">4.如果/system/app/下面有同名后缀odex文件请删除</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">5.重启</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	利用手机上的R.E管理器一步步操作完毕，重启机子会不停的报任务管理器进程错误，然后就各种崩溃，无法操作任何手机上的APP，OK 基本变砖了。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	啊。。。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	仔细看了下教程，原来忘了删除/system/app/下 MzRecentApps.odex文件
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	╮(╯▽╰)╭
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	冷静了下，既然安卓是基于linux内核写的系统，那他肯定也有自己的shell,网上找个工具进入shell/system/app/下删除这个该死的.odex文件不是OK了？
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	不过还好博主对LINUX shell还是比较熟的(RHCE可不是白考的)
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	网上搜索了相关资料，总结了下：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	其实安卓手机崩溃和LINUX系统崩溃解决方案其实都一样（废话，都是一个妈生的）
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	也就是只要能进入shell后提权操作即可：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	LINUX下的方法：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	找到系统光盘，然后进入救援模式，进入shell,然后重新挂载根分区可读写即可，然后具体问题具体解决。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# mount -o remount, rw /
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这个有点LINUX常识的人估计都很清楚
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<a href="http://www.showerlee.com/archives/tag/android" title="查看ANDROID中的全部文章" class="tag_link">ANDROID</a>的方法：
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">下载附件的adb shell到windows,利用豌豆荚或360手机助手下载你的安卓手机驱动，安装完毕</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">开始菜单-运行-输入"cmd"(找到指定adb文件路径),执行以下命令进入安卓 shell</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	&gt; adb.exe shell
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	1.首先提权为root,无需密码
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# su -
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	2.挂载目录可读写。
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<span style="color:#FF0000;">注：默认根目录可读写，但子目录无法读写，需再次挂载,但/system下的子目录就不需要再挂载即可读写</span>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	例如：获取/system下root读写权限
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	# mount -o remount,rw rootfs /system
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	剩下的操作基本上和LINUX shell的语法类似
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<a href="http://www.showerlee.com/wp-content/uploads/2013/08/16.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2013/08/16.jpg" alt="1" width="540" height="277" class="alignnone size-large wp-image-553" /></a>
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	这下三下五除二，很娴熟的进入该目录，干掉这个该死的文件，重启手机，哈哈，手机复活了
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	自带任务管理器的白名单扩展插件也出来了
</p>
<p style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;background-color:#FFFFFF;">
	<a href="http://www.showerlee.com/wp-content/uploads/2013/08/24.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2013/08/24.jpg" alt="2" width="562" height="900" class="alignnone size-large wp-image-554" /></a>
</p>
<p>
	<a href="http://www.showerlee.com/wp-content/uploads/2013/08/43.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2013/08/43.jpg" alt="4" width="562" height="900" class="alignnone size-full wp-image-552" /></a><a href="http://www.showerlee.com/wp-content/uploads/2013/08/33.jpg"><img onerror="javascript:this.src='http://www.showerlee.com/wp-content/themes/BYMT/images/images_error.jpg'" src="http://www.showerlee.com/wp-content/uploads/2013/08/33.jpg" alt="3" width="562" height="900" class="alignnone size-large wp-image-555" /></a>
</p>
<p>
	
</p>
<p>
	<span style="color:#555555;font-family:宋体, 'Arial Narrow', arial, serif;font-size:14px;line-height:21px;background-color:#FFFFFF;">所以安卓手机变砖了不可怕，可怕的就是你当转一样直接砸了。。。</span></p>
<div>声明: 本文采用 <a rel="external" href="http://creativecommons.org/licenses/by-nc-sa/3.0/deed.zh" title="署名-非商业性使用-相同方式共享 3.0 Unported">CC BY-NC-SA 3.0</a> 协议进行授权</div><div>转载请注明来源：<a rel="external" title="DevOps技术分享" href="http://www.showerlee.com/archives/551">DevOps技术分享</a></div><div>本文链接地址：<a rel="external" title="安卓手机变砖了怎么办？" href="http://www.showerlee.com/archives/551">http://www.showerlee.com/archives/551</a></div>]]></content:encoded>
			<wfw:commentRss>http://www.showerlee.com/archives/551/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
