Назад | Перейти на главную страницу

Невозможно присвоить переменным в других пространствах имен

У меня есть основной класс марионеток, который добавляется ко всем серверам в моей сети, назовем его: 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
   }
}

И, конечно же, когда я пытаюсь использовать марионеточный агент -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) из другого класса?

С уважением, стр.

Вы не можете объявить класс дважды на одном и том же узле.

Однако вы можете добавить файл hiera для конкретного узла или среды. Хиера проходит по иерархии и использует первое найденное объявление, игнорируя более поздние повторяющиеся.

hiera.yaml:

:hierarchy:
  - "node/%{::fqdn}"
  - "environment/%{::environment}"
  - ...

Затем создайте папку node в вашем hiera datadir, например: /etc/puppetlabs/hieradata/node. Всякий раз, когда вы помещаете туда yaml-файл с именем fqdn, объявления классов в нем будут использоваться, а объявления того же класса позже игнорируются.