能否在同一份Puppet清单中安装stdlib模块并使用其资源?
问题:能不能在同一份Puppet清单里先装stdlib模块,再用它的资源?
你的需求是用Puppet修改nginx配置中的ULIMIT值为3000,用到了stdlib模块提供的file_line资源,于是尝试在同一份清单里用exec先安装stdlib,再调用资源,但执行时出现了Could not find class stdlib错误。这么做行不通,原因如下:
报错根源
Puppet执行清单分编译阶段和运行阶段:
- 编译阶段:先解析整个清单,加载所有引用的类、资源定义。这时候
exec还没运行,stdlib模块没装上,自然找不到stdlib类,直接报错终止。 - 运行阶段:才会执行
exec这类实际跑命令的资源,但这一步在编译报错后根本轮不到执行。
你清单里的notify和refreshonly没用,因为class { 'import_stdlib': }会在编译阶段就被处理,此时stdlib还未安装,必然报错。
解决办法
方法一:提前安装stdlib(最推荐)
先手动执行模块安装命令:
puppet module install puppetlabs-stdlib
然后简化清单,去掉安装模块的部分,直接使用资源:
class import_stdlib { include stdlib file_line { 'modify_nginx_config': ensure => present, line => 'ULIMIT="-n 3000"', match => '^ULIMIT.*$', path => '/etc/default/nginx', } } class { 'import_stdlib': }
方法二:分两次执行清单(适合自动化场景)
如果必须通过清单完成安装,拆成两个步骤:
- 第一步:执行仅安装模块的清单(例如命名为
install_stdlib.pp)
exec { 'install_puppetlabs_stdlib': command => '/usr/bin/puppet module install puppetlabs-stdlib', unless => '/usr/bin/puppet module list | grep puppetlabs-stdlib', path => ['/bin', '/opt/puppet/bin', '/usr/bin'], }
执行命令:
puppet apply install_stdlib.pp
- 第二步:执行修改配置的清单(例如命名为
modify_nginx.pp)
include stdlib file_line { 'modify_nginx_config': ensure => present, line => 'ULIMIT="-n 3000"', match => '^ULIMIT.*$', path => '/etc/default/nginx', }
执行命令:
puppet apply modify_nginx.pp
内容的提问来源于stack exchange,提问作者Titus Cheserem
相关产品推荐
相关产品推荐

