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

Большинство стандартных баннеров для входа в 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.

Спасибо за чтение! Если вам понравилась эта статья, ознакомьтесь с некоторыми из моих других ниже: