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

Как исключить модули Puppet для нескольких узлов?

У меня 80 узлов, на 78 нужен конкретный модуль, кроме 2.

[root@puppetmaster puppet]# cat hiera.yaml
:backends:
    - yaml

:hierarchy:
    - environment/%{::environment}/%{::hostname}
    - environment/%{::environment}
    - common

:logger: console

:yaml:
    :datadir: '/etc/puppet/hieradata'
[root@puppetmaster puppet]# cat hieradata/common.yaml
---
classes:
  - ldap
  - motd
  - ntp
  - puppet-conf
[root@puppetmaster puppet]# cat hieradata/environment/tst/tst-01.yaml
---
classes:
  - puppet-update
  - public-keys
[root@puppetmaster puppet]#

я хочу все узлы должны иметь модуль ldap, за исключением серверов tst-01 и tst-02.

Как мне исключить этот модуль из этих двух серверов?

Решением было бы использовать 80 .yaml-файлов для всех узлов и добавить «-ldap» к 78 из этих .yaml-файлов, но это кажется плохим дизайном. Было бы чище исключить модули из унаследованного списка.

Вы можете использовать что-то подобное в своем nodes.pp:

node default {
  hiera_include('classes')
}

node /^tst-0(1|2)\.example\.com$/ inherits default {
}

node /.*example\.com$/ inherits default {
  include ldap
}

Проблема в том, что hiera_include будет использовать классы со всех уровней (вероятно, использует hiera_array).

Вероятно, это сработает:

[root@puppetmaster puppet]# cat hieradata/common.yaml
---
classes:
  - ldap
  - motd
  - ntp
  - puppet-conf
[root@puppetmaster puppet]# cat hieradata/environment/tst/tst-01.yaml
---
classes:
  - puppet-update
  - public-keys
  - motd
  - ntp
  - puppet-conf

В node-def:

class { hiera('classes'): }

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

Это помогает?