如何运行嵌套Puppet模块?实现模块化自动化部署方案咨询
Puppet模块化实现代理安装自动化方案
一、模块目录结构
agent_installer/ ├── manifests/ │ ├── init.pp # 主入口,整合各代理类 │ ├── common.pp # 通用资源/配置 │ ├── agent_monitor.pp # 监控代理安装类 │ └── agent_logger.pp # 日志代理安装类 └── files/ ├── monitor_agent.tar.gz └── logger_agent.tar.gz
二、通用资源类(common.pp)
定义统一的临时工作目录,避免重复编写相同资源:
class agent_installer::common { file { '/tmp/agent_install': ensure => directory, mode => '0755', owner => 'root', group => 'root', } }
三、单个代理安装类示例(agent_monitor.pp)
每个代理的安装逻辑独立封装,方便单独调整:
class agent_installer::agent_monitor { # 依赖通用资源类,确保临时目录先创建 require agent_installer::common # 1. 从Puppetmaster复制tarball到客户端 file { '/tmp/agent_install/monitor_agent.tar.gz': ensure => present, source => 'puppet:///modules/agent_installer/monitor_agent.tar.gz', mode => '0644', owner => 'root', group => 'root', before => Exec['extract_monitor_agent'], } # 2. 解压tarball(仅当目标目录不存在时执行) exec { 'extract_monitor_agent': command => 'tar -xzf monitor_agent.tar.gz', cwd => '/tmp/agent_install', path => ['/bin', '/usr/bin'], creates => '/tmp/agent_install/monitor_agent', before => Exec['run_monitor_install'], } # 3. 执行安装脚本(仅当代理未安装时执行) exec { 'run_monitor_install': command => './install.sh', cwd => '/tmp/agent_install/monitor_agent', path => ['/bin', '/usr/bin'], creates => '/usr/local/bin/monitor_agent', before => File['/tmp/agent_install/monitor_agent.tar.gz'], } # 4. 清理原始tarball file { '/tmp/agent_install/monitor_agent.tar.gz': ensure => absent, require => Exec['run_monitor_install'], } }
四、主入口类(init.pp)
通过参数灵活控制要安装的代理,实现统一整合:
class agent_installer ( # 默认安装监控和日志代理,可按需修改 Array[String] $agents = ['monitor', 'logger'], ) { include agent_installer::common # 遍历代理列表,自动包含对应安装类 $agents.each |$agent| { include "agent_installer::agent_${agent}" } }
五、使用方式
在节点定义中按需调用主类即可:
# 给client01安装所有默认代理 node 'client01.example.com' { include agent_installer } # 给client02仅安装监控代理 node 'client02.example.com' { class { 'agent_installer': agents => ['monitor'], } }
核心优势
- 低耦合:单个代理的安装逻辑独立,修改某代理时不会影响其他代理
- 幂等性:通过
creates属性确保解压、安装操作仅执行一次,符合Puppet最佳实践 - 易扩展:新增代理只需添加对应的
agent_xxx.pp文件,在参数列表中加入代理名即可 - 清晰可控:主入口类统一管理所有代理,节点层面可灵活选择要安装的内容
内容的提问来源于stack exchange,提问作者Swampcritter
相关产品推荐
相关产品推荐

