无法分配给其他命名空间中的变量

无法分配给其他命名空间中的变量

我有一个主傀儡类,它被添加到我网络中的所有服务器,我们称之为: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::因此,只需从其已经是本地命名空间的位置删除即可。仅将其用于读取,而不是变量赋值。

相关内容