Как лучше всего добавить в Puppet фрагмент текста в файл /etc/hosts?

Также хотелось бы сохранить возможность вручную редактировать hosts-файл, хотя бы первые 10 строк.

#Public IP's - eth0
192.168.1.103   front-01
192.168.1.106   front-02

#Private IP's - eth1
192.169.40.201  priv0-0
192.169.40.202  priv0-1
192.169.40.207  priv1-0
192.169.40.208  priv1-1

#Virtual IP's - eth0:1
192.169.50.202  vip-01
192.169.50.205  vip-02

Иметь эти записи хостов внизу /etc/hosts, было бы идеально. Каков наилучший способ сделать это? Есть ли лучший способ, чем написание 8 хост-строк манифеста?

# create a simple hostname and ip host entry
host { 'front-01':
    ip => '192.168.1.103',
}

Могут быть группы серверов, которым требуются разные IP-адреса / имена хостов в их /etc/hosts. Я бы использовал шаблон, но это означает, что люди больше не могут вносить ручные изменения в свои /etc/hosts, так как они будут перезаписаны шаблоном.

4 ответа

Решение

Честно говоря, используя host ресурс это самый простой способ сделать это. Вам нужно только определить хосты, которыми вы хотите управлять с помощью puppet, и вы все равно можете редактировать оставшуюся часть файла вручную (даже если Puppet вставляет в этот заголовок, который говорит вам не делать этого).

augeas модуль избыточен для файла hosts, потому что он просто дублирует функциональность host ресурс (хотя он не добавляет в заголовок "не редактировать этот файл").

Если вы действительно хотите что-то более сложное или хотите точно контролировать размещение строк в файле, используйте модуль concat с локальным источником для одного из фрагментов. Вот пример для такого рода вещи (используя файл MOTD) в concat документация.

Но на самом деле, просто используйте host ресурс для хостов, которые вы хотите определить из Puppet, и отредактируйте локальные файлы хостов для всего, что вам нужно.

Также обратите внимание, что вы можете довольно компактно написать определения хоста в Puppet:

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';
}

Используйте функциональность augeaus, встроенную в куклу. Вы хотите что-то вроде

augeas {
  context => "files/etc/hosts"
  changes => [
    "set <ip address> <name>",
  ],
}

Один из случаев, когда вы можете использовать augeas для файла / etc / hosts, в дополнение к типам ресурсов hosts, - это дублирование строк IP-адресов.

Тип ресурса hosts довольно удачно разрешает линии с одинаковыми IP-адресами. (Google это; где чрезвычайно мало случаев, когда это может быть хорошей идеей.)

Но если вы не хотите дублировать IP-адреса в вашем файле / etc / hosts - тогда augeas может вам помочь. хосты не помогают для этого.

Просто метод, без кода:

Используйте шаблоны или что-то, что обновляет файл /etc/hosts.puppet с четкими начальными и конечными линиями

###PUPPETSTART###
## Users: Lines between START and END will be deleted, put your own entries below 

192.168.0.1 host1
###PUPPETEND###

и иметь сценарий оболочки как зависимость, которая вырезает этот сегмент из /etc/hosts и заменяет его содержимым /etc/hosts.puppet,

Имейте в виду, что в этом случае возникает состояние гонки, когда пользователи редактируют файл, а марионеточный прогон меняет его. Кроме того, попросите своих пользователей отредактировать файл /etc/hosts.user и построить /etc/hosts из обоих файлов, когда один из них меняется.

Другие вопросы по тегам