運維自動化管理之puppet + nginx 部署與配置

一、   關於Puppet
1. 什麼是Puppet
puppet 是一種Linux、Unix平臺的集中配置管理系統,使用自有的puppet描述語言,可管理配置文件、用戶、cron任務、軟件包、系統服務等。 puppet把這些系統實體稱之爲資源,puppet的設計目標是簡化對這些資源的管理以及妥善處理資源間的依賴關係。
puppet 採用C/S星狀的結構,所有的客戶端和一個或幾個服務器交互。每個客戶端週期的(默認半個小時)向服務器發送請求,獲得其最新的配置信息,保證和該配置信 息同步。每個puppet客戶端每半小時(可以設置runinterval=30)連接一次服務器端,下載最新的配置文件,並且嚴格按照配置文件來配置服 務器. 配置完成以後,puppet客戶端可以反饋給服務器端一個消息. 如果出錯,也會給服務器端反饋一個消息.
2. 爲什麼要使用puppet
當你去管理10臺服務器,你肯定會說小意思。沒有任何壓力。
當你去管理100臺服務器,你肯定也會說小意思。
當你去管理1000+臺服務器呢?你是不是就頭痛了,不同的機器,不同的系統,
使用不同的軟件版本,配置也不一樣。這樣爲了提升效率。Puppet就派上了大用場。
3. Puppet架構
1.png

 

4. 簡單地說下工作原理:
Puppet 後臺運行的時候默認是半小時執行一次,不是很方便修改。可以考慮不讓它
在後臺跑而是使用crontab來調用。這樣可以精確控制每臺客戶端的執行時間。分散
執行時間也可以減輕壓力
Puppet 的工作細節分成如下幾個步驟:
1、客戶端puppetd調用facter,facter會探測出這臺主機的一些變量如主機名、內
存大小、IP 地址等。然後puppetd把這些信息發送到服務器端。
2、服務器端的puppetmaster檢測到客戶端的主機名,然後會到manifest裏面對應
的node 配置,然後對這段內容進行解析,facter送過來的信息可以作爲變量進行處
理的,node 牽涉到的代碼才解析,其它的代碼不不解析,解析分幾個過程:語法檢
查、然後會生成一箇中間的僞代碼,然後再把僞代碼發給客戶機。
3、客戶端接收到僞代碼之後就會執行,客戶端再把執行結果發送給服務器。
4、服務器再把客戶端的執行結果寫入日誌。
二、  主從服務器安裝Puppet (中心端和客戶端相同)
1、   更改hostnam

 

#cat/etc/sysconfig/network

 

  1. NETWORKING=yes 
  2. NETWORKING_IPV6=no 
  3. HOSTNAME=puppet.test.com 
2、   安裝gcc和openssl
  1. yum  -y install *gcc* 
  2. yum  -y install openssl 
3、   安裝ruby

 

  1. mkdir  -p /fgn/soft/ && cd /fgn/soft/ 
  2. wget  http://ftp.ruby-lang.org/pub/ruby/1.8/ruby-1.8.7-p334.tar.gz 
  3. tar  zxvfruby-1.8.7-p334.tar.gz 
  4. cd  ruby-1.8.7-p334 
  5. ./configure&& make && make install 
4、   需要安裝的ruby
  • base64 
  • cgi 
  • digest/md5 
  • etc 
  • fileutils 
  • ipaddr 
  • openssl 
  • strscan 
  • syslog 
  • uri 
  • ebrick 
  • webrick/https 
  • xmlrpc/client

 

  1. for i in base64cgi digest/md5 etc fileutils ipaddr openssl strscan syslog uri webrick webrick/httpsxmlrpc/client 
  2. do 
  3. /usr/local/bin/ruby-r$i -e "puts:installed" 
  4. done 
5、   安裝facter

 

  1. cd .. 
  2. wget http://downloads.puppetlabs.com/facter/facter-1.5.8.tar.gz 
  3. tar  zxvf  facter-1.5.8.tar.gz 
  4. cd  facter-1.5.8 
  5. ruby  install.rb 
6、   安裝puppet

 

  1. cd .. 
  2. wget  http://downloads.puppetlabs.com/puppet/puppet-2.6.7.tar.gz 
  3. tar  zxvf  puppet-2.6.7.tar.gz 
  4. cd puppet-2.6.7 
  5. ruby  install.rb  --full --bindir=/usr/bin  --sbindir=/usr/sbin 
puppet中心端配置:
 
  1. if [ -e/etc/SuSE-release ]; then 
  2. cp  conf/suse/server.init  /etc/init.d/puppetmasterd 
  3. else 
  4. cp  conf/redhat/server.init  /etc/init.d/puppetmasterd 
  5. fi 
  6. groupadd  puppet 
  7. useradd -g puppetpuppet -M 
  8. chmod +x/etc/init.d/puppetmasterd 
  9. mkdir  -p  /var/lib/puppet/rrd 
  10. chown  puppet:puppet /var/lib/puppet/rrd/ 
  11. mkdir  -p  /var/run/puppet/ 
  12. chown  puppet:puppet  /var/run/puppet/ 
  13. chkconfig  --add  puppetmasterd 
  14. chkconfig  puppetmasterd on 
  15. /etc/init.d/puppetmasterdstart 
客戶端配置:
 
  1. if [ -e/etc/SuSE-release ]; then 
  2. cp conf/suse/client.init /etc/init.d/puppetd 
  3. else 
  4. cp conf/redhat/client.init /etc/init.d/puppetd 
  5. fi 
  6.  
  7. cat  <<EOF> /etc/puppet/puppet.conf 
  8. [main] 
  9. ssl_client_header =SSL_CLIENT_S_DN 
  10. ssl_client_verify_headerSSL_CLIENT_VERIFY 
  11. [agent] 
  12. listen = true 
  13. report = true 
  14. show_diff=true 
  15. runinterval = 300 
  16. server = puppet.test.com 
  17. ca_port = 8141 
  18. EOF 
  19.  
  20. cat<<EOF> /etc/puppet/namespaceauth.conf 
  21. [puppetrunner] 
  22. allow cloudcenter.test.net 
  23. EOF 
  24.  
  25. chmod +x/etc/init.d/puppetd 
  26. chkconfig  --add  puppetd 
  27. chkconfig  puppet on 
  28. ln -sf/usr/local/sbin/puppetd  /usr/sbin/puppetd 
  29. /etc/init.d/puppetd restart 
  30. echo "192.168.0.1     puppet.test.com   puppet">> /etc/hosts //IP爲中心端地址 

 

三、  配置中心端
1、    puppet 結構
|-- puppet.conf #主配置配置文件
|-- fileserver.conf#文件服務器配置文件
|-- auth.conf #認證配置文件
|-- autosign.conf #自動驗證配置文件
|-- tagmail.conf #郵件配置文件(將錯誤信息發送)
|-- manifests #文件存儲目錄(puppet 會先讀取該目錄的.PP 文件<site.pp>)
| |--nodes
| ||--puppetclient.pp
| |-- site.pp #定義puppet相關的變量和默認配置。
| |-- modules.pp #加載class類模塊文件(include syslog)
|-- modules #定義模塊
| |-- syslog #以syslog爲例
| |-- file
| |-- manifests
| | |-- init.pp
| |-- templates #模塊配置目錄
| | |-- syslog.erb#erb 模板

 

2、    配置文件

 

  1. cat<<EOF>/etc/puppet/auth.conf 
  2. path / 
  3. auth no 
  4. allow * 
  5. EOF 
  6.  
  7. cat<<EOF>/etc/puppet/autosign.conf 
  8. *.test.net 
  9. EOF 
  10.  
  11. cat <<EOF>/etc/puppet/fileserver.conf 
  12. [files] 
  13. path/etc/puppet/manifests/files 
  14. allow * 
  15. [moudles] 
  16. path/etc/puppet/modules 
  17. allow *.test.net 
  18. EOF 
  19.  
  20. cat<<EOF> /etc/puppet/puppet.conf 
  21. [main] 
  22. ssl_client_header = SSL_CLIENT_S_DN 
  23. ssl_client_verify_header = SSL_CLIENT_VERIFY 
  24. [master] 
  25. fileserverconfig = /etc/puppet/fileserver.conf 
  26. reports = http 
  27. reporturl = http://192.168.0.1:4000/reports 
  28. masterlog = /var/lib/puppet/log/puppetmaster.log 
  29. logdir = /var/lib/puppet/log 
  30. puppetdlog = /var/lib/puppet/log/puppetd.log 
  31. EOF 
  32.  
  33. echo "err:[email protected]> /etc/puppet/tagmail.conf 
  34. mkdir /etc/puppet/modules 
四、  用nginx來代理puppetmaster, 支持更多的客戶端訪問
1、   工作原理圖
2.png
優點

 

*性能:nginx因爲精簡,運行起來非常快速,許多人聲稱它的比pound更高效。
*日誌,調試:在這兩個方面,nginx比pound更簡潔。
*靈活性:nginx的處理SSL客戶端驗證是在應用層上實現的,而不會終止SSL連接。
*nginx可以拿來即用, 不需要像pound打補丁,同時配置的語法也很直觀。

 

缺點

 

*一但在服務端使用puppetca進行sgin以後,無法主動在服務端撤銷授權,
*不過你可以在客戶端刪除ssl目錄來取消授權,一般情況下沒什麼影響。

 

2、   安裝rubygem
  1. cd /fgn/soft/ 
  2. wget http://production.cf.rubygems.org/rubygems/rubygems-1.6.2.tgz 
  3. tar zxvf rubygems-1.6.2.tgz 
  4. cd rubygems-1.6.2 
  5. ruby setup.rb 
  6. gem installmongrel 
3、   安裝nginx和配置

 

  1. cd /fgn/soft/ 
  2. wget http://nginx.org/download/nginx-1.0.12.tar.gz 
  3. tar zxvfnginx-1.0.12.tar.gz 
  4. cd nginx-1.0.12 
  5. ./configure--with-http_stub_status_module --with-http_ssl_module 
  6. make  && make install 
  7. useradd daemon 

 

主服務器代理配置
cat /usr/local/nginx/conf/nginx.conf
  1. user  daemon daemon; 
  2. worker_processes  4; 
  3. worker_rlimit_nofile 65535; 
  4.  
  5. error_log       /var/log/nginx-puppet.log notice; 
  6. pid             /var/run/nginx-puppet.pid; 
  7.  
  8. events { 
  9.     use                 epoll; 
  10.     worker_connections  32768; 
  11.  
  12.  http { 
  13.   sendfile           on; 
  14.   tcp_nopush         on; 
  15.  
  16.   keepalive_timeout  300; 
  17.   tcp_nodelay        on; 
  18.  
  19.    ssl                     on; 
  20.    ssl_session_timeout     5m; 
  21.    ssl_certificate         /etc/puppet/ssl/certs/puppet.test.com.pem; 
  22.    ssl_certificate_key     /etc/puppet/ssl/private_keys/puppet.test.com.pem; 
  23.    ssl_client_certificate  /etc/puppet/ssl/ca/ca_crt.pem; 
  24.    ssl_crl                 /etc/puppet/ssl/ca/ca_crl.pem; 
  25.    ssl_ciphers             SSLv2:-LOW:-EXPORT:RC4+RSA; 
  26.    ssl_session_cache       shared:SSL:8m; 
  27.  
  28.   upstream puppetmaster { 
  29.         server 127.0.0.1:18140; 
  30.         server 127.0.0.1:18141; 
  31.         server 127.0.0.1:18142; 
  32.         server 127.0.0.1:18143; 
  33.   } 
  34.  
  35.   upstream dashboard { 
  36.     server 127.0.0.1:4000; 
  37.   } 
  38.  
  39.      log_format download '$remote_addr, $http_x_forwarded_for $remote_user [$time_local] $request_time $host "$request_method $request_uri $server_protocol" $status - $body_bytes_sent $bytes_sent $sent_http_content_length  "$sent_http_content_Range"   "$http_referer" "$http_user_agent" $sent_http_x_cache $sent_http_content_type' " up_addr:$upstream_addr" " up_resp:$upstream_response_time" "s" " up_status:$upstream_status" ; 
  40.  
  41.     access_log logs/access.log download; 
  42.  
  43.  #+--------------------------------------------------------------------------------------------+ 
  44.  
  45.     server { 
  46.  
  47.     listen 8140; 
  48.     server_name puppet.test.com; 
  49.     ssl_verify_client       on; 
  50.     root                    /etc/puppet; 
  51.  
  52.     # Ask the puppetmaster for everything else 
  53.  
  54.         # File sections 
  55.         location /production/file_content/files/ { 
  56.                 types { } 
  57.                 default_type application/x-raw; 
  58.                 alias /etc/puppet/manifests/files/; 
  59.         } 
  60.  
  61.         # Modules files sections 
  62. location ~ /production/file_content/modules/.+/ { 
  63.                 root /etc/puppet/modules; 
  64.                 types { } 
  65.                 default_type application/x-raw; 
  66.                 rewrite ^/production/file_content/modules/([^/]+)/(.+)$ /$1/files/$2 break; 
  67.         } 
  68.  
  69.          location / { 
  70.             proxy_pass          http://puppetmaster; 
  71.             proxy_redirect      off; 
  72.             proxy_set_header    Host             $host; 
  73.             proxy_set_header    X-Real-IP        $remote_addr; 
  74.             proxy_set_header    X-Forwarded-For  $proxy_add_x_forwarded_for; 
  75.             proxy_set_header    X-Client-Verify  SUCCESS; 
  76.             proxy_set_header    X-Client-DN      $ssl_client_s_dn; 
  77.             proxy_set_header    X-SSL-Subject    $ssl_client_s_dn; 
  78.             proxy_set_header    X-SSL-Issuer     $ssl_client_i_dn; 
  79.             proxy_read_timeout  65; 
  80.         } 
  81.  
  82.   }#server end 
  83.  
  84.      server { 
  85.         listen                  8141; 
  86.         ssl_verify_client       off; 
  87.         root                    /etc/puppet; 
  88.         access_log              /usr/local/nginx/logs/access-8141.log download; 
  89.  
  90.         # File sections 
  91.         location /production/file_content/files/ { 
  92.                 types { } 
  93.                 default_type application/x-raw; 
  94.                 alias /etc/puppet/manifests/files/; 
  95.         } 
  96.  
  97.          # Modules files sections 
  98. location ~ /production/file_content/modules/.+/ { 
  99.                 root /etc/puppet/modules; 
  100.                 types { } 
  101.                 default_type application/x-raw; 
  102.                 rewrite ^/production/file_content/modules/([^/]+)/(.+)$ /$1/files/$2 break; 
  103.         } 
  104.  
  105.          location / { 
  106.             proxy_pass  http://puppetmaster; 
  107.             proxy_redirect     off; 
  108.             proxy_set_header   Host             $host; 
  109.             proxy_set_header   X-Real-IP        $remote_addr; 
  110.             proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for; 
  111.             proxy_set_header   X-Client-Verify  FAILURE; 
  112.             proxy_set_header   X-Client-DN      $ssl_client_s_dn; 
  113.             proxy_set_header   X-SSL-Subject    $ssl_client_s_dn; 
  114.             proxy_set_header   X-SSL-Issuer     $ssl_client_i_dn; 
  115.             proxy_read_timeout  65; 
  116.         } 
  117.     } 
  118. }#http end 
*注意:puppet.test.com 部分爲hostname

 

4、   配置puppetmaster讓它啓動多個端口支持
cat /etc/sysconfig/puppetmaster
  1. # Location of the main manifest 
  2. #PUPPETMASTER_MANIFEST=/etc/puppet/manifests/site.pp 
  3.  
  4.  # Where to log general messages to. 
  5. # Specify syslog to send log messages to the system log. 
  6. PUPPETMASTER_LOG=/var/log/puppet/puppetmaster.log 
  7.  
  8. PUPPETMASTER_PORTS=( 18140 18141 18142 18143 ) 
  9. PUPPETMASTER_EXTRA_OPTS="--servertype=mongrel  --ssl_client_header=HTTP_X_SSL_SUBJECT" 
  10. # You may specify other parameters to the puppetmaster here 
  11. #PUPPETMASTER_EXTRA_OPTS=--noca 
重啓puppetmasterd和nginx

 

  1. /etc/init.d/puppetmasterdrestart 
  2. /usr/local/nginx/sbin/nginx 

 

5、   驗證

 

配置site.pp
 
  1. cat<<EOF> /etc/puppet/manifests/site.pp 
  2. node default { 
  3. file {"/tmp/temp1.txt": content => "hello,first puppetmanifest"; } 
  4. EOF 

 

客戶端運行:
 
  1. puppetd --test --serverpuppet.test.com 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章