2015-10-09 20 views
2

我有一個爲Linux系統編寫的大型模塊。但我需要它爲Windows工作,所以我想重寫它來處理兩者。如何在puppet模塊中處理linux和windows?

有很多清單,從我目前可以看到的內容來看,大多數應該可以與Windows一樣好,因爲木偶會看到它在Windows上運行並選擇最佳提供程序。

但是有些部分不起作用。作爲一個例子這Exec將無法在Windows

exec { 'touch_file' : 
     command => 'touch /etc/test.txt', 
     path => ['/bin', '/usr/bin'], 
     cwd  => '/tmp', 
     creates => '/etc/test.txt', 
    } 

工作,這將在Linux下工作,但在Windows我會改變這一個PowerShell命令,改變造成的,CWD和路徑。我可以將每個部分更改爲$ {variable},並在Exec語句上方有一個case語句,它根據:: osgroup選擇正確的變量,但我不確定這是否是處理此問題的最佳方法。有更好的方法來處理多個OS模塊嗎?

回答

2

有時根據您定位的操作系統有不同的執行體會更好。見https://github.com/puppetlabs/puppetlabs-puppet_agent作爲一個很好的例子:

https://github.com/puppetlabs/puppetlabs-puppet_agent/blob/f76482b2b68bd80115de87037ba71068bea4e35b/manifests/init.pp#L36-L46

if $::osfamily == 'windows' { 
     class { '::puppet_agent::prepare': } -> 
     class { '::puppet_agent::windows::install': } 
    } 
    else { 

     if $::operatingsystem == 'SLES' and $::operatingsystemmajrelease == '10' { 
     $_package_file_name = "${puppet_agent::package_name}-${puppet_agent::params::master_agent_version}-1.sles10.${::architecture}.rpm" 
     } elsif $::operatingsystem == 'Solaris' and $::operatingsystemmajrelease == '10' { 
     $_package_file_name = "${puppet_agent::package_name}-${puppet_agent::params::master_agent_version}-1.i386.pkg.gz" 
     } 

     class { '::puppet_agent::prepare': 
     package_file_name => $_package_file_name, 
     } -> 
     class { '::puppet_agent::install': 
     package_file_name => $_package_file_name, 
     } -> 
     class { '::puppet_agent::service': } 

     contain '::puppet_agent::prepare' 
     contain '::puppet_agent::install' 
     contain '::puppet_agent::service' 
    } 
+0

聽起來不錯。我會以木偶代理人爲例。乾杯 – Glef