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