Linux Puppet 配置管理基础

1次阅读

根本原因是模块路径配置错误,puppet仅在默认路径(如/etc/puppetlabs/code/environments/production/modules)或–modulepath指定路径下查找模块;模块名须与目录名一致、小写无下划线,init.pp须位于manifests/子目录。

Linux Puppet 配置管理基础

为什么 puppet apply 总报错说找不到模块?

根本原因不是模块没写,而是 Puppet 默认只在 /etc/puppetlabs/code/environments/production/modules 或当前目录的 modules/ 下找——你把模块放错了位置,它就当不存在。

  • 检查模块路径:运行 puppet config print modulepath,看输出是否包含你放模块的实际目录
  • 临时指定路径更可靠:用 puppet apply --modulepath ./my_modules site.pp,避免依赖全局配置
  • 别用 git clone 直接扔进 modules/ 顶层:Puppet 要求每个模块是独立子目录,比如 modules/nginx/,而不是 modules/puppet-nginx/
  • 模块名必须和目录名完全一致(小写、无下划线),init.pp 必须在 modules/<strong>nginx</strong>/manifests/init.pp,否则 class nginx 就加载失败

如何让 file { '/etc/motd': } 真正生效而不被覆盖?

直接写资源声明容易被其他模块或系统服务抢写,关键在控制所有权和触发时机。

  • replace => true 强制覆盖,但要小心:如果 motd 是其他服务生成的(如 issue-generator),Puppet 每次运行都会把它打回原形
  • notify => Service['rsyslog'] 这类链式触发不适用;motd 不是服务,改完不用重启啥——重点是确保它不被后续流程覆盖
  • 更稳的做法:配合 exec 资源先停掉干扰进程,比如 exec { 'stop-motd-gen': command => '/bin/systemctl stop motd-news.service', path => ['/bin', '/usr/bin'] },再声明 file
  • 注意权限:Puppet 默认以 root 跑,但若用 --user 测试,file 资源会因权限不足静默失败,错误日志里只显示 “failed to set mode”

puppet agent -t 卡住不动,连 master 都没连上?

不是网络不通,大概率是证书或主机名没对上。Puppet 的 TLS 握手比 http 严格得多。

  • 先查证书状态:puppet cert list --all,如果 agent 主机名不在列表里,master 根本不会响应请求
  • 确认 /etc/puppetlabs/puppet/puppet.conf[agent] server = puppetmaster.local 的值,能 nslookup 解析,且和 master 的证书 CN 完全一致(大小写敏感)
  • 常见坑:用 IP 当 server 地址,但 master 证书是用域名签发的 → 不匹配,握手直接断开,-t 就卡在 “Applying configuration version” 前
  • 调试加 --debug,但别只扫日志末尾:关键线索在 “Could not request certificate: SSL_connect returned=1 errno=0 state=Error: certificate verify failed” 这一行

为什么 class 参数传进去,$myvar 在模板里还是空?

变量作用域没透过去,不是语法错,是 Puppet 的作用域继承规则在起作用。

  • 模板里用 ,前提是这个变量在调用 template() 的上下文中已定义;class nginx($myvar = 'default') { ... } 里的 $myvar 不自动暴露给模板
  • 正确做法:在 class 内显式传参,比如 content => template('nginx/vhost.erb') 改成 content => template('nginx/vhost.erb', { 'myvar' => $myvar })
  • 或者改用 scope.lookupvar('nginx::myvar'),但强耦合命名空间,维护性差
  • 注意:Hiera 数据自动注入只对 class 参数有效,对模板变量无效——别指望 hiera.yaml 里配了 nginx::myvar,模板就能直接用 @myvar

事情说清了就结束。Puppet 的坑不在语法多难,而在它把很多隐式约定(路径、证书、作用域、权限)绑得太紧,改一处常牵出三处失效。

text=ZqhQzanResources