You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何运行嵌套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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 06:02:51