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

Переменные марионетки не всегда работают

Я хочу применить принцип «СУХОЙ» (не повторяйтесь) в node.pp, группируя машины, например Машины RH5 и RH6 вместо добавления нескольких строк включений для всех серверов RH5 и RH6.

Puppet на tst-01 отлично работает при использовании:

node "tst-01" inherits basenode {

Но это ломается, когда я пытаюсь организовать серверы в группы с такой конфигурацией:

node "tst-01" inherits redhat6server {

Ошибка с "наследуется redhat6server":

err: Could not retrieve catalog; skipping run
[root@tst-01 ~]# puppet agent --test
err: Could not retrieve catalog from remote server: Error 400 on SERVER: Failed to parse template ldap/access.conf: Could not find value for 'netgroup' at 124:/etc/puppet/modules/ldap/templates/access.conf at /etc/puppet/modules/ldap/manifests/init.pp:82 on node tst-01.tst.it.test.com
warning: Not using cache on failed catalog
err: Could not retrieve catalog; skipping run

Это файл access.conf, который отлично работает, если для параметра "наследство" установлено значение "наследует базовый узел".

[root@puppet]# grep -v "#" /etc/puppet/modules/ldap/templates/access.conf 
+ : root : LOCAL
+ : @<%= netgroup %> : ALL
- : ALL : ALL
[root@puppet]# 

Это конфигурация в /etc/puppet/manifests/nodes.pp.

# Basenode configuration
node "basenode" {
        include resolv_conf
        include sshd
        include ntpd
        include motd
}

# Groups
node "redhat6server" inherits basenode {
        include ldap_auth
}

# Testservers
node "tst-01" inherits redhat6server {
        $netgroup = tst-01
}

Вероятно, это не удается, потому что происходит наследование перед то $netgroup переменная оценивается, и поэтому компиляция каталога не выполняется. Однако, используя этот метод для отделить код от данных имеет ограничения и следует избегать.

Я изменил код марионетки для использования иерархические данные для привязки данных и для достижения того же эффекта группировки похожих узлов. Упрощенный пример, предполагающий, что вам нужно только сгруппировать серверы RHEL, будет:

  • Иерархические данные будут извлечены с использованием следующего определения:

    hiera.yaml
    ---
    :backends: 
      - yaml
    :hierarchy:
      - %{::operatingsystem}
      - %{::hostname}
      - common
    :yaml:
      :datadir: /etc/puppet/hieradata/
    

    Обе operatingsystem и hostname являются facts. Хиера попытается разрешение данных в этом порядке для системы Red Hat с именем хоста some-rhel-hostname:

    • RedHat.yaml
    • some-rhel-hostname.yaml
    • common.yaml

  • Ожидается следующая структура каталогов и файлов:

    /etc/puppet/hieradata/
    ├── common.yaml
    ├── RedHat.yaml
    ├── some-rhel-hostname.yaml
    └── tst-01.yaml
    
  • Содержимое примеров файлов yaml:

    common.yaml
    ---
    classes:
      - resolv_conf
      - sshd
      - ntpd
      - motp
    
    RedHat.yaml
    ---
    classes:
      - ladp_auth
    
    some-rhel6-hostname.yaml
    ---
    classes:
      - this_host_only
    ldap_auth::netgroup: foo-bar
    
    tst-01.yaml
    ---
    ldap_auth::netgroup: tst-01
    
    nodes.pp
    default {
        hiera_include(classes)
    }
    

    Обратите внимание на использование hiera_include функция, который вернет массив все значения для каждого узла (из common.yaml и исходящие из разрешения иерархии, т. е. some-rhel-hostname будет включать все классы из common.yaml плюс ldap_auth из RedHat.yaml и this_host_only из собственного файла yaml).

    Использование привязок данных в ваших модулях выполняется по-разному в зависимости от того, какая версия puppet ты используешь. Проверьте Вот для указателей.