IT技术博客大学习 共学习 共进步
全部 移动开发 后端 数据库 AI 算法 安全 DevOps 前端 设计 开发者

Puppet 的类参数传递

三斗室 2014-12-02 23:53:27 累计浏览 1,465 次
本机暂存

   之前使用 ENC 管理 puppet,尽量保持了输出 yaml 内容的简单,只提供了一个统一的全局参数定义 node 的 role。(题外话,puppetlabs 推荐了另一个通过继承关系实现 role 的示例,见:Designing Puppet - Roles and Profiles。)

   但是 puppet 中有些配置确实修改比较频繁,文件操作不得不说是一件不甚方便的事情,于是重新考虑通过类参数的方式来灵活化某些配置的操作。

修改前

nginx/manifests/init.pp

class nginx {
    include "nginx::${::role}"
}

nginx/manifests/loadbalancer.pp

class nginx::loadbalancer {
    $iplist = ['192.168.0.2:80']
    file { 'nginx.conf':
        content => template('nginx/nginx.conf.erb'),
    }
}

enc nginxhostname

---
classes:
  - nginx
  - base
environment: production
parameters:
  role: loadbalancer

修改后

nginx/manifests/init.pp

class nginx ($iplist = []) {
    class { "nginx::${::role}":
        iplist => $iplist
    }
}

nginx/manifests/loadbalancer.pp

class nginx::loadbalancer ($iplist = []) {
    file { 'nginx.conf':
        content => template('nginx/nginx.conf.erb'),
    }
}

enc nginxhostname

---
classes:
  nginx:
    iplist:
      - 192.168.0.2:80
  base: ~
environment: production
parameters:
  role: loadbalancer

要点

  • 虽然真正需要 $iplist 的是下面的一个子类,但是 ENC 传值是给的父类,所以需要一层层传递下去;

  • ENC 中给类传参,类就要写成哈希形式,否则是数组形式;

  • 有参数的类,在调用的时候无法使用 include 形式的写法,只能用资源调用形式的写法。

同分类推荐文章

  1. 从零重建 macOS 开发机:可复现的环境初始化流程 (2026-06-14 20:36:00)
  2. 百度物理网络监控工具开源第二弹:毫秒级监控工具 baize,让你的网络问题无处遁形 (2026-06-11 08:10:28)
  3. How to Set Up Homebrew Tap for Private CLI Tools: A Complete Guide (2026-05-27 02:13:03)

查看更多 DevOps 文章 →

建议继续学习

  1. 使用Apache 和Passenger来运行puppetmaster (累计阅读 8,318)
  2. 自动化运维之企业实际案例分析 (累计阅读 4,725)
  3. puppet使用rsync来同步文件教程 (累计阅读 4,214)
  4. DevOps之Puppet (累计阅读 3,973)
  5. 如何有效运行puppet cron任务以及如何触发运行puppet (累计阅读 3,852)
  6. puppet vagrant 管理VirtualBox 虚拟机 (累计阅读 3,566)
  7. puppet运维之使用自定义函数 (累计阅读 3,405)
  8. linux下源码包制作成rpm包教程 (累计阅读 3,396)
  9. 序列化格式YAML初探 (累计阅读 3,181)
  10. puppet extlookup 和puppet hiera使用 (累计阅读 3,141)