puppet-如何调试和测试模块是否正常工作

puppet-如何调试和测试模块是否正常工作,puppet,Puppet,我编写了一个简单的模块,在Ubuntu虚拟机上安装一个包(BioPerl)。整个init.pp文件如下所示: 问题是它不起作用,它没有给我反馈让我知道为什么它不起作用。本模块中有3个简单步骤。我检查了一下,没有发现任何问题。以下是前两条: 步骤1:下载存档并将其保存到/usr/local/lib exec { 'bioperl-download': command => "sudo /usr/bin/wget --no-check-certificate -O ${archi

我编写了一个简单的模块,在Ubuntu虚拟机上安装一个包(BioPerl)。整个init.pp文件如下所示:

问题是它不起作用,它没有给我反馈让我知道为什么它不起作用。本模块中有3个简单步骤。我检查了一下,没有发现任何问题。以下是前两条:

步骤1:下载存档并将其保存到/usr/local/lib

  exec { 'bioperl-download':
    command => "sudo /usr/bin/wget --no-check-certificate -O ${archive_path} ${package_uri}",
    require => Package['wget']
  }
步骤2:提取存档文件

  exec { 'bioperl-extract':
    command => "sudo /usr/bin/tar zxvf ${archive_path} --directory ${install_path}; sudo rm ${archive_path}",
    require => Exec['bioperl-download']
  }
很简单。但我不知道问题出在哪里,因为我看不到它在做什么。provisioner设置为详细模式,下面是我的模块的输出行:

==> default: Notice: /Stage[main]/Bioperl/Exec[bioperl-download]/returns: executed successfully
==> default: Notice: /Stage[main]/Bioperl/Exec[bioperl-extract]/returns: executed successfully
==> default: Notice: /Stage[main]/Bioperl/Exec[bioperl-path]/returns: executed successfully
所以我只知道它成功地执行了这三个步骤。它没有告诉我这些步骤是否正确地完成了它们的工作。我知道它没有将归档文件下载到
/usr/local/lib
目录,也没有将环境变量文件添加到
/usr/profile.d
。可能问题在于包含目录的变量是错误的。可能包含存档下载URI的变量是错误的。我怎样才能找到这些东西

更新:

结果证明该模块确实有效。但为了改进模块(因为我想将其上传到
forge.puppetlabs.com
),我尝试实施Matt建议的更改。以下是新代码:

  file { 'bioperl-download':
    path => "${archive_path}",
    source => "http://cpan.metacpan.org/authors/id/C/CJ/CJFIELDS/${archive_name}",
    ensure => "present"
  }

  exec { 'bioperl-extract':
    command => "sudo /bin/tar zxvf ${archive_name}",
    cwd => "${bioperl_target_dir}",
    require => File['bioperl-download']
  }
一个问题:它给了我一个错误,告诉我源代码不能是
http://
。我在文档中看到,他们确实允许
http://
文件作为
文件
资源的源代码。也许我使用的是旧版本的puppet


我想试用
puppet archive
模块,但我不确定如何将其设置为必需的依赖项。我的意思是如何确保首先安装它。我需要让我的模块从github下载模块并将其保存到模块目录中吗?还是有办法让puppet自动安装?我将其添加为对
metadata.json
文件的依赖关系,但这并没有安装它。我知道我可以让我的模块下载包,但我想知道这方面的最佳实践是什么。

您描述的最初问题是验收测试。验证您编写的Puppet资源和代码是否确实产生了预期的最终结果您想要的ate通常是通过Serverspec完成的。例如,您可以编写一个Puppet模块来部署应用程序,但您只知道Puppet执行了您告诉它的操作,而不知道应用程序实际已成功部署。请注意,对于Ansible和Chef,Serverspec也是人们通常用来解决此问题的工具

您可以编写类似于以下内容的Serverspec测试,以帮助测试模块的最终状态:

describe file('/usr/local/lib/bioperl.tar.gz') do
  it { expect(subject).to be_file }
end

describe file('/usr/profile.d/env_file') do
  it { expect_subject).to be_file }
  its(:content) { is_expected.to match(/env stuff/) }
end
但是,您的问题似乎也与调试验收测试失败的原因有关。为此,您需要进行单元测试。这通常通过RSpec Puppet解决:。我将向您展示如何针对您的情况编写一些测试,但我认为您不应该像以前那样编写Puppet模块,因此它将呈现单元测试相关的

< >请考虑使用<代码>文件>代码>资源,使用<代码>源代码/代码>属性和HTTP URI来获取TabLo球,而不是使用<代码> WGET > <代码> Ex> <代码>:此外,您可能需要考虑使用傀儡存档模块来帮助您:
如果您对如何使用这些工具提供单元测试和验收测试有疑问,或者对如何重构模块有疑问,那么请毫不犹豫地就StackOverflow撰写后续问题,我们可以为您提供帮助。

我尝试了您的一些建议,但遇到了一些问题。我更新了原始帖子。结果是模块实际上是可以工作的,但我想实现您建议的更改,使其更符合最佳实践。@Horso'Houlihan对于第一个,您使用的是什么版本的Puppet?对于第二个,您可以使用
Puppet模块安装
,并使用
metadata.json
检查依赖关系是否与您一样满意做。