Автоматизация начальной настройки сервера с помощью Ansible в Ubuntu 18.04

После запуска нового сервера Ubuntu 18.04 нужно выполнить несколько шагов по базовой настройке. Это повысит безопасность и удобство использования вашего сервера, создаст прочную основу для дальнейшей работы.

Конечно, вы можете выполнить все эти шаги вручную, но автоматизация процесса сэкономит ваше время и уменьшит влияние человеческого фактора. Благодаря популяризации контейнерных приложений и микросервисов автоматизация серверов теперь играет важную роль в системном администрировании. Этот способ также позволяет быстро выполнить стандартные процедуры по настройке новых серверов.

В этом мануале мы расскажем, как использовать Ansible для автоматизации всех этапов, описанных в руководстве по начальной настройке сервера Ubuntu 18.04. Ansible – это современный инструмент управления конфигурацией, который можно использовать для автоматической оркестровки и настройки удаленных систем.

Требования

Чтобы написать плейбук и выполнить автоматическую настройку  которую мы обсуждаем в этом мануале, вам потребуется:

  • Установка Ansible на локальном компьютере или на удаленном сервере, который вы используете в качестве Control Node для Ansible. Выполните раздел 1 мануала Установка и настройка Ansible в Ubuntu 18.04.
  • Корневой доступ к одному или нескольким серверам Ubuntu 18.04, которые будут управляться через Ansible.

Перед запуском плейбука важно убедиться, что Ansible может подключаться к вашим серверам через SSH и запускать модули с помощью Python. В следующих двух разделах описано, как настроить инвентарь Ansible, включить в него ваши серверы и как запустить специальные команды Ansible для проверки подключения и валидных учетных данных.

Файл инвентаря Ansible

Файл инвентаря содержит информацию о хостах, которыми вы будете управлять с помощью Ansible. В этот файл можно включить от одного до нескольких сотен серверов. Хосты в нем могут быть организованы в группы и подгруппы. Файл инвентаря также часто используется для установки переменных, действительных только для определенных хостов и групп, которые затем можно использовать в плейбуках и шаблонах. Некоторые переменные также могут влиять на способ запуска плейбука, например ansible_python_interpreter.

Чтобы просмотреть содержимое инвентаря Ansible по умолчанию, откройте файл /etc/ansible/hosts с помощью редактора на локальном компьютере или на Ansible Control Node:

sudo nano /etc/ansible/hosts

Примечание: Некоторые установки Ansible не создают файл инвентаря по умолчанию. Если в вашей системе файл не существует, вы можете создать файл /etc/ansible/hosts самостоятельно или указать собственный путь к инвентарю с помощью параметра -i при запуске команд и плейбуков.

Файл инвентаря по умолчанию, предоставляемый установкой Ansible, содержит несколько примеров, которые вы можете использовать в качестве шаблона для настройки. В следующем примере мы определим группу из трех именованных серверов, каждый из которых идентифицируется по своему псевдониму: server1, server2 и server3.

[servers]
server1 ansible_host=203.0.113.111
server2 ansible_host=203.0.113.112
server3 ansible_host=203.0.113.113
[servers:vars]
ansible_python_interpreter=/usr/bin/python3

Подгруппа server:vars устанавливает параметр хоста ansible_python_interpreter, который будет действителен для всех хостов, включенных в группу servers. Этот параметр гарантирует, что удаленный сервер использует исполняемый файл Python 3 /usr/bin/python3, а не /usr/bin/python (Python 2.7), которого нет в последних версиях Ubuntu.

Чтобы завершить настройку файла инвентаря, замените условные IP-адреса в файле IP-адресами ваших серверов. Когда вы закончите, сохраните и закройте файл (Ctrl + X, затем y, чтобы сохранить изменения, а затем Enter).

Теперь, когда ваш файл инвентаря готов, пришло время проверить подключение к вашим нодам.

Тестирование подключения

После настройки файла инвентаря и включения в него ваших серверов пришло время проверить, может ли Ansible подключиться к этим серверам и запускать команды через SSH. В этом мануале мы будем использовать учетную запись root  сервера Ubuntu, поскольку обычно это единственная доступная учетная запись на свежих серверах. Этот плейбук создаст нового пользователя без прав root с привилегиями sudo, которого вы сможете использовать при последующих взаимодействиях с удаленным сервером.

С вашего локального компьютера или Ansible Control Node запустите:

ansible -m ping all -u root

Эта команда использует встроенный модуль Ansible ping  для проверки подключения на всех нодах из вашего инвентаря по умолчанию от имени пользователя root. Модуль ping проверит:

  • Доступны ли ваши хосты;
  • Валидны ли ваши учетные данные SSH;
  • Могут ли хосты запускать модули Ansible с помощью Python.

Если для подключения к удаленным серверам вместо аутентификации по ключам вы используете парольную аутентификацию, вы должны указать дополнительный параметр -k в команде Ansible, чтобы он запросил пароль подключающегося пользователя.

Примечание: Некоторые серверы могут поддерживать дополнительные меры безопасности против парольной аутентификации пользователя root. В некоторых случаях вам может потребоваться вручную войти на сервер, чтобы изменить исходный пароль root.

Вы должны получить похожий вывод:

server1 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server2 | SUCCESS => {
"changed": false,
"ping": "pong"
}
server3 | SUCCESS => {
"changed": false,
"ping": "pong"
}

Если вы впервые подключаетесь к этим серверам через SSH, вам будет предложено подтвердить подлинность хостов, к которым вы подключаетесь через Ansible. При появлении запроса введите yes, а затем нажмите Enter для подтверждения.

Если вы получаете от хоста ответ pong, это означает, что на этом сервере можно запускать команды Ansible и плейбуки.

Что делает этот плейбук?

Этот плейбук Ansible предоставляет альтернативу ручной начальной настройке сервера Ubuntu 18.04, описанной в этом мануале, и настройке ключей по мануалу Установка SSH-ключей в Ubuntu 18.04.

Запуск этого плейбука приведет к выполнению следующих действий:

  1. Создается группа wheels, а затем настраивается sudo без пароля.
  2. В этой группе создается новый администратор с именем, указанным в переменной create_user.
  3. Открытый ключ SSH копируется из расположения, заданного переменной copy_local_key, и добавляется в файл authorized_keys для пользователя, созданного на предыдущем этапе.
  4. Отключается парольная аутентификация для пользователя root.
  5. Обновляется локальный индекс пакетов apt и устанавливаются базовые пакеты, определяемые переменной sys_packages.
  6. Брандмауэр UFW настраивается на поддержку только SSH-соединений, после чего он будет сбрасывать любые другие запросы.

Для получения дополнительной информации о каждом из этапов в плейбуке, пожалуйста, обратитесь к мануалу по начальной настройке сервера Ubuntu 18.04.

После выполнения плейбука вы сможете войти на сервер, используя только что созданную учетную запись sudo.

Как использовать этот плейбук?

Для начала мы загрузим содержимое плейбука на Ansible Control Node. Это может быть либо локальный компьютер, либо удаленный сервер, на котором установлен Ansible и настроен инвентарь.

Чтобы скачать этот плейбук с помощью командной строки, вы можете использовать curl:

curl -L https://raw.githubusercontent.com/do-community/ansible-playbooks/master/initial_server_setup/ubuntu1804.yml -o initial_server_setup.yml

Это загрузит содержимое плейбука в файл initial_server_setup.yml по вашему текущему локальному пути. Вы можете просмотреть содержимое плейбука, открыв файл в редакторе:

sudo nano initial_server_setup.yml

Открыв файл, найдите раздел vars с тремя различными переменными, которые требуют вашего внимания:

  1. create_user: имя учетной записи пользователя без полномочий root, для создания и предоставления привилегий sudo. В нашем примере используется 8host, но вы можете использовать другое имя пользователя.
  2. copy_local_key: локальный путь к действительному открытому ключу SSH, который будет использоваться в качестве авторизованного ключа для новой учетной записи sudo. Значение по умолчанию указывает на открытый ключ текущего локального пользователя, расположенный в ~/.ssh/id_rsa.pub.
  3. sys_packages: список основных системных пакетов, которые будут установлены с помощью менеджера пакетов apt.

Когда вы закончите обновлять переменные в initial_server_setup.yml, сохраните и закройте файл.

Теперь вы готовы запустить свой плейбук на одном или нескольких серверах. По умолчанию большинство плейбуков настроено на выполнение на всех серверах из инвентаря. Вы можете использовать флаг -l, чтобы плейбук затронул только конкретное подмножество серверов или один сервер. Чтобы выполнить плейбук только на сервере server1, вы можете использовать следующую команду:

ansible-playbook initial_server_setup.yml  -l server1

Вы получите такой вывод:

PLAY [all] ***************************************************************************************************************************************
TASK [Make sure we have a 'wheel' group] *********************************************************************************************************
changed: [server1]
TASK [Allow 'wheel' group to have passwordless sudo] *********************************************************************************************
changed: [server1]
TASK [Create a new regular user with sudo privileges] ********************************************************************************************
changed: [server1]
TASK [Set authorized key for remote user] *******************************************************************************************************
changed: [server1]
TASK [Disable password authentication for root] **************************************************************************************************
changed: [server1]
TASK [Update apt] ********************************************************************************************************************************
changed: [server1]
TASK [Install required system packages] *********************************************************************************************************
ok: [server1]
TASK [UFW - Allow SSH connections] ***************************************************************************************************************
changed: [server1]
TASK [UFW - Deny all other incoming traffic by default] ******************************************************************************************
changed: [server1]
PLAY RECAP ***************************************************************************************************************************************
server1                    : ok=9    changed=8    unreachable=0    failed=0

Как только плейбук будет выполнен, вы сможете войти на сервер с помощью команды:

ssh 8host@server_domain_or_IP

Не забудьте заменить 8host именем вашего пользователя из переменной create_user, а server_domain_or_IP именем хоста или IP-адресом вашего сервера.

Если вы установили открытый ключ с переменной copy_local_key, вам нужно будет указать дополнительный параметр, указывающий расположение его закрытого ключа:

ssh 8host@server_domain_or_IP -i ~/.ssh/ansible_controller_key

После входа на сервер вы можете проверить активные правила брандмауэра UFW и убедиться, что он правильно настроен:

sudo ufw status

Вы должны получить похожий вывод:

Status: active
To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)

Это означает, что брандмауэр UFW успешно включен. Это было последнее задание плейбука, а потому это подтверждает, что плейбук был полностью выполнен на этом сервере.

Содержание плейбука

Плейбук по начальной настройке сервера можно найти в репозитории ansible-playbooks на GitHub. Чтобы скопировать или загрузить содержимое сценария напрямую, нажмите кнопку Raw в верхней части сценария или нажмите сюда, чтобы просмотреть исходное содержимое плейбука.

В целом же плейбук выглядит так:

---
- hosts: all
remote_user: root
gather_facts: false
vars:
create_user: 8host
copy_local_key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
sys_packages: [ 'curl', 'vim', 'git', 'ufw' ]
tasks:
- name: Make sure we have a 'wheel' group
group:
name: wheel
state: present
- name: Allow 'wheel' group to have passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%wheel'
line: '%wheel ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
- name: Create a new regular user with sudo privileges
user:
name: "{{ create_user }}"
groups: wheel
shell: /bin/bash
- name: Set authorized key for remote user
authorized_key:
user: "{{ create_user }}"
state: present
key: "{{ copy_local_key }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
- name: Update apt
apt: update_cache=yes
- name: Install required system packages
apt: name={{ sys_packages }} state=latest
- name: UFW - Allow SSH connections
ufw:
rule: allow
name: OpenSSH
- name: UFW - Deny all other incoming traffic by default
ufw:
state: enabled
policy: deny
direction: incoming

Вы можете подогнать этот плейбук под ваши потребности или добавить новые задания, чтобы лучше организовать этапы вашего рабочего процесса.

Заключение

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

В этом мануале мы продемонстрировали, как использовать Ansible для автоматизации основных задач, которые должны выполняться на новом сервере: это создание пользователя с доступом sudo, включение брандмауэра UFW и отключение удаленного входа в систему для root.

Если вы хотите добавить в плейбук новые задачи для дальнейшей настройки базовой среды сервера, пожалуйста, обратитесь к руководству Создание плейбука Ansible.

Tags: , ,