Как автоматизировать настройку сервера с помощью Ansible в Ubuntu 18.04

Вступление

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

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

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

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

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

  • Ansible установлен либо на вашем локальном компьютере, либо на удаленном сервере, который вы настроили какAnsible Control Node. Вы можете выполнить шаг 1 руководстваHow to Install and Configure Ansible on Ubuntu 18.04, чтобы настроить эту настройку.

  • Корневой доступ к одному или нескольким серверам Ubuntu 18.04, которые будут управляться Ansible.

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

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

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

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

sudo nano /etc/ansible/hosts

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

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

/etc/ansible/hosts

[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. В этом руководстве мы будем использовать учетную запись Ubunturoot, потому что это обычно единственная учетная запись, доступная по умолчанию на вновь созданных серверах. Этот сценарий создаст нового пользователя без полномочий root с привилегиямиsudo, которые вы должны использовать при последующих взаимодействиях с удаленным сервером.

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

ansible -m ping all -u root

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

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

ansible -m ping all -u root -k

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

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

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

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

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

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

Эта инструкция по использованию Ansible предоставляет альтернативу ручному выполнению процедуры, описанной вUbuntu 18.04 initial server setup guide и руководстве поsetting up SSH keys on Ubuntu 18.04.

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

  1. Административная группаwheels создается и затем настраивается дляpasswordless sudo.

  2. В этой группе создается новый административный пользователь с именем, указанным в переменнойcreate_user.

  3. Открытый ключ SSH копируется из местоположения, определенного переменнойcopy_local_key, и добавляется в файлauthorized_keys для пользователя, созданный на предыдущем шаге.

  4. Аутентификация на основе пароля отключена для пользователяroot.

  5. Индекс локального пакетаapt обновляется, и устанавливаются базовые пакеты, определенные переменнойsys_packages.

  6. Брандмауэр UFW настроен на разрешение только SSH-соединений и отклоняет любые другие запросы.

Для получения дополнительной информации о каждом из шагов, включенных в эту инструкцию, обратитесь к нашемуUbuntu 18.04 initial server setup guide.

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

Как использовать эту книгу

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

[.note] # Для вашего удобства содержимое плейбука также включено вfurther section of this guide.
#

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

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

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

nano initial_server_setup.yml

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

  • create_user: имя учетной записи пользователя без полномочий root для создания и предоставления привилегий sudo. В нашем примере используетсяsammy, но вы можете использовать любое имя пользователя, которое хотите.

  • copy_local_key: локальный путь к действительному общедоступному ключу SSH для настройки в качестве авторизованного ключа для новой учетной записиsudo без полномочий root. Значение по умолчанию указывает на открытый ключ текущего локального пользователя, расположенный в~/.ssh/id_rsa.pub.

  • sys_packages: список основных системных пакетов, которые будут установлены с помощью инструмента диспетчера пакетовapt.

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

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

ansible-playbook initial_server_setup.yml  -l server1

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

Output
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 sammy@server_domain_or_IP

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

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

ssh sammy@server_domain_or_IP -i ~/.ssh/ansible_controller_key

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

sudo ufw status

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

OutputStatus: active

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

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

Содержание Playbook

Вы можете найти сценарий начальной настройки сервера вansible-playbooks repository в DigitalOceanCommunity GitHub organization. Чтобы скопировать или загрузить содержимое сценария напрямую, нажмите кнопкуRaw в верхней части сценария илиclick here to view the raw contents directly.

Полное содержание также включено сюда для удобства:

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 }}"
        state: present
        groups: wheel
        append: true
        create_home: true
        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.

Если вы хотите включить новые задачи в это руководство для дальнейшей настройки первоначальной настройки сервера, обратитесь к нашему вводному руководству по AnsibleConfiguration Management 101: Writing Ansible Playbooks.

Related