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