如何在puppet模块中处理linux和windows?

时间:2015-10-09 10:53:44

标签: 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命令,还可以更改creat,cwd和path。我可以将每个部分更改为$ {variable}并在Exec语句上面有一个case语句,该语句根据:: osgroup选择正确的变量,但我不确定这是否是处理此问题的最佳方法。有没有更好的方法来处理多OS模块?

1 个答案:

答案 0 :(得分: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'
    }