Проблема: я хочу убедиться, что определенная папка одинакова в отношении своего содержимого на всех моих серверах.
Я не хочу, чтобы автоматическая синхронизация файлов оставила их равными, изменение выполняется вручную.
Моя первоначальная мысль заключалась в том, чтобы раз в день вычислять некоторый crc / hash для папки и отправлять их в Zabbix, и запускать, когда значения отличаются.
Есть ли какие-нибудь хорошие инструменты, которые могут вычислить crc или что-то подобное для папки?
Кто-нибудь знает другое решение, которое решает мою проблему?
Есть два варианта того, что вы хотите: tripwire (3070678sourceforge.net/projects/tripwire/) и Aide (http://aide.sourceforge.net/).
Рабочий процесс с обоими более или менее одинаков, но, поскольку я знаю Aide, я расскажу вам об этом. Для начала вы инициализируете БД суммами (MD5 и SHA1) каждого файла, который вы хотите отслеживать. Aide позволяет вам выбрать, какие изменения вы хотите отслеживать: содержимое файла, uid или gid, биты выполнения, количество блоков ... Затем вы ежедневно сравниваете текущее состояние отслеживаемых файлов с теми, которые находятся в БД. Если есть разница, Эйд сообщит вам. Каждый раз, когда вы делаете контролируемое изменение, вы снова инициализируете БД.
Не очень хорошо интегрироваться с Zabbix или Nagios, но, возможно, это поможет.
Если вы все еще ищете инструмент, который может различать несколько серверов и отправлять предупреждения, когда есть какие-либо различия, посетите www.metaforsoftware.com. Вы можете настроить его на ежедневные или ежечасные изменения. Сейчас он находится в бесплатной бета-версии. (Полное раскрытие информации: я соучредитель)
Некоторое время назад у меня была точно такая же проблема, и я написал этот фрагмент кода Python для генерации этой контрольной суммы:
def checksum(root):
md5sums = {}
items = os.path.walk(root, checksum_dir, md5sums)
_md5sums = []
for k in sorted(md5sums.keys()):
_md5sums += md5sums[k]
return md5.new(''.join(_md5sums)).hexdigest()
def checksum_dir(md5sums, path, names):
names.sort()
if '.git' in names:
names.remove('.git')
md5sums[path] = []
for name in names:
name = os.path.join(path, name)
if os.path.islink(name):
md5sums[path].append(os.readlink(name))
elif os.path.isdir(name):
continue
elif os.path.isfile(name):
fd = open(name)
md5sums[path].append(md5.new(fd.read()).hexdigest())
fd.close()
else:
raise ValueError("File %s is not a normal name or a symlink")
Я завернул его в модуль func и запустил соответствующую проверку funcmaster через nrpe (мы используем nagios, а не zabbix).