Как изменить баннер и что в нем поставить

Большинство стандартных баннеров для входа в 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.
Спасибо за чтение! Если вам понравилась эта статья, ознакомьтесь с некоторыми из моих других ниже: