我如何处理 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 中的依赖关系
我知道两种方法:
使用 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 来管理这部分所以这肯定是一个不错的选择
目前,我在 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 代理 运行。之后您可能需要重新启动主机。
在我的人偶清单中,我想使用 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 中的依赖关系
我知道两种方法:
使用 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 来管理这部分所以这肯定是一个不错的选择
目前,我在 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 代理 运行。之后您可能需要重新启动主机。