在单独的类中定义的相同资源的重复声明

 济河南岸_797 发布于 2022-12-18 12:44

我有一个类定义,需要build-essential包:

class erlang($version = '17.3') {

  package { "build-essential": 
    ensure => installed
  }
  ...
}

不同模块中的另一个类也需要build-essential包:

class icu {

  package { "build-essential": 
    ensure => installed
  }
  ...
}

但是,当我尝试执行puppet apply时,我收到的错误是:

Error: Duplicate declaration: Package[build-essential] is already declared in file /vagrant/modules/erlang/manifests/init.pp:18; cannot redeclare at /vagrant/modules/libicu/manifests/init.pp:17 on node vagrant-ubuntu-trusty-64.home

我期望类封装他们使用的资源,但似乎并非如此?我该如何解决这个冲突?

2 个回答
  • 这是处理多个模块时的常见问题.

    有很多方法可以做到这一点,最好的做法是模块化并允许安装构建必需的参数:

    class icu ($manage_buildessential = false){
    
      if ($manage_buildessential == true) {
       package { "build-essential": 
         ensure => installed
       }
     }
    }
    

    然后,您想要包含您的ICU类:

    class {'icu':
       manage_buildessential => 'false',
    }
    

    但是,对于快速而肮脏的修复:

    if ! defined(Package['build-essential']) {
        package { 'build-essential': ensure => installed }
    }
    

    或者如果你有puppetlabs-stdlib模块:

    ensure_packages('build-essential')
    

    2022-12-18 12:46 回答
  • 如果您控制两个模块,则应编写第三个类(模块)来管理共享资源.

    class build_essential {
        package { 'build-essential': ensure => installed }
    }
    

    仅需要包的上下文

    include build_essential
    

    不要用12英寸的杆子接触定义的()功能.这条路上只会有痛苦.

    2022-12-18 12:46 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有