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

Как лучше всего в 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

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

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

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

Честно говоря, используя host ресурс - самый простой способ сделать это. Вам нужно только определить хосты, которыми вы хотите управлять с помощью марионетки, и вы все равно можете редактировать остальную часть файла вручную (даже если 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-адресами. (Погуглите; есть крайне непонятные случаи, когда это может быть хорошей идеей.)

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

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

Используйте шаблоны или что-то еще, что обновляет файл /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 из обоих файлов при каждом изменении.