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