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

Вступление

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

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

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

Предполетная проверка

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

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

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

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

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 группу. Этот параметр гарантирует, что удаленный сервер использует /usr/bin/python3 исполняемый файл Python 3 вместо /usr/bin/python(Python 2.7), чего нет в последних версиях Ubuntu.

Чтобы завершить настройку файла инвентаризации, замените выделенные IP-адреса IP-адресами ваших серверов. Когда вы закончите, сохраните и закройте файл, нажав CTRL+X затем, чтобы подтвердить изменения, а затем ENTER.

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

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

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

ansible -m ping all -u root

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

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

ansible -m ping all -u root -k

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

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

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


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

Как только вы получаете ответ «понг» от хоста, это означает, что вы готовы запускать команды Ansible и playbooks на этом сервере.

Что делает этот Playbook?

Эта книга воспроизведения Ansible предоставляет альтернативу ручному запуску процедуры, описанной в руководстве по первоначальной настройке сервера Ubuntu 18.04 и руководстве по настройке ключей SSH в Ubuntu 18.04.

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

Колеса административной группы создаются, а затем настраиваются для sudo без пароля.
В этой группе создается новый административный пользователь, используя имя, указанное в create_userпеременной.
Открытый ключ SSH копируется из местоположения, заданного переменной copy_local_key, и добавляется в authorized_keys файл для пользователя, созданного на предыдущем шаге.
Проверка подлинности на основе пароля отключена для пользователя root.
Индекс локального apt пакета обновляется, и sys_packages устанавливаются базовые пакеты, определяемые переменной.
Брандмауэр 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

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

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

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




Как только выполнение playbook закончится, вы сможете войти на сервер с помощью:

ssh user@localhost

 
Не забудьте заменить user пользователем, определенным create_userпеременной, а localhost - именем хоста или IP-адресом вашего сервера.

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

ssh user@localhost -i ~/.ssh/ansible_controller_key
После входа на сервер вы можете проверить активные правила брандмауэра UFW и убедиться, что он правильно настроен:

sudo ufw status

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

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere                  
OpenSSH (v6)               ALLOW       Anywhere (v6)             


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

Содержание Playbook

Пример содержания начальной настройки сервера:

initial_server_setup.yml
---
- hosts: all
  remote_user: root
  gather_facts: false
  vars:
    create_user: sammy
    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 для автоматизации начальных задач, которые должны выполняться на новом сервере, таких как создание пользователя без полномочий root с доступом sudo, включение UFW и отключение удаленного входа в систему root.

Добавить комментарий

Автору будет очень приятно узнать обратную связь о своем руководстве.

Комментариев 0