我有一个为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命令,还可以更改creat,cwd和path。我可以将每个部分更改为$ {variable}并在Exec语句上面有一个case语句,该语句根据:: osgroup选择正确的变量,但我不确定这是否是处理此问题的最佳方法。有没有更好的方法来处理多OS模块?
答案 0 :(得分:2)
有时,根据您定位的操作系统,拥有不同的执行官会更好。请参阅https://github.com/puppetlabs/puppetlabs-puppet_agent作为一个很好的例子:
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'
}