我如何处理 Puppet 中的依赖项?

How do I handle dependencies in Puppet?

在我的人偶清单中,我想使用 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,
    } 
} 

在我的模块文件中有

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 篇文章,但似乎无关紧要。因为它涵盖了 class 包含并且我需要方法包含。

作为附带问题,我非常感谢 link 为非常初学者提供木偶教程,因为谷歌搜索并没有真正帮助,而且所有文档似乎都承认一些我似乎错过的明显的最低限度知识。

注意我当然不是木偶大师,学习了几个月,所以不能真正解决教程,可能不会使用最佳实践。

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

我知道两种方法:

  1. 使用 http://librarian-puppet.com (I do not really use it mylself so I might need to be corrected) which will manage dependencies from a Modulefile, a bit like you seem to describe. Using it with Vagrant, you need to install and configure it (using shell script) - a plugin exists 来管理这部分所以这肯定是一个不错的选择

  2. 目前,我在 shell 脚本中通过正常的“puppet 模块安装”管理依赖项。 运行 来自 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
    

关于问题的第二部分:使用更脏函数的问题

  • 像安装任何其他模块一样安装该模块 puppet module install AlexCline-dirtree(如果您的主机上没有 puppet,请使用您的 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 returns 数组,您不能直接在文件块中使用它(它会尝试将数组中的所有值连接成一个值)但使用 ensure_resource function 可以将其应用于资源数组

确实,如果你不应用变量,下面的工作

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

可能有绑定变量(数组)这样使用的方法,但我不知道怎么做。

include() 函数并不像您想象的那样。它用于使 Puppet classes 包含在目标节点的 catalog 中。它与清单中自定义函数的可用性无关,尽管这些函数分布在 Puppet 模块中。

此外,就其价值而言, 您提供的表格中没有一个看起来应该有效。 Puppet 不应接受任何一个,因为具有任一指定名称的 class 是否可用于包含是值得怀疑的。

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