Как определить несколько записей /etc/hosts с помощью Puppet ENC?

Я пишу классификатор внешних узлов для своей инфраструктуры Puppet, и мне нужно манипулировать /etc/hosts файл на каждом узле. Следующее (из-за дублирующего ключа) недопустимый YAML:

---
  host:
    name: www1.example.com
    host_aliases: www1
    ip: 1.2.3.4
  host:
    name: www2.example.com
    host_aliases: www2
    ip: 1.2.3.5

Я вижу этот связанный ответ, который имеет следующий код:

host {
  # Public IPs - eth0
  'front-01': ip => '192.168.1.103';
  'front-02': ip => '192.168.1.106';

  # Private IPs - eth1
  'priv0-0': ip => '192.169.40.201';
  'priv0-1': ip => '192.169.40.202';
  'priv1-0': ip => '192.169.40.207';
  'priv1-1': ip => '192.169.40.208';

  # Virtual IPs - eth0:1
  'vip-01': ip => '192.169.50.202';
  'vip-02': ip => '192.169.50.205';
}

Тем не мение,

  1. Для меня не сразу очевидно, что на самом деле здесь происходит.
  2. Я не могу найти документацию для этого нигде.
  3. Поскольку эти (не похожи) параметры класса - и из-за № 1 и № 2 выше - мне также не очевидно, как я могу перевести это в YAML.

Наивное предположение будет:

'host':
  'www1':
    'ip': 1.2.3.4
  'www2':
    'ip': 1.2.3.5

Но из-за № 2 выше, мне не комфортно двигаться вперед с этим в производстве. Мой вопрос тогда:

Где я могу найти документацию по использованию хост-класса таким образом?

Или если это не удастся

Как еще я могу управлять несколькими /etc/hosts записи с ENC?

NB. Эти определения используются для быстрой настройки переходных многоузловых кластеров в API облачных сервисов для целей разработки и тестирования, поэтому, хотя я не совсем хочу исследовать решение на основе DNS (или другую альтернативу), управление /etc/hosts таким образом (если это возможно) гораздо более простое решение с гораздо меньшим количеством движущихся частей.


РЕШЕНИЕ: здесь для справки опубликован мой окончательный код:

class my_hosts(
  $hosts = {
    'localhost.localdomain' => {
      'ensure'       => 'present',
      'name'         => 'localhost.localdomain',
      'host_aliases' => 'localhost',
      'ip'           => '127.0.0.1',
    },
  },
  ) {

  create_resources host, $hosts

}

И тогда мой ENC YAML выглядит так:

classes:
  my_hosts:
    hosts:
      www1.example.com:
        ensure: present
        name: www1.example.com
        host_aliases: www1
        ip: 10.0.0.101
      www2.example.com:
        ensure: present
        name: www2.example.com
        host_aliases: www2
        ip: 10.0.0.102

1 ответ

Решение

Объявление 1 и 2:

host {
  'front-01': ip => '192.168.1.103';
  'front-02': ip => '192.168.1.106';
}

это просто сокращенное обозначение для

host { 'front-01':
  ip => '192.168.1.103',
}
host { 'front-02':
  ip => '192.168.1.106',
}

Объявление 3:

Когда у вас есть запись данных YAML, как это:

custom_hosts:
  www1:
    ip: 1.2.3.4
  www2:
    ip: 1.2.3.5
    comment: other attributes work also
  www3:
    name: testserver
    ip: 1.2.3.6

Вы можете загрузить его в хэш куклы, а затем создать ресурсы из него

$custom_hosts = hiera('custom_hosts',{})
create_resources(host, $custom_hosts)

Это дает тот же результат, что и:

host { 'www1':
  ip => '1.2.3.4',
}
host { 'www2':
  ip      => '1.2.3.5',
  comment => 'other attributes work also',
}
host { 'www3':
  name => 'testserver',
  ip   => '1.2.3.6',
}

Поэтому эти строки должны быть записаны в /etc/hosts:

1.2.3.4 www1
1.2.3.5 www2 # other attributes work also
1.2.3.6 testserver
Другие вопросы по тегам