puppet - 如何调试和测试以查看您的模块是否正常工作

时间:2016-12-23 18:15:15

标签: puppet

我写了一个简单的模块来在Ubuntu VM上安装软件包(BioPerl)。整个init.pp文件在这里: https://gist.github.com/anonymous/17b4c31bf7309aff14dfdcd378e44f40

问题是它不起作用,它没有给我任何反馈,让我知道它为什么不起作用。模块中有3个简单的步骤。我查了一下,它没有做任何一件事。继承人的第一个2:

步骤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']
  }
很简单。但我不知道问题出在哪里,因为我无法看到它的作用。配置器设置为详细模式,这是我模块的输出行:

==> 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://个文件作为file资源的来源。也许我使用旧版本的木偶?

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

1 个答案:

答案 0 :(得分:1)

您描述的最初问题是验收测试。验证您编写的Puppet资源和代码实际上是否导致所需的最终状态通常通过Serverspec:http://serverspec.org/完成。例如,您可以编写Puppet模块来部署应用程序,但您只知道Puppet执行了您告诉它的操作,而不是应用程序实际上已成功部署。注意Serverspec也是人们通常用来为Ansible和Chef解决这个问题的方法。

您可以编写类似于以下内容的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解决:http://rspec-puppet.com/。我会告诉你如何为你的情况编写一些测试,但我不认为你应该按照你的方式编写你的Puppet模块,因此它会使单元测试无关紧要。

相反,请考虑使用file资源和source属性以及HTTP URI来抓取tarball而不是exec wgethttps://docs.puppet.com/puppet/latest/type.html#file-attribute-source 。另外,您可能需要考虑使用Puppet存档模块来帮助您:https://forge.puppet.com/puppet/archive

如果您对如何使用这些工具提供单元和验收测试有疑问,或者对如何重构模块有疑问,请不要犹豫,在StackOverflow上编写后续问题,我们可以为您提供帮助。< / p>