/
index.html
278 lines (278 loc) · 20.6 KB
/
index.html
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>squid 自动配置脚本</title>
<meta name="author" content="陈子">
<!-- Le HTML5 shim, for IE6-8 support of HTML elements -->
<!--[if lt IE 9]>
<script src="http://html5shim.googlecode.com/svn/trunk/html5.js"></script>
<![endif]-->
<!-- Le styles -->
<link href="/assets/themes/twitter/bootstrap/css/bootstrap.min.css" rel="stylesheet">
<link href="/assets/themes/twitter/css/style.css?body=1" rel="stylesheet" type="text/css" media="all">
<link href="/assets/themes/twitter/css/pygments/default.css" rel="stylesheet" type="text/css">
<!-- Le fav and touch icons -->
<!-- Update these with your own images
<link rel="shortcut icon" href="images/favicon.ico">
<link rel="apple-touch-icon" href="images/apple-touch-icon.png">
<link rel="apple-touch-icon" sizes="72x72" href="images/apple-touch-icon-72x72.png">
<link rel="apple-touch-icon" sizes="114x114" href="images/apple-touch-icon-114x114.png">
-->
</head>
<body>
<div class="navbar navbar-fixed-top">
<div class="navbar-inner">
<div class="container">
<a class="brand" href="/">三斗室</a>
<ul class="nav">
<li><a href="/archive.html">归档</a></li>
<li><a href="/categories.html">分类</a></li>
<li><a href="/errata.html">《网站运维技术与实践》勘误</a></li>
<li><a href="/pages.html">Pages</a></li>
<li><a href="/projects.html">学习记录</a></li>
<li><a href="/tags.html">标签</a></li>
<li><a href="http://chenlinux.com/poetry/index.html" />诗文集</a></li>
<li><link title="RSS 2.0" type="application/rss+xml" href="http://chenlinux.com/feed.xml" rel="alternate" /><a href="http://chenlinux.com/feed.xml" target="_blank">RSS订阅</a></li>
</ul>
<ul class="nav pull-right"><li><a href="/about.html">有关我</a></li></ul>
</div>
</div>
</div>
<div class="container">
<div class="row">
<div class="span7">
<div class="row">
<div class="page-header">
<h1>squid 自动配置脚本 <small></small></h1>
<div class="date"><span>03 November 2009</span></div>
<ul class="tag_box pull-right">
<li><a href="/tags.html#squid-ref">squid <span>25</span></a></li>
<li><a href="/tags.html#web-ref">web <span>2</span></a></li>
<li><a href="/tags.html#bash-ref">bash <span>9</span></a></li>
</ul>
</div>
<div style='background-color: #FFF;'>
<p>公司刚重新规定了squid服务的标准配置。以后,客户的配置要求,统一安排。这样,除了一些有特殊要求(比如加密/防盗链等)的以外,普通客户就可以逐步实现简洁明了的规范化自动化配置。</p>
<p>目前squid的初始化准备还在慢慢进行中,趁有点空闲,先把自动化配置脚本搞出来。</p>
<p>主程序do.sh如下:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#!/bin/bash</span>
<span class="k">if</span> <span class="o">[</span> <span class="s2">"$#"</span> -ne <span class="m">2</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"Usage: ./do.sh [command][customer]"</span>
<span class="nb">echo</span> <span class="s2">"For example:./do.sh add abc"</span>
<span class="nb">echo</span> <span class="s2">" ./do.sh del abc"</span>
<span class="nb">exit </span>1
<span class="k">elif</span> <span class="o">[</span> ! -s ip.lst -a -e ip.lst <span class="o">]</span><span class="p">;</span><span class="k">then</span>
<span class="nb">echo</span> <span class="s2">"No server in ip.lst"</span>
<span class="nb">exit </span>1
<span class="k">fi</span>
<span class="k">for</span> ip in <span class="sb">`</span>cat ip.lst<span class="sb">`</span><span class="p">;</span><span class="k">do</span>
ping -c <span class="m">5</span> <span class="nv">$ip</span>
expect ssh.exp <span class="nv">$ip</span> <span class="nv">$1</span> <span class="nv">$2</span>
<span class="k">done</span></code></pre></div>
<p>ssh.exp如下:</p>
<div class="highlight"><pre><code class="language-tcl" data-lang="tcl"><span class="c">#!/usr/bin/expect -f</span>
<span class="nv">log_file</span> exp.log
<span class="k">set</span> ipaddr <span class="k">[</span><span class="nb">lindex</span> <span class="nv">$argv</span> <span class="mi">0</span><span class="k">]</span>
<span class="k">set</span> command <span class="k">[</span><span class="nb">lindex</span> <span class="nv">$argv</span> <span class="mi">1</span><span class="k">]</span>
<span class="k">set</span> custom <span class="k">[</span><span class="nb">lindex</span> <span class="nv">$argv</span> <span class="mi">2</span><span class="k">]</span>
<span class="nv">spawn</span> scp <span class="o">/</span>squid.config<span class="o">/</span><span class="nv">$custom</span> <span class="o">/</span>rt<span class="o">/</span>conf.sh <span class="nv">$ipaddr:</span><span class="o">/</span>root<span class="o">/</span>
<span class="k">for</span> <span class="k">{}</span> <span class="mi">1</span> <span class="k">{}</span> <span class="k">{</span>
<span class="nv">expect</span> <span class="k">{</span>
<span class="nb">eof</span>
<span class="k">break</span>
<span class="s2">"(yes/no)?"</span> <span class="k">{</span><span class="nv">send</span> <span class="s2">"yesr"</span><span class="k">}</span>
<span class="s2">"assword:"</span> <span class="k">{</span><span class="nv">send</span> <span class="s2">"123456r"</span><span class="k">}</span>
<span class="k">}</span>
<span class="k">}</span>
<span class="nv">spawn</span> ssh root<span class="err">@</span><span class="nv">$ipaddr</span> bash conf.sh <span class="nv">$command</span> <span class="nv">$custom</span>
<span class="k">for</span> <span class="k">{}</span> <span class="mi">1</span> <span class="k">{}</span> <span class="k">{</span>
<span class="nv">expect</span> <span class="k">{</span>
<span class="nb">eof</span>
<span class="k">break</span>
<span class="s2">"(yes/no)?"</span> <span class="k">{</span><span class="nv">send</span> <span class="s2">"yesr"</span><span class="k">}</span>
<span class="s2">"assword:"</span> <span class="k">{</span><span class="nv">send</span> <span class="s2">"123456r"</span><span class="k">}</span>
<span class="k">}</span>
<span class="k">}</span></code></pre></div>
<p>conf.sh如下:</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="c">#!/bin/bash</span>
<span class="nv">NR</span><span class="o">=</span><span class="k">$(</span>cat <span class="nv">$2</span><span class="p">|</span>wc -l<span class="k">)</span>
<span class="nv">CONF</span><span class="o">=</span>/etc/squid.conf
<span class="k">if</span> <span class="o">[</span> <span class="s2">"$1"</span> <span class="o">==</span> <span class="s2">"add"</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
sed -i <span class="s2">"/config/r $2"</span> <span class="nv">$CONF</span>
<span class="k">elif</span> <span class="o">[</span> <span class="s2">"$1"</span> <span class="o">==</span> <span class="s2">"del"</span> <span class="o">]</span><span class="p">;</span><span class="k">then</span>
<span class="nv">CFNR</span><span class="o">=</span><span class="sb">`</span>sed -n -e /<span class="nv">$2</span>/<span class="o">=</span> <span class="nv">$CONF</span><span class="sb">`</span>
<span class="nv">BEGINNR</span><span class="o">=</span><span class="sb">`</span><span class="nb">echo</span> <span class="nv">$CFNR</span><span class="p">|</span>awk <span class="s1">'{print $1}'</span><span class="sb">`</span>
<span class="nv">ENDNR</span><span class="o">=</span><span class="sb">`</span>expr <span class="nv">$BEGINNR</span> + <span class="nv">$NR</span><span class="sb">`</span>
sed -i <span class="s2">"/$BEGINNR/,/$ENDNR/d"</span> <span class="nv">$CONF</span>
rm -f <span class="s2">"$2"</span>*
<span class="k">else</span>
<span class="nb">echo</span> <span class="s2">"Use add or del please!"</span>
<span class="k">fi</span>
killall -9 squid
<span class="nb">ulimit</span> -HSn 655360
/sbin/squid -s</code></pre></div>
<p>然后我们模拟一个叫做abc的客户来测试CDN了。那么我只要在/squid.config/下创建一个叫做abc的文本,内容是针对性的配置部分字段,假设如下:</p>
<div class="highlight"><pre><code class="language-squid" data-lang="squid"><span class="c">#abc</span><span class="w"></span>
<span class="w"> </span><span class="k">refresh_pattern</span><span class="w"> </span>-i<span class="w"> </span>http://www.abc.com/.*.(jpg|gif|js|css|swf|xml)$<span class="w"> </span><span class="m">1440</span><span class="w"> </span><span class="m">50%</span><span class="w"> </span><span class="m">4320</span><span class="w"> </span>ignore-reload<span class="w"></span>
<span class="w"> </span><span class="k">acl</span><span class="w"> </span>abc<span class="w"> </span><span class="k">url_regex</span><span class="w"> </span>-i<span class="w"> </span>^http://www.abc.com/.*.(html|do|jsp|asp|aspx|axd|asmx)<span class="w"></span>
<span class="w"> </span>cache<span class="w"> </span><span class="no">deny</span><span class="w"> </span>abc<span class="w"></span></code></pre></div>
<p>然后运行./do.sh add abc,就可以自动在ip.lst里所有的服务器的squid.conf中的“#config”字段下面,添上abc的配置文件了。</p>
<p>过一段时间,要是abc这个客户流失了,就运行./do.sh del abc就行了。</p>
<p>之前的思路,局限在一句句往配置文件里插句子。于是用下面这个办法</p>
<div class="highlight"><pre><code class="language-bash" data-lang="bash">sed -i s/<span class="s2">"config"</span>/<span class="o">{</span>
a<span class="s2">"……"</span>/
a<span class="s2">"……"</span>/
a<span class="s2">"……"</span>/
<span class="o">}</span>
squid.conf</code></pre></div>
<p>而这样配置句段的顺序就反过来了,还得用 <code>sed -n "1!G;h;$!d"</code> 命令倒序读取——最开始用cat命令,结果cat在读取abc这个文件的时候会自动把空格前后的内容分段读出,于是改用sed。至于倒序之后,再怎么插入,就没有研究了。因为当时我发现了可以直接将文件a插入文件b的方法~~</p>
<table>
<tbody>
<tr>
<td>del的时候,其实在操作上还有一个办法。就是每次的配置不单以#abc开头,还用一个#abcEND结尾。这样,ENDNR就不用计算,直接取echo $CFNR</td>
<td>awk ‘{print $NF}’就行了。</td>
</tr>
</tbody>
</table>
<p>说到这个CFNR,让人很郁闷的一点是,这个sed -n -e出来的几个数字,我本意是作一个数组的,但怎么试验,shell都把这一串数字存在${CFNR[0]}一个元素里……数组到底怎么输入,还得研究~~</p>
<hr>
<div class="pagination">
<ul>
<li class="prev disabled"><a>← Previous</a></li>
<li><a href="/archive.html">Archive</a></li>
<li class="next"><a href="/2009/11/03/dollar-zero-in-awk" title="awk变量$0妙用">Next →</a></li>
</ul>
</div>
<hr>
<!-- JiaThis Button BEGIN -->
<div class="jiathis_style">
<span class="jiathis_txt">分享到:</span>
<a class="jiathis_button_tsina">新浪微博</a>
<a class="jiathis_button_weixin">微信</a>
<a class="jiathis_button_renren">人人网</a>
<a class="jiathis_button_ydnote">有道云笔记</a>
<a class="jiathis_button_gmail">Gmail邮箱</a>
<a class="jiathis_button_twitter">Twitter</a>
<a class="jiathis_button_googleplus">Google+</a>
<a class="jiathis_button_hi">百度空间</a>
<a class="jiathis_button_fb">Facebook</a>
<a class="jiathis_button_douban">豆瓣</a>
<a href="http://www.jiathis.com/share?uid=1589850" class="jiathis jiathis_txt jiathis_separator jtico jtico_jiathis" target="_blank">更多</a>
<a class="jiathis_counter_style"></a>
</div>
<script type="text/javascript" >
var jiathis_config={
data_track_clickback:true,
summary:"",
ralateuid:{
"tsina":"1035836154"
},
shortUrl:false,
hideMore:false
}
</script>
<script type="text/javascript" src="http://v3.jiathis.com/code/jia.js?uid=1589850" charset="utf-8"></script>
<!-- JiaThis Button END -->
<!-- UY BEGIN -->
<div id="uyan_frame"></div>
<script type="text/javascript" id="UYScript" src="http://v1.uyan.cc/js/iframe.js?UYUserId=1589850" async=""></script>
<!-- UY END -->
</div>
</div>
</div>
<div class="span4">
<div class="well sidebar-nav">
<ul id="relate_blog" class="nav nav-list">
<li class="nav-header">最近文章</li>
<li><a href="/2014/12/26/report-of-this-year">2014 年度个人总结</a></li>
<li><a href="/2014/12/19/kibana-4-beta-3-now-more-filtery">【翻译】Kibana 4 beta 3 发布,重新支持过滤器</a></li>
<li><a href="/2014/12/08/difference-filterings-kibana">Kibana 中几个不同的 filtering</a></li>
<li><a href="/2014/11/27/elasticsearch-scripts-aggregations">利用脚本灵活定制 Elasticsearch 中的聚合效果</a></li>
<li><a href="/2014/11/23/kibana-panel-only-dashboard">利用动态仪表板实现kibana单图表导出功能</a></li>
<li><a href="/2014/11/20/phantomjs-snapshot">用 phantomjs 截图</a></li>
<li><a href="/2014/11/19/uniq-count-kibana">在 kibana 里实现去重计数</a></li>
<li><a href="/2014/11/18/kibana4-beta-2-get-now">【翻译】Kibana 4 beta 2 发布</a></li>
<li><a href="/2014/10/28/perl6-bench">用 perl6-bench 做 perl6 性能对比</a></li>
</ul>
</div>
<div class="well sidebar-nav">
<iframe width="100%" height="550" class="share_self" frameborder="0" scrolling="no" src="http://widget.weibo.com/weiboshow/index.php?language=&width=0&height=550&fansRow=1&ptype=1&speed=0&skin=2&isTitle=1&noborder=1&isWeibo=1&isFans=1&uid=1035836154&verifier=a26926d5&dpc=1"></iframe>
</div>
<div class="well sidebar-nav">
<div id="uyan_list_time_frame"></div>
<script type="text/javascript" id="UYScriptTime" src="http://v1.uyan.cc/js/iframe_time_list.js?UYUserId=1589850&rankType=time" async=""></script>
</div>
<div class="well sidebar-nav">
<ul id="linklists" class="nav nav-list">
<li class="nav-header">友情链接(英文)</li>
<li><a href="http://codeascraft.com/" title="Etsy 运维团队博客">Code as Craft</a></li>
<li><a href="http://devopsanywhere.blogspot.jp/" title="">devopsanywhere</a></li>
<li><a href="http://www.jedi.be/blog/" title="">Jong En Dynamische Informatica</a></li>
<li><a href="http://www.planetdevops.net/" title="">planetdevops</a></li>
<li><a href="http://www.kitchensoap.com/" title="《网站运维》作者,Etsy 运维">Kitchen Soap</a></li>
<li><a href="http://blog.johngoulah.com" title="Musings of linux, open source, cloud computing and systems">John Goulah</a></li>
<li><a href="http://serverfault.com/" title="stackexchange下属的系统工程师问答网站">serverfault</a></li>
<li><a href="http://www.thegeekstuff.com/" title="各种超酷Linux命令用法">TheGeekStuff</a></li>
<li><a href="http://neilb.org/" title="The good,the bad,and the beautiful">neilb</a></li>
<li><a href="http://www.reddit.com/r/perl/" title="">reddit perl 频道</a></li>
<li><a href="http://jpetazzo.github.io/" title="">~jpetazzo</a></li>
<li><a href="http://www.perfplanet.com/" title="News and views from the web performance blogosphere">Performance Planet</a></li>
<li><a href="http://cuddletech.com/blog/" title="Use UNIX or die">Cuddle Tech</a></li>
<li><a href="http://showmetheco.de/" title="Viacheslav Tykhanovskyi(PocketIO/Text::Haml)">No time to wait</a></li>
<li><a href="http://blog.dataloop.io/" title="A new SaaS monitoring tool for DevOps & Operations">Dataloop.IO</a></li>
<li><a href="http://www.ducea.com/" title="">MDLog:/sysadmin</a></li>
<li><a href="http://planeteria.org/perl6/" title="Perl6 文集">Planet Perl 6</a></li>
<li><a href="http://www.metaforsoftware.com/blog/" title="">metafor</a></li>
<li><a href="http://blog.kablamo.org/" title="Eric Johnson,一个游走在伦敦和北京的 Perler">kablamo</a></li>
<li><a href="http://aphyr.com/posts" title="call me maybe 吐槽系列">Aphyr</a></li>
</ul>
</div>
<div class="well sidebar-nav">
<ul id="linklists" class="nav nav-list">
<li class="nav-header">友情链接(中文)</li>
<li><a href="http://www.nginxs.com/" title="">eric</a></li>
<li><a href="http://www.hellodb.net/" title="Ali DBA 张瑞">Hello DBA</a></li>
<li><a href="http://blog.nosqlfan.com/" title="not only sql信息集散地">NoSQLfan</a></li>
<li><a href="http://ourmysql.com/" title="">OurMySQL</a></li>
<li><a href="http://timo.piqiu.me/" title="TIMO IS MY OASIS">Timo</a></li>
<li><a href="http://www.liurongxing.com/" title="">刘荣星</a></li>
<li><a href="http://www.cnadn.net/" title="F5工程师">应用交付学习之路</a></li>
<li><a href="http://scmbob.org/" title="杭州NSN工程师,shell高人~">扛一肩记忆</a></li>
<li><a href="http://www.php-oa.com/" title="音悦台技术经理">扶凯</a></li>
<li><a href="http://www.lark.net.cn/" title="王剑">lark's cloud</a></li>
<li><a href="http://log.heartoutside.com/" title="HeartOutSide">HeartOutside</a></li>
<li><a href="http://blog.liulantao.com/" title="刘兰涛">Lax</a></li>
<li><a href="http://niubie.me/" title="莫言">莫言</a></li>
<li><a href="http://noops.me/" title="小米运维部">NoOps</a></li>
<li><a href="http://www.searchtech.pro/" title="">云端分布式搜索技术</a></li>
<li><a href="http://www.usefulshare.com" title="当当网安全运维">UsefulShare</a></li>
<li><a href="http://junqili.com/" title="深入研究puppet">纸飞机</a></li>
<li><a href="http://www.chinaxing.org/" title="">ChinaXing</a></li>
<li><a href="http://bubbyroom.com/" title="守住每一天">Liuyu's blog</a></li>
<li><a href="http://blog.aka-cool.net/" title="">Aka.Why</a></li>
<li><a href="http://blog.l8ii.com/" title="刘侨">LairdNote</a></li>
<li><a href="http://flw.tools/" title="">flw的工具箱</a></li>
<li><a href="http://blog.mcshell.org/" title="">mcshell</a></li>
<li><a href="http://novoland.github.io/" title="">克鲁斯卡尔的博客</a></li>
</ul>
</div>
<div class="well sidebar-nav">
<ul id="booklists" class="nav nav-list">
<li class="nav-header">我写的第一本技术书籍</li>
<li><a href='http://product.china-pub.com/3769604'><img src='http://images.china-pub.com/ebook3765001-3770000/3769604/shupi.jpg' border='0' alt='网站运维技术与实践'/></a></li>
<li class="nav-header">我写的两本电子书籍</li>
<li><a href='http://chenryn.gitbooks.io/logstash-best-practice/'><img src='https://sm3lir.cloudimage.io/s/cdn/x/https://www.gitbook.io/cover/book/chenryn/logstash-best-practice?build=1416299695472' border='0' alt='LogStash 最佳实践'/></a></li>
<li><a href='http://kibana.logstash.es/'><img src='https://sm3lir.cloudimage.io/s/cdn/x/https://www.gitbook.io/cover/book/chenryn/kibana-guide-cn?build=1415872457562' border='0' alt='Kibana 中文指南'/></a></li>
</div>
</div>
</div> <!-- row -->
<footer>
<p>© 陈子 2012
with help from <a href="http://jekyllbootstrap.com" target="_blank" title="The Definitive Jekyll Blogging Framework">Jekyll Bootstrap</a>
and <a href="http://twitter.github.com/bootstrap/" target="_blank">Twitter Bootstrap</a>
</p>
</footer>
</div> <!-- /container -->
</body>
</html>