Автоматизация начальной настройки сервера с помощью 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
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"
}
"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)
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
---
- 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