puppet on windows

puppet 是近年来崛起的运维神器,通俗的语法,简单的结构,利用puppet可以非常方便的进行批量部署,puppet是用ruby语言写的,可以跨平台,windows,linux,unix通吃,谓之"神器" 。


由于Linux是操作系统中的“明星”,Linux家族人丁旺盛,各种版本的Linux占据了相当份额的服务器市场,puppet在Linux上跑的非常顺畅。跟很多开源软件一样,尽管puppet也可以在windows上运行,实际上是个阉割版,属于二等公民。


又由于换了一份工作,我手头接管了一批windows机器,于是尝试在windows 2008 x64上部署puppet 客户端,减少装机时的重复劳动,服务端跑的仍然是Linux (centos 6)。


再者,puppet在windows上的资料目前还是很少的,官网资料也仅一页带过,希望本文对读者有所帮助。


由于puppetlabs上很少有现成windows模板可用,只得自己写规则啦。先写个简单的创建模板的脚本。


 
 
  1. #cat /etc/puppet/generate_module.sh  

  2. #!/usr/bin/env bash  

  3. #usage:generate_module.sh module-name  

  4. mkdir -p /etc/puppet/modules/$1/{manifests,templates,files}  

  5. touch /etc/puppet/modules/$1/manifests/init.pp  

  6. echo ""  

  7. echo -e  module $1 has been  generated  

  8. echo -e  see /etc/puppet/modules/$1 for detail.  

  9. #chmod 755 /etc/puppet/generate_module.sh  

要创建一个模板就运行 ./generate_module.sh xxx


下面仅列举几个实例来说明puppet在windows上的用法


需求一,安装nagios windows 客户端nsclient++

 
 


 
 
  1. #cat modules/windows-nscp/manifests/init.pp  

  2. class windows-nscp {  

  3.        if $operatingsystem == "windows" {  

  4.                file { "c:\\NSCP-0.4.0.183-x64.msi":  

  5. ensure => present,  

  6. source => "puppet:///modules/windows-nscp/NSCP-0.4.0.183-x64.msi",  

  7. notify => Package["nscp"],  

  8.                }  

  9.                package {"nscp":  

  10. ensure => installed,  

  11. provider => "msi",  

  12. source => "c:\\NSCP-0.4.0.183-x64.msi",  

  13. require => File["c:\\NSCP-0.4.0.183-x64.msi"],  

  14. notify => File["c:\\progra~1\\NSClient++\\nsclient.ini"],  

  15.                }  

  16.               file { "c:\\progra~1\\NSClient++\\nsclient.ini":  

  17. ensure => present,  

  18. source => "puppet:///modules/windows-nscp/nsclient.ini",  

  19. notify => Service["nscp"],  

  20.               }  

  21.                service {"nscp":  

  22. ensure => 'running',  

  23. enable => true,  

  24. require => Package["nscp"],  

  25.                }  

  26.                # due to memory leak,nscp need a daily restart  

  27.                scheduled_task {'daily stop nscp':  

  28. ensure => present,  

  29. enabled => true,  

  30. command => 'C:\\Windows\\System32\\net.exe',  

  31. arguments => 'stop nscp',

  32. trigger => {  

  33. schedule => daily,  

  34. every => 7,  

  35. start_date => '2012-12-21',  

  36. start_time => '17:00',  

  37.                        }  

  38.                }  

  39.                scheduled_task {'daily start nscp':  

  40. ensure => present,  

  41. enabled => true,  

  42. command => 'C:\\Windows\\System32\\net.exe',  

  43. arguments => 'start nscp',

  44. trigger => {  

  45. schedule => daily,  

  46. every => 7,  

  47. start_date => '2012-12-21',  

  48. start_time => '17:01',  

  49.                        }  

  50.                }  

  51.        }  

  52. }  

nscp不好伺候,代码很多,大致解释如下

1,从服务器上下载nscp安装包到c盘根目录

2,从c盘安装nscp软件包

3,搞定nscp配置文件内容(nsclient.log日志大小要注意)

4,启动服务

5,制定任务计划,定期重启nscp服务(经观察,nscp有些内存泄漏,我的机器一周后,nscp占内存近1G)


需求二,服务器上安装7zip压缩软件

这个相对简单,没有过多的麻烦

 
 
  1. # cat modules/windows-7z/manifests/init.pp

  2. class windows-7z {

  3.        if $operatingsystem == "windows" {

  4.                file { "c:\\7z920-x64.msi":

  5. ensure => present,

  6. source => "puppet:///modules/windows-7z/7z920-x64.msi",

  7. notify => Package["7z"],

  8.                }

  9.                package {"7z":

  10. ensure => installed,

  11. provider => "msi",

  12. source => "c:\\7z920-x64.msi",

  13. require => File["c:\\7z920-x64.msi"],

  14.                }

  15.        }

  16. }


需求三,管理服务(以防火墙服务为例)

如果没有远程管理卡,对于windows防火墙的误操作很容易将远程弄死,puppet客户端通过定时与服务器通信,可以帮你解锁。除非windows脚本,暂时没有发现puppet可以直接操作防火墙规则。

 
 
  1. class windows-firewall {

  2.        if $operatingsystem == "windows" {

  3.                service {"MpsSvc" :

  4. ensure =>'running',

  5. enable => true,

  6.                }

  7.        }

  8. }

这样一来,关键时刻将running改为stopped,就可以关闭防火墙了。

其他服务

 
 
  1. # cat modules/windows-spooler/manifests/init.pp

  2. class windows-spooler {

  3.        if $operatingsystem == "windows" {

  4.                service {'Spooler':

  5. ensure => 'stopped',

  6. enable => true,

  7.                }

  8.        }

  9. }

spooler对于服务器是个没用的服务,停掉!


需求四,管理注册表(以时间同步为例)

下面这个示例是抄的,在puppet 模块中可以找到,名称winntp


 
 
  1. # cat modules/winntp/manifests/init.pp

  2. class winntp (

  3.  $special_poll_interval    = 900, # 15 minutes

  4.  $ntp_server               = '10.1.1.36,10.1.1.37',

  5.  $max_pos_phase_correction = '0xFFFFFFFF', # unlimited

  6.  $max_neg_phase_correction = '0xFFFFFFFF') {

  7.  include 'registry'

  8.  service { 'w32time':

  9. ensure => 'running',

  10.  }

  11.  # Info on these settings at http://technet.microsoft.com/en-us/library/cc773263(v=ws.10).aspx

  12.  registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\Type':

  13. ensure => present,

  14. type   => 'string',

  15. data   => 'NTP',

  16. notify => Service['w32time'],

  17.  }

  18.  registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config\AnnounceFlags':

  19. ensure => present,

  20. type   => 'dword',

  21. data   => '5',

  22. notify => Service['w32time'],

  23.  }

  24.  registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpClient\SpecialPollInterval':

  25. ensure => present,

  26. type   => 'dword',

  27. data   => $special_poll_interval,

  28. notify => Service['w32time'],

  29.  }

  30.  registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\W32Time\TimeProviders\NtpServer\Enabled':

  31. ensure => present,

  32. type   => 'dword',

  33. data   => '1',

  34. notify => Service['w32time'],

  35.  }

  36.  registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Parameters\NtpServer':

  37. ensure => present,

  38. type   => 'string',

  39. data   => $ntp_server,

  40. notify => Service['w32time'],

  41.  }

  42.  registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config\MaxPosPhaseCorrection':

  43. ensure => present,

  44. type   => 'dword',

  45. data   => $max_pos_phase_correction,

  46. notify => Service['w32time'],

  47.  }

  48.  registry_value { 'HKLM\SYSTEM\CurrentControlSet\Services\W32Time\Config\MaxNegPhaseCorrection':

  49. ensure => present,

  50. type   => 'dword',

  51. data   => $max_neg_phase_correction,

  52. notify => Service['w32time'],

  53.  }

  54. }


说明

1、linux和windows文件存在字符集不同的问题,如果你想让linux上的puppet管理windows上的文件内容,最好的办法是在windows上将示例文件上传,比如上文的nsclient.ini

2、文件/etc/puppet/modules/windows-7z/files/7z920-x64.msi 在puppet语法中的表示方法为puppet:///modules/windows-7z/7z920-x64.msi ,实际路径中的files被省略了,卖个关子,不解释。

3、puppet目前能安装的软件必须是msi格式的,且必须是本地安装,也不支持exe

4、路径问题,c:\test.txt 应该写成c:\\test.txt,因为\在Linux中是转义的意思。

5、如果是默认安装,puppet windows客户端配置文件在c:\programdata/puppetlabs/puppet/etc/puppet.conf,且内容要改,具体是pluginsync=false

6、暂时就这么多了



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值