天天看點

Puppet批量管理Nginx伺服器

開發環境和測試環境均是CentOS6.4 x86_64,ngxin的模闆檔案是在puppet子產品下面templates目錄中以”.erb”結尾的檔案,puppet模闆主要用于檔案,例如各種服務的配置檔案,相同的服務,不同的配置就可以考慮使用模闆檔案,例如Nginx和Apache的虛拟主機配置就可以考慮采用ERB模闆,nginx的安裝在這裡建議用第三方yum源來安裝,如果是用Nginx的官方源來安裝nginx的話,我們可以檢視下/etc/yum.repos.d/nginx.repo檔案内容,如下所示:

1

2

3

4

5

<code>[nginx]</code>

<code>name=nginx repo</code>

<code>baseurl=http:</code><code>//nginx</code><code>.org</code><code>/packages/centos/</code><code>$releasever/$basearch/</code>

<code>gpgcheck=0</code>

<code>enabled=1</code>

第二種方式就是通過createrepo自建自己的YUM源,這種方式更加甯活,我們可以在nginx官網去下載下傳适合自己的rpm包,然後添加進自己的YUM源,在自動化運維要求嚴格的定制環境中,絕大多數運維同學都會選擇這種方法。大家通過此種方式安裝nginx以後會發現,确實比源碼安裝Nginx友善多了,像自動配置設定了運作nginx的使用者nginx:nginx,Nginx的日志存放會自動儲存在/var/log/nginx下,其工作目錄為/etc/nginx,這一點跟源碼編譯安裝的nginx差別很大,請大家在實驗過程也注意甄别。

我比較關心的是ruby的版本和puppet的版本,結果顯示如下:

<code>[root@server manifests]</code><code># ruby -v</code>

<code>ruby 1.8.7 (2013-06-27 patchlevel 374) [x86_64-linux]</code>

<code>[root@server manifests]</code><code># puppet -V</code>

<code>3.7.4</code>

像Puppet的安裝和其它初級知識點我這裡就略過了,我直接貼上檔案内容,/etc/puppet的檔案結構如下:

6

7

8

9

10

11

12

13

14

15

16

<code>|-- auth.conf</code>

<code>|-- fileserver.conf</code>

<code>|-- manifests</code>

<code>|   |-- nodes</code>

<code>|   |   |-- client.cn7788.com.pp</code>

<code>|   |   `-- </code><code>test</code><code>.cn7788.com.pp</code>

<code>|   `-- site.pp</code>

<code>|-- modules</code>

<code>|   `-- nginx</code>

<code>|       |-- files</code>

<code>|       |-- manifests</code>

<code>|       |   `-- init.pp</code>

<code>|       `-- templates</code>

<code>|           |-- nginx.conf.erb</code>

<code>|           `-- nginx_vhost.conf.erb</code>

<code>`-- puppet.conf</code>

site.pp的檔案内容如下:

<code>import</code> <code>"nodes/*.pp"</code>

<code>Package {</code>

<code>allow_virtual =&gt; </code><code>false</code><code>,</code>

<code>}</code>

client.cn7788.com.pp的檔案内容如下所示:

<code>node </code><code>'client.cn7788.com'</code> <code>{</code>

<code>  </code><code>include nginx</code>

<code>  </code><code>nginx::vhost {</code><code>'client.cn7788.com'</code><code>:</code>

<code>  </code><code>sitedomain =&gt; </code><code>"client.cn7788.com"</code> <code>,</code>

<code>  </code><code>rootdir =&gt; </code><code>"client"</code><code>,</code>

test.cn7788.com.pp的檔案内容如下所示:

<code>node </code><code>'test.cn7788.com'</code> <code>{</code>

<code>  </code><code>nginx::vhost {</code><code>'test.cn7788.com'</code><code>:</code>

<code>  </code><code>sitedomain =&gt; </code><code>"test.cn7788.com"</code> <code>,</code>

<code>  </code><code>rootdir =&gt; </code><code>"test"</code><code>,</code>

/etc/puppet/modules/nginx/manifests/init.pp檔案内容如下所示:

17

18

19

20

21

22

<code>class nginx{</code>

<code>        </code><code>package{</code><code>"nginx"</code><code>:</code>

<code>        </code><code>ensure          =&gt;present,</code>

<code>        </code><code>service{</code><code>"nginx"</code><code>:</code>

<code>        </code><code>ensure          =&gt;running,</code>

<code>        </code><code>require         =&gt;Package[</code><code>"nginx"</code><code>],</code>

<code>file</code><code>{</code><code>"nginx.conf"</code><code>:</code>

<code>ensure =&gt; present,</code>

<code>mode =&gt; 644,owner =&gt; root,group =&gt; root,</code>

<code>path =&gt; </code><code>"/etc/nginx/nginx.conf"</code><code>,</code>

<code>content=&gt; template(</code><code>"nginx/nginx.conf.erb"</code><code>),</code>

<code>require=&gt; Package[</code><code>"nginx"</code><code>],</code>

<code>define nginx::vhost($sitedomain,$rootdir) {</code>

<code>    </code><code>file</code><code>{ </code><code>"/etc/nginx/conf.d/${sitedomain}.conf"</code><code>:</code>

<code>        </code><code>content =&gt; template(</code><code>"nginx/nginx_vhost.conf.erb"</code><code>),</code>

<code>        </code><code>require =&gt; Package[</code><code>"nginx"</code><code>],</code>

<code>    </code><code>}</code>

/etc/puppet/modules/nginx/templates/nginx.conf.erb檔案内容如下所示:

<code>user  nginx;</code>

<code>worker_processes  8;</code>

<code>error_log  </code><code>/var/log/nginx/error</code><code>.log warn;</code>

<code>pid        </code><code>/var/run/nginx</code><code>.pid;</code>

<code>events {</code>

<code>    </code><code>use epoll; </code>

<code>    </code><code>worker_connections  51200;</code>

<code>http {</code>

<code>    </code><code>include       </code><code>/etc/nginx/mime</code><code>.types;</code>

<code>    </code><code>default_type  application</code><code>/octet-stream</code><code>;</code>

<code>    </code><code>log_format  main  </code><code>'$remote_addr - $remote_user [$time_local] "$request" '</code>

<code>                      </code><code>'$status $body_bytes_sent "$http_referer" '</code>

<code>                      </code><code>'"$http_user_agent" "$http_x_forwarded_for"'</code><code>;</code>

<code>    </code><code>access_log  </code><code>/var/log/nginx/access</code><code>.log  main;</code>

<code>    </code><code>sendfile        on;</code>

<code>    </code><code>#tcp_nopush     on;</code>

<code>    </code><code>keepalive_timeout  65;</code>

<code>    </code><code>#gzip  on;</code>

<code>    </code><code>include </code><code>/etc/nginx/conf</code><code>.d/*.conf;</code>

/etc/puppet/modules/nginx/templates/nginx_vhost.conf.erb檔案内容如下所示:

<code>server {</code>

<code>    </code><code>listen       </code><code>80</code><code>;</code>

<code>server_name  &lt;%= sitedomain %&gt;;</code>

<code>access_log /</code><code>var</code><code>/log/nginx/&lt;%= sitedomain %&gt;.access.log;</code>

<code>location / {</code>

<code>root /</code><code>var</code><code>/www/&lt;%= rootdir %&gt;;</code>

<code>index    index.php index.html index.htm;</code>

最後我們可以在節點名為client.cn7788.com和test.cn7788.com的機器驗證效果,指令如下所示:

<code>puppet agent --</code><code>test</code> <code>--server server.cn7788.com</code>

部分執行指令結果如下:

<code>Info: Computing checksum on </code><code>file</code> <code>/etc/nginx/nginx</code><code>.conf</code>

<code>Info: FileBucket got a duplicate </code><code>file</code> <code>{md5}f7984934bd6cab883e1f33d5129834bb</code>

<code>Info: </code><code>/Stage</code><code>[main]</code><code>/Nginx/File</code><code>[nginx.conf]: Filebucketed </code><code>/etc/nginx/nginx</code><code>.conf to puppet with </code><code>sum</code> <code>f7984934bd6cab883e1f33d5129834bb</code>

<code>Notice: </code><code>/Stage</code><code>[main]</code><code>/Nginx/File</code><code>[nginx.conf]</code><code>/content</code><code>: content changed </code><code>'{md5}f7984934bd6cab883e1f33d5129834bb'</code> <code>to </code><code>'{md5}6f57d21ca18f7256ef6c6ccd068505dc'</code>

<code>Notice: Finished catalog run </code><code>in</code> <code>15.47 seconds</code>

為了友善大家下載下傳和閱讀,此子產品我特的收錄進了我的github倉庫,位址為https://github.com/yuhongchun/avaliablity/

本文轉自 撫琴煮酒 51CTO部落格,原文連結:http://blog.51cto.com/yuhongchun/1624871,如需轉載請自行聯系原作者