为什么我的所有主机都在puppetmaster上安装为一个主机定义的包

时间:2014-08-23 01:07:57

标签: puppet

我是木偶的新手,我正在试图弄清楚如何让不同的主机安装不同的软件包,但我偶然发现了一个我无法弄清楚的问题。这些是我的体现:

我的site.pp

node default {
}

node 'debh3' inherits default {
}

node 'debh4' inherits default {
    import "db"
}

node 'master' inherits default {
}

我的db.pp

package { 'mysql-server':
    ensure => installed
}

service { 'mysql':
    ensure => true,
    enable => true,
    require => Package['mysql-server']
}

通过此设置,mysql-server上正在安装debh3

如果我将“import db”替换为db.pp内的实际代码,则mysql-server仅安装在debh4上(这是我之后的行为) )。

有没有人知道我在这里做错了什么?我已将其全部放在site.pp中以确保没有其他依赖项影响任何内容。

2 个答案:

答案 0 :(得分:1)

另请注意,import语句已弃用,即将从Puppet 4.0中删除。

您应该将代码移至模块。在这种情况下,您要创建一个db模块。

/etc/puppet/modules/db/manifests/install.pp

class db::install {
    package { 'mysql-server':
        ensure => installed
    }
}

in /etc/puppet/modules/db/manifests/service.pp

class db::service {
    include db::install
    service { 'mysql':
        ensure => true,
        enable => true,
        require => Class['db::install'],
    }
}

node块开始,您可以

include db::install
include db::service

甚至只包括db::service

您可以在一个类中同时拥有这两种资源,但通过多个类构建代码是一种很好的做法。

答案 1 :(得分:0)

进一步挖掘后,我在" import" https://docs.puppetlabs.com/puppet/latest/reference/lang_import.html上的文档:

  

导入语句具有以下特征:

     

他们阅读所请求文件的内容并将其代码添加到顶级范围

     

在解析清单中的任何其他代码之前处理它们

     

条件结构或节点/类定义

不能包含它们      

这些怪癖意味着清单中import语句的位置无关紧要。

这就说明了为什么我所做的不正确以及为什么会导致这种行为。至于解决方案,我将研究最佳实践并确定"正确"构建我的清单的方法。