如何在Puppet中处理依赖项?

时间:2015-09-23 10:24:34

标签: vagrant puppet puphpet

在我的木偶戏中,我想使用dirtree函数,如

#don't know which syntax is right, but seems like both of them have no effect  
include AlexCline/dirtree
include AlexCline_dirtree

class sw_mage_deploy {
    $deploy_folder = '/var/www/html'

    file { dirtree($deploy_folder):
        ensure => directory,
        owner  => 'root',
        group  => 'root',
        mode   => 755,
    } 
} 

在我的Modulefile中我有

dependency 'AlexCline/dirtree', '>= 0.2.1'

但是我收到了错误:

==> default: Error: Unknown function dirtree at /tmp/vagrant-puppet/modules-bcfd
1f8b7eed950360c8143b9e421347/sw_mage_deploy/manifests/init.pp:15 on node vagrant
-vm

试过this文章,但似乎无关紧要。因为它涵盖了类包含,我需要方法包含。

作为一个附带问题,我非常感谢非常初学者的木偶教程链接,因为谷歌搜索并没有真正帮助,所有文档似乎都承认了一些我似乎错过的明显知识。

2 个答案:

答案 0 :(得分:2)

注意我当然不是一个傀儡大师,已经学习了几个月,因此无法真正解决教程,也可能没有使用最佳实践。

问题的第一部分:如何在Puppet中处理依赖关系

我知道两种方式:

  1. 使用http://librarian-puppet.com(我实际上并没有使用它,所以我可能需要更正),它将管理Modulefile中的依赖项,有点像你似乎描述的那样。将它与Vagrant一​​起使用,你需要安装和配置它(使用shell脚本) - a plugin存在管理这个部分,所以这肯定是一个很好的选择

  2. 目前,我通过正常的`puppet module install'来管理依赖关系。在shell脚本中。从Vagrant运行一个shell脚本,它将安装所有模块,puppet负责处理从单个模块声明的所有模块依赖项(如果有的话)。这种脚本的一个例子是

    #!/bin/bash
    
    mkdir -p /etc/puppet/modules;
    
    if [ ! -d /etc/puppet/modules/example42-perl ]; then
      puppet module install example42-perl --version 2.0.20
    fi
    
    if [ ! -d /etc/puppet/modules/puppetlabs-apache ]; then
      puppet module install puppetlabs-apache --version 1.5.0
    fi
    
    if [ ! -d /etc/puppet/modules/puppetlabs-java ]; then
      puppet module install puppetlabs-java --version 1.4.1
    fi
    
  3. 关于问题的第二部分:使用更脏的功能

    的问题
    • 将模块安装为任何其他模块puppet module install AlexCline-dirtree(如果您的主机上没有木偶,请使用您的VM并将/home/vagrant/.puppet/modules复制到您的共享文件夹/ vagrant / modules)
    • Vagrantfile

      中声明以下内容
      config.vm.provision :puppet do |puppet|
        puppet.manifests_path = "puppet/manifests"
        puppet.manifest_file = "base.pp"
        puppet.module_path = "puppet/modules"
        puppet.options = "--verbose --trace"
      end
      

    并确保您已使用已安装的模块创建了puppet/manifests/base.pp文件和puppet/modules目录

    • 定义你的木偶文件

      class sw_mage_deploy {
      
          $deploy_folder = "/var/www/html"
          $dirtree = dirtree($deploy_folder)
      
      #    file { ["$dirtree"] :
      #        ensure => directory,
      #        owner  => "root",
      #        group  => "root",
      #        mode   => 755;
      #    } 
      
          ensure_resource('file', $dirtree, {
              'ensure' => 'directory',
              owner  => "root",
              group  => "root",
              mode   => 755
          })
      
      
      } 
      
      include sw_mage_deploy
      

    $dirtree返回一个数组时,你不能直接在你的文件块中使用它(它会尝试将你的数组中的所有值连接成一个值)但是使用可以应用它的ensure_resource function对于资源数组

    确实,如果您不应用变量,则以下工作

    file { [ '/var/www',
             '/var/www/html',]:
               ensure => directory,
               ...
    

    可能有办法绑定要像这样使用的变量(这是一个数组),但我不知道如何。

答案 1 :(得分:1)

include()函数没有按照您的想法执行。它用于使Puppet 包含在目标节点的目录中。它与清单中的自定义函数的可用性无关,尽管这些函数是在Puppet模块中分发的。

此外,对于它的价值,你所呈现的表格中的看起来都不应该起作用。 Puppet也不应该接受,因为具有任何指定名称的类是否可以包括在内是值得怀疑的。

您的清单中不需要任何特殊代码即可使用自定义功能。你只需要打电话。但是,该函数必须首先安装到Puppet中,这与安装它所在的模块是一个单独的步骤(或者无论如何它都在某些版本的Puppet中)。对于在模块中分发的函数,这通常通过pluginsync来完成,但这取决于在puppetmaster服务器上运行Puppet代理。您可能需要在之后重新启动主服务器。