Как сохранить количество уникальных IP-адресов в файле журнала по дате?

Я не думаю, что есть большая проблема с 20 строками в качестве сценария оболочки для отдельной машины или двух. Это хорошо иметь.

Тем не менее, ваш сценарий не является идемпотентным. Например, он использует apt-get upgrade foo, который может выполнять изменения, даже если скрипт уже был запущен в этой системе. Я не думаю, что стоит использовать apt-get upgrade foo. Эта команда не гарантирует применение обновлений безопасности или исправлений к вашим зависимостям.

Тщательно написанный плейбук Ansible можно использовать как небольшую проверку системы. Это зависит от того, что playbook является идемпотентным (, а также от того, что он точно сообщает об «измененном» статусе ). Выполнение ansible-playbook --checkпокажет, соответствует ли система всем заданным задачам или она была изменена. Это может быть полезно позже, а также для поиска несоответствий сразу после запуска playbook.

И вы можете настроить Ansible, чтобы запускать его на нескольких машинах одновременно.

Инструменты настройки, такие как Ansible, полезны при масштабировании. Отчасти из-за таких особенностей. Отчасти из-за такого рода ограничений, которым он побуждает вас следовать.

Поощрение вас к написанию идемпотентных скриптов также может быть полезно для обслуживания. Рассмотрим искушение написать сценарий, который добавляет строки в существующий файл (или добавляет токены внутрь существующей строки :-(). Если вы обеспечиваете идемпотентность, то вы можете повторно -запустить измененный сценарий без добавления повторяющихся строк.

Еще одно ограничение — если вы когда-нибудь захотите удалить что-то из установленной системы.Во многих случаях это не проблема, и вы всегда можете написать сценарий удаления или сценарий удаления позже. Но в некоторых случаях с этим нужно быть осторожным. Например. вы можете убедиться, что не используете Ansible lineinfileдля замены отдельной строки, а вместо этого перезаписываете весь файл своей собственной версией. Это может быть полезно, если вы больше не хотите менять строку A по умолчанию, но все же хотите изменить строку B.

В моем случае я хотел бы решить проблему удаления при управлении брандмауэрами. Если вы перестанете разрешать порт в своем сценарии установки, вы можете забыть явно заблокировать порт везде. Модуль Ansible ufwздесь не поможет, потому что позволяет только добавлять или удалять отдельные правила. В настоящее время я думаю об использовании альтернативы брандмауэру ufw, который имеет надлежащую поддержку работы с файлами конфигурации. (. firewalld, shorewall, ferm... ).

0
26.10.2020, 04:11
1 ответ

Вот ответ на образец формата вопроса, но в целом процесс аналогичен для других форматов журнала (обычно дата в формате ISO и в первом поле ). Чтобы отделить задачу от формата, сначала смотрите только IP и даты:

> awk '{print substr($4,2,10), $1}' file
11/Feb/202 57.34.156.99
11/Feb/202 43.21.223.33
14/Mar/202 87.44.212.82
11/Feb/202 43.21.223.33

Мы можем использовать ассоциативный массив, где хэш будет датой и ip, и он будет увеличиваться при любом появлении «даты -ip». И еще один массив для подсчета фактического результата, где хэш будет только датой.

awk '{d = substr($4,2,10)} !seen[d FS $1]++ {cnt[d]++}
    END {for (x in cnt) print x ":" cnt[x]}
    ' file | sort -t ":" -rnk2

Выход:

11/Feb/202:2
14/Mar/202:1
  • Обратите внимание, что порядок массива cntв ENDне определен, поэтому полезно передавать даты sortпо подсчету IP-адресов. В качестве альтернативы вы можете использовать функции сортировки массивов GNU awk .

  • Переменные в awkне определены неявно и изначально являются нулевыми или пустой строкой, поэтому для любого нового набора «дата -ip», !seen[date-ip]++будет истинным, а затем увеличивается. Так что в следующий раз, когда мы столкнемся с этой «датой -ip», она будет ложной, и мы не будем увеличивать cnt[date].


Вот то же самое с использованием sortи uniq, после извлечения только «даты -ip» в строке:

> awk '{print substr($4,2,10), $1}' file | sort -u | awk '{print $1}' | uniq -c
      2 11/Feb/202
      1 14/Mar/202

Здесь мы удаляем дубликаты с помощью sort -uпри сортировке (, потому что позже uniqнеобходимо отсортировать ввод ), оставляем только первое поле (, дату )и, наконец, uniq -cпечать подсчетов на уникальную дату. Это более читабельно для людей, недостаточно знакомых с awk. Чтобы продемонстрировать процесс, вы можете распечатать каждый шаг этой команды, чтобы увидеть, как это происходит.

1
18.03.2021, 22:54

Теги

Похожие вопросы