Как изменить баннер и что в нем поставить
Большинство стандартных баннеров для входа в Linux (или MOTD) оставляют желать лучшего. Сообщение о входе — это не то, что можно оставить как есть. Его можно изменять, настраивать и расширять в соответствии с конкретными вариантами использования. Если вы часто получаете доступ к большому количеству различных облачных или локальных серверов, смена баннера является почти обязательным требованием.
Варианты того, что вы можете включить в свой баннер входа, практически безграничны. Вы можете разместить все, от базовой информации о самом сервере до смешной шутки дня. Единственным ограничением является ваше воображение.
В этой статье мы рассмотрим не только то, как изменить этот баннер и что в него добавить, но и то, как развернуть его с помощью Ansible и включить в него полезную информацию об AWS EC2.
Скрапинг метаданных инстанса EC2
Если вы раньше не использовали метаданные экземпляра, вас ждет настоящее удовольствие. В большинстве образов AMI экземпляров EC2 скрыта возможность собирать базовую информацию об экземпляре из операционной системы этого экземпляра. Экземпляр предоставляет локальный самоназначаемый IP-адрес, который предоставляет базовый HTTP-сервер для сбора информации.
Конечная точка метаданных обычно предоставляется по следующему самостоятельно назначенному IPv4-адресу (он доступен только локально):
https://169.254.169.254/latest/meta-data/
Например, изнутри экземпляра, если вы хотите получить частный IP-адрес, вы можете запустить:
curl https://169.254.169.254/latest/meta-data/local-ipv4
Это вернет частный IP-адрес, назначенный в настоящее время этому экземпляру.
Если мы хотим добавить что-то подобное в Ansible, все, что нам нужно сделать, это сделать простой веб-запрос из нашего playbook. Это будет выглядеть примерно так:
- name: Get EC2 instance metadata uri: url: "https://169.254.169.254/latest/meta-data/local-ipv4" return_content: true register: ec2_local_ip
После завершения этой задачи частный IP-адрес будет сохранен внутри результирующего ключа content
переменной ec2_local_ip
.
Если вы хотите получить более богатый набор метаданных об экземпляре, вы можете использовать нечто, называемое удостоверением личности. Это большой двоичный объект JSON, полный информации, такой как тип экземпляра, частный IP-адрес и многое другое.
Документ, удостоверяющий личность, можно получить по следующему пути:
https://169.254.169.254/latest/dynamic/instance-identity/document
Обратите внимание, что это относится к данным dynamic
, а не к ключу meta-data
.
Это выглядит примерно так:
{ "accountId" : "123456789", "architecture" : "x86_64", "availabilityZone" : "us-west-1a", "billingProducts" : null, "devpayProductCodes" : null, "marketplaceProductCodes" : null, "imageId" : "ami-123456789", "instanceId" : "i-00001234567890", "instanceType" : "t2.micro", "kernelId" : null, "pendingTime" : "2022-01-21T00:47:18Z", "privateIp" : "192.168.1.5", "ramdiskId" : null, "region" : "us-west-1", "version" : "2017-09-30" }
Чтобы получить это в Ansible, мы будем использовать немного другую версию нашей задачи запроса и установим новую переменную:
- name: Get the instance identity document uri: url: "https://169.254.169.254/latest/dynamic/instance-identity/document" return_content: true register: identity_doc - set_fact: instance_metadata: "{{ identity_doc.json }}"
После завершения этого набора задач у нас останется большой двоичный объект JSON нашего документа, удостоверяющего личность, загруженный в переменную с именем instance_metadata
.
Теперь давайте посмотрим, как создать базовый сценарий, чтобы фактически заменить баннер некоторой информацией.
Создание сборника игр
Чтобы изменить баннер, нам нужно настроить для этого простую задачу в нашей пьесе. Почти во всех случаях вам просто нужно заменить весь баннер чем-то нестандартным. В этом примере мы будем шаблонировать весь файл:
- name: Change MOTD banner template: src: motd.j2 dest: /etc/motd register: motd_file - name: Restart ssh when updated service: name: ssh state: restarted when: motd_file.changed
В приведенной выше задаче мы берем наш файл шаблона и применяем его поверх существующего пути motd
. Затем, предполагая, что файл был изменен, мы перезапускаем службу ssh
. Это важно, потому что баннер входа в систему не будет отображаться, пока вы не перезапустите службу.
Примечание. В зависимости от вашего дистрибутива Linux служба может называться иначе, чем ssh
.
Теперь давайте посмотрим, как построить сам шаблон.
Создание шаблона
Шаблоны Ansible — очень мощные функции. В роли или книге воспроизведения вы можете настроить файлы шаблонов, способные создавать очень сложные текстовые макеты. С помощью этого движка вы можете создавать шаблоны файлов конфигурации и многое другое.
В этом примере мы будем интерполировать собранные нами метаданные и создадим более эстетичный макет.
Создайте файл с именем motd.j2
(либо в каталоге templates
вашей роли, либо в том же каталоге, что и плейбук), и давайте начнем создавать базовый шаблон:
()================================================================() host: {{ ansible_host }} kernel: {{ ansible_kernel }} instance-id: {{ instance_metadata.instanceId }} instance-type: {{ instance_metadata.instanceType }} private-ip: {{ instance_metadata.privateIp }} ()===============================================================()
В этом шаблоне мы делаем несколько простых вещей, таких как форматирование с помощью табуляции и разрывов строк, но мы также извлекаем ряд переменных из документа идентификации экземпляра вместе с внутренними переменными Ansible.
Помните, что в нашем playbook мы сохранили идентификационный документ в переменной с именем instance_metadata
, поэтому мы можем получить к нему доступ, как к обычному словарю, и ссылаться на эти переменные в нашем шаблоне.
Давайте посмотрим, как будет выглядеть окончательный вариант сценария.
Собираем все вместе
Ниже приведен пример плейбука, который будет работать с localhost
, собирать метаданные и менять баннер на наш новый шаблон:
--- - hosts: localhost tasks: - name: Get the instance identity document uri: url: "https://169.254.169.254/latest/dynamic/instance-identity /document" return_content: true register: identity_doc - set_fact: instance_metadata: "{{ identity_doc.json }}" - name: Change MOTD banner template: src: motd.j2 dest: /etc/motd register: motd_file - name: Restart ssh when updated service: name: ssh state: restarted when: motd_file.changed
В зависимости от конфигурации SSH вашего конкретного дистрибутива Linux вам может потребоваться обновить демон SSH для поддержки использования MOTD.
В Debian это находится в /etc/ssh/sshd_config
. Удаление или закомментирование строки Banner
должно решить проблему и разрешить отображение MOTD.
Если вы все еще сталкиваетесь с проблемами, вам также может потребоваться отключить все динамические сценарии MOTD, расположенные в /etc/update-motd.d
.
После того, как вы соберете все вместе и запустите playbook на своем хосте EC2, вы должны увидеть приятный новый баннер входа в систему, похожий на этот:
Теперь у вас будет доступ к базовой информации EC2 сразу после входа в систему. Это экономит время и гарантирует, что вы войдете на правильный хост с правильной конфигурацией.
Вы можете расширить этот баннер входа, чтобы отображать еще больше информации из метаданных экземпляра и Ansible. Если вы настроены на что-то более веселое, вы можете добавить такие функции, как Cowsay или Fortune.
Спасибо за чтение! Если вам понравилась эта статья, ознакомьтесь с некоторыми из моих других ниже: