Как использовать Ansible для автоматизации начальной настройки сервера в Rocky Linux 9
Введение
В настоящее время автоматизация серверов играет важную роль в системном администрировании из-за одноразового характера современных сред приложений. Ansible обычно используются для упрощения процесса автоматической настройки сервера путем установления стандартных процедур для новых серверов, а также для уменьшения человеческих ошибок, связанных с ручной настройкой.
Ansible предлагает простую архитектуру, которая не требует установки специального программного обеспечения на узлах. Он также предоставляет надежный набор функций и встроенных модулей, упрощающих написание сценариев автоматизации.
В этом руководстве объясняется, как использовать Ansible для автоматизации шагов, описанных в нашем Руководстве по начальной настройке сервера для серверов Rocky Linux 9.
Предпосылки
Чтобы следовать этому руководству, вам понадобятся:
- Один управляющий узел Ansible: компьютер Rocky Linux 9 с установленным Ansible и настроенным для подключения к хостам Ansible с помощью ключей SSH. Убедитесь, что на управляющем узле есть обычный пользователь с разрешениями sudo и включенным брандмауэром, как описано в нашем разделе «Как установить и настроить Ansible на Rocky Linux 9». Обычно вам не нужно устанавливать ту же самую версию Linux на ту же цель. версии (например, в данном случае с Rocky Linux 9 на Rocky Linux 9), но в демонстрационных целях все остается согласованным.
- Один удаленный сервер с чистой установкой Rocky Linux 9: предварительная настройка на этом сервере не требуется, но у вас должен быть SSH-доступ к этому серверу с упомянутого выше узла управления Ansible. Если у вас еще нет SSH-доступа к удаленному серверу с узла управления Ansible, обратитесь к нашему руководству «Как настроить SSH-ключи». Этот сервер станет удаленным хост-сервером Ansible, который предназначен для автоматической подготовки управляющим узлом Ansible.
Что делает этот Playbook?
Этот плейбук Ansible представляет собой альтернативу ручному выполнению процедуры, описанной в настройке ключей SSH в Rocky Linux 9, каждый раз при загрузке сервера. Настройте свой плейбук один раз, а затем используйте его для каждого сервера.
Запуск этого плейбука выполнит следующие действия на ваших хостах Ansible:
- Создайте нового пользователя sudo и настройте
sudo
без пароля. - Скопируйте локальный открытый ключ SSH и включите его в файл
authorized_keys
для нового администратора на удаленном узле (если вы ранее использовали пароль для SSH). - Отключите аутентификацию на основе пароля для пользователя root.
- Установите системные пакеты.
После завершения работы playbook у вас будет новый пользователь, которого вы сможете использовать для входа на сервер.
Для начала войдите в систему с включенным пользователем sudo
на сервере узла управления Ansible.
Шаг 1 — Подготовка узла управления Ansible
На сервере узла управления Ansible добавьте IP-адрес удаленного сервера узла Ansible в файл инвентаризации Ansible. С помощью vi
или предпочитаемого вами текстового редактора откройте файл инвентаризации Ansible:
- sudo vi /etc/ansible/hosts
Это откроет ваш файл инвентаризации Ansible. Добавьте IP-адрес удаленного сервера хоста Ansible в блок [servers]
:
[servers]
server1 ansible_host=your_remote_server_ip
. . .
Сохраните и закройте файл.
Теперь вы проверите и аутентифицируете свое SSH-соединение между этим управляющим узлом Ansible и вашим удаленным хост-сервером Ansible:
- ssh root@your_remote_server_ip
Примите запрос на аутентификацию и введите свой пароль, если будет предложено. После того, как вы проверили соединение SSH, нажмите CTRL+D
, чтобы закрыть соединение и вернуться к своему управляющему узлу.
Шаг 2 — Подготовка вашего Playbook
В файле playbook.yml
определены все ваши задачи. Задача — это наименьшая единица действия, которую можно автоматизировать с помощью Ansible playbook. Создайте файл playbook с помощью vi
или предпочитаемого вами текстового редактора:
- vi playbook.yml
Это откроет пустой файл YAML. Прежде чем приступить к добавлению задач в свою книгу, начните со следующего:
---
- hosts: all
become: true
vars:
created_username: sammy
Не стесняйтесь заменить имя пользователя на любое по вашему выбору.
Почти каждая пьеса, с которой вы столкнетесь, будет начинаться с объявлений, подобных этому. hosts
объявляет, на какие серверы узел управления Ansible будет ориентироваться с этой книгой воспроизведения. become
указывает, будут ли все команды выполняться с повышенными привилегиями root.
vars
позволяет хранить данные в переменных. Если вы решите изменить это имя пользователя в будущем, вам нужно будет отредактировать только эту единственную строку в вашем файле.
Примечание. Если вы хотите увидеть файл плейбука в его окончательном законченном состоянии, перейдите к шагу 6. Файлы YAML могут отличаться своей структурой отступов, поэтому вы можете дважды проверить свой плейбук после добавления всех своих задач.
Шаг 3 — Добавление задач настройки пользователя Sudo в ваш Playbook
По умолчанию задачи выполняются Ansible синхронно в порядке сверху вниз в вашем плейбуке. Это означает, что порядок задач важен, и вы можете с уверенностью предположить, что одна задача завершит выполнение до того, как начнется следующая задача.
Все задачи в этом сборнике можно использовать отдельно и повторно использовать в других ваших сборниках.
Хорошей практикой является избегание чрезмерного использования пользователя root. Вы можете автоматизировать создание пользователя, которому предоставлены привилегии sudo
, добавив:
tasks:
- name: Setup passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%sudo'
line: '%sudo ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
- name: Create a new regular user with sudo privileges
user:
name: "{{ created_username }}"
state: present
groups: wheel
append: true
create_home: true
Вы используете модуль Ansible lineinfile
для нацеливания и замены определенной строки в файле. В этом случае вы используете регулярное выражение для нацеливания на определенную строку в файле sudoers
, а затем изменяете ее, чтобы разрешить использование sudo
без пароля. Вы также используете visudo
для проверки ваших изменений, чтобы ничего не сломать.
Чтобы воспользоваться этим, вы добавляете нового пользователя с помощью модуля user
. Ansible гарантирует, что этот пользователь будет создан, если он еще не существует, что пользователь принадлежит к группе wheel
(admin), но не будет удален из других групп, а также будет создан домашний каталог.
Примечание. Не забудьте заключить в кавычки фигурные скобки, указывающие на переменную. Отсутствие этих кавычек является очень распространенной синтаксической ошибкой Ansible.
Шаг 4 — Добавление настройки ключа SSH и отключение задач с корневым паролем в ваш Playbook
Ansible работает исходя из предположения, что вы используете ключи SSH. Настоятельно рекомендуется сочетать использование ключа SSH с отключением аутентификации по паролю root. Чтобы автоматизировать это, добавьте:
- name: Set authorized key for remote user
ansible.posix.authorized_key:
user: "{{ created_username }}"
state: present
key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
Модуль authorized_key
можно использовать, если вы укажете имя пользователя и расположение ключа. Здесь путь к вашему ключу создается с помощью функции Ansible lookup
.
Модуль lineinfile
используется для поиска и замены строки в sshd_config
, чтобы отключить аутентификацию по паролю для root, ограничивая доступ к его привилегиям для повышения безопасности.
Шаг 5 — Добавление задачи установки пакета в ваш Playbook
Ansible может гарантировать, что определенные пакеты всегда будут установлены на вашем сервере. Вместо того, чтобы вызывать dnf install
для каждого отдельного пакета или разбивать его на несколько задач, вы можете перечислить все нужные пакеты:
- name: Update and install required system packages
dnf:
pkg:
- curl
- vim
- git
- firewalld
state: latest
update_cache: true
Вы можете добавлять или удалять пакеты по своему вкусу. Это гарантирует, что все пакеты не только присутствуют, но и имеют последнюю версию, и выполняются после вызова обновления с помощью dnf
.
Шаг 6 — Просмотр полного сборника сценариев
Ваш плейбук должен выглядеть примерно так, с небольшими отличиями в зависимости от ваших настроек:
---
- hosts: all
become: true
vars:
created_username: sammy
tasks:
- name: Setup passwordless sudo
lineinfile:
path: /etc/sudoers
state: present
regexp: '^%sudo'
line: '%sudo ALL=(ALL) NOPASSWD: ALL'
validate: '/usr/sbin/visudo -cf %s'
- name: Create a new regular user with sudo privileges
user:
name: "{{ created_username }}"
state: present
groups: wheel
append: true
create_home: true
- name: Set authorized key for remote user
ansible.posix.authorized_key:
user: "{{ created_username }}"
state: present
key: "{{ lookup('file', lookup('env','HOME') + '/.ssh/id_rsa.pub') }}"
- name: Disable password authentication for root
lineinfile:
path: /etc/ssh/sshd_config
state: present
regexp: '^#?PermitRootLogin'
line: 'PermitRootLogin prohibit-password'
- name: Update and install required system packages
dnf:
pkg:
- curl
- vim
- git
- firewalld
state: latest
update_cache: true
Примечание. Это мягкое напоминание о том, что нужно помнить о своих отступах. Если вы столкнулись с ошибкой, это, скорее всего, виновник. YAML предлагает использовать 2 пробела в качестве отступа, как это было сделано в этом примере.
Когда вы будете удовлетворены своей игрой, вы можете выйти из текстового редактора и сохранить.
Шаг 7 — Запуск вашего Playbook в первый раз
Теперь вы готовы запустить эту книгу на одном или нескольких серверах. Большинство плейбуков по умолчанию настроены на выполнение на каждом сервере в вашем инвентаре, но на этот раз вы укажете свой сервер.
Чтобы выполнить playbook только на server1
, подключившись как root
, вы можете использовать следующую команду:
- ansible-playbook playbook.yml -l server1 -u root -k
Флаг -l
указывает ваш сервер, а флаг -u
указывает, под каким пользователем выполнять вход на удаленном сервере. Поскольку вы еще не настроили удаленный сервер, root — ваш единственный вариант. Флаг -k
необходим, если вы не используете SSH без пароля: вам будет предложено ввести пароль SSH.
Вы получите вывод, подобный этому:
Output
. . .
PLAY RECAP ***************************************************************************************************************************************************************************************************************************************************
server1 : ok=6 changed=5 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
Это означает, что настройка вашего сервера завершена! Ваш результат не обязательно должен быть точно таким же, но важно, чтобы у вас не было сбоев.
Теперь, когда вы выполнили первую настройку своего плейбука, все последующие вызовы ansible можно выполнять с пользователем sammy
(и без флага -k
, если вы использовали пароль в первую очередь):
- ansible-playbook playbook.yml -l server1 -u sammy
Вы также сможете войти на сервер с помощью:
- ssh sammy@your_remote_server_ip
Не забудьте заменить sammy на пользователя, определяемого переменной created_username
, и server_host_or_IP на имя хоста или IP-адрес вашего сервера.
Заключение
Автоматизация первоначальной настройки сервера может сэкономить ваше время, а также убедиться, что ваши серверы будут соответствовать стандартной конфигурации, которую можно улучшить и настроить в соответствии с вашими потребностями. Учитывая распределенный характер современных приложений и потребность в большей согласованности между различными промежуточными средами, подобная автоматизация становится необходимостью.
В этом руководстве вы продемонстрировали, как использовать Ansible для автоматизации первоначальных задач, которые должны выполняться на новом сервере, таких как создание пользователя без полномочий root с доступом sudo
, установка пакетов и отключение удаленного пароля. вход на основе root.
Для получения дополнительной информации о том, как запускать плейбуки Ansible, ознакомьтесь с нашим руководством по Ansible Cheat Sheet.
Если вы хотите включить в этот сборник новые задачи для дальнейшей настройки первоначальной настройки сервера, обратитесь к нашему вводному руководству по Ansible «Как использовать роли Ansible для абстрагирования вашей инфраструктурной среды».