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

为什么我的所有主机都要在puppetmaster上安装为一台主机定义的包,puppet,Puppet,我是puppet的新手,我正在尝试找出如何让不同的主机安装不同的软件包,但我偶然发现了一个我无法解决的问题。以下是我的清单: Mysite.pp: node default { } node 'debh3' inherits default { } node 'debh4' inherits default { import "db" } node 'master' inherits default { } Mydb.pp: package { 'mysql-server':

我是puppet的新手,我正在尝试找出如何让不同的主机安装不同的软件包,但我偶然发现了一个我无法解决的问题。以下是我的清单:

My
site.pp

node default {
}

node 'debh3' inherits default {
}

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

node 'master' inherits default {
}
My
db.pp

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

service { 'mysql':
    ensure => true,
    enable => true,
    require => Package['mysql-server']
}
通过此设置,
mysql服务器将安装在
debh3

如果我将“
import db
”替换为我的
db.pp
中的实际代码,那么
mysql服务器
只安装在
debh4
上(这是我所追求的行为)


有人知道我做错了什么吗?我已经把它全部放在
site.pp
中,以确保没有其他依赖项影响任何东西

进一步挖掘后,我在“导入”文档中找到了以下内容:

导入语句具有以下特征:

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

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

它们不能由条件结构或节点/类定义包含

这些怪癖意味着导入语句在清单中的位置无关紧要


这说明了为什么我所做的是不正确的,为什么它会导致这种行为。至于解决方案,我将研究最佳实践并确定构造清单的“正确”方式。

还要注意,
import
语句已弃用,即将从Puppet
4.0
中删除

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

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

class db::install {
    package { 'mysql-server':
        ensure => installed
    }
}
class db::service {
    include db::install
    service { 'mysql':
        ensure => true,
        enable => true,
        require => Class['db::install'],
    }
}
/etc/puppet/modules/db/manifests/service.pp

class db::install {
    package { 'mysql-server':
        ensure => installed
    }
}
class db::service {
    include db::install
    service { 'mysql':
        ensure => true,
        enable => true,
        require => Class['db::install'],
    }
}
节点
块,您可以

include db::install
include db::service
甚至只包括
db::service


您可以在一个类中同时使用这两种资源,但最好通过多个类来构造代码。

这不是答案-您应该编辑您的问题以包含其他发现。抱歉,我仍在寻找正确的答案,以解释为什么我使用的方法不正确。你回答我的问题比我好得多,所以我认为你的回答是正确的。非常感谢。谢谢你,我正试图确定正确的结构来让它工作,而类看起来就是这样。