我有一个主傀儡类,它被添加到我网络中的所有服务器,我们称之为:profile::base.pp:
class profile::base {
...
$agent_zbx_templates = ['OS Linux']
...
include profile::zabbix::agent
}
我为特定节点创建了层次文件:
classes:
- profile::haproxy
profile::haproxy.pp
我想在类$agent_zbx_templates
中添加一些定义profile::base.pp
,例如:
class profile::haproxy {
$local_agent_zbx_templates = $profile::base::agent_zbx_templates + ['APP HAProxy']
class {'profile::base':
agent_zbx_templates => $local_agent_zbx_templates
}
}
当然,当我尝试在节点上执行 puppet agent -t 时,我收到了:
[root@stress1 ~]# puppet agent -t
Info: Using configured environment 'production'
Info: Retrieving pluginfacts
Info: Retrieving plugin
Info: Loading facts
Error: Could not retrieve catalog from remote server: Error 500 on SERVER: Server Error: Evaluation Error: Error while evaluating a Resource Statement, Evaluation Error: Error while evaluating a Resource Statement, Duplicate declaration: Class[Profile::Base] is already declared; cannot redeclare at /etc/puppetlabs/code/environments/production/modules/profile/manifests/haproxy.pp:48 at /etc/puppetlabs/code/environments/production/modules/profile/manifests/haproxy.pp:48:3 on node stress1.lb.dc2
Warning: Not using cache on failed catalog
Error: Could not retrieve catalog; skipping run
我如何从另一个类更改 agent_zbx_templates(来自 profile::base)?
问候,第页
答案1
您不能在同一个节点上声明一个类两次。
但是,您可以添加节点或特定于环境的 hiera 文件。Hiera 会遍历层次结构并使用找到的第一个声明,而忽略后面的重复声明。
hiera.yaml:
:hierarchy:
- "node/%{::fqdn}"
- "environment/%{::environment}"
- ...
然后,在你的 hiera datadir 中创建文件夹node
,例如:/etc/puppetlabs/hieradata/node
。每当你将一个以 fqdn 为名称的 yaml 文件放入其中时,其中的类声明将被使用,而稍后相同类的声明将被忽略。
答案2
这个问题的标题和内容有什么关系?
这是唯一一个似乎相关的堆栈交换问题,所以我只在这里回答标题。
所以我做了这样的事:
模块/xyz/清单/init.pp
class xyz {
$xyz::x = 1
import xyzother
}
模块/xyzother/清单/init.pp
class xyzother {
notify{ "x = $xyz::x": }
}
Cannot assign to variables in other namespaces
并且它没有说出与你的标题完全相同的引述,但是你的问题中哪里有类似的内容?
因此对于我的问题,这并不明显,因为这是同一个命名空间,而不是另一个。但解决方案很简单……我做错的只是你不能在那里使用命名空间名称……只有在从另一个命名空间(例如 othermodule)读取值时才指定它。
xyz::
因此,只需从其已经是本地命名空间的位置删除即可。仅将其用于读取,而不是变量赋值。