如何处理人偶模块中的 linux 和 windows?

How to handle linux and windows in puppet modules?

我有一个为 linux 系统编写的大型模块。但我需要它为 windows 工作,所以我想重写它来处理这两个问题。

有很多清单,据我目前所见,其中大部分应该可以用于 Windows,因为人偶会在 windows 上看到它是 运行 和 select最好的供应商。

但是有些部分无法正常工作。例如,此 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 模块?

有时,根据您的目标 OS 拥有不同的执行官会更好。请参阅 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'
    }