Поиск по сайту:

Как использовать 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:

  1. Создайте нового пользователя sudo и настройте sudo без пароля.
  2. Скопируйте локальный открытый ключ SSH и включите его в файл authorized_keys для нового администратора на удаленном узле (если вы ранее использовали пароль для SSH).
  3. Отключите аутентификацию на основе пароля для пользователя root.
  4. Установите системные пакеты.

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

Для начала войдите в систему с включенным пользователем sudo на сервере узла управления Ansible.

Шаг 1 — Подготовка узла управления Ansible

На сервере узла управления Ansible добавьте IP-адрес удаленного сервера узла Ansible в файл инвентаризации Ansible. С помощью vi или предпочитаемого вами текстового редактора откройте файл инвентаризации Ansible:

  1. sudo vi /etc/ansible/hosts

Это откроет ваш файл инвентаризации Ansible. Добавьте IP-адрес удаленного сервера хоста Ansible в блок [servers]:

[servers]
server1 ansible_host=your_remote_server_ip

. . .

Сохраните и закройте файл.

Теперь вы проверите и аутентифицируете свое SSH-соединение между этим управляющим узлом Ansible и вашим удаленным хост-сервером Ansible:

  1. ssh root@your_remote_server_ip

Примите запрос на аутентификацию и введите свой пароль, если будет предложено. После того, как вы проверили соединение SSH, нажмите CTRL+D, чтобы закрыть соединение и вернуться к своему управляющему узлу.

Шаг 2 — Подготовка вашего Playbook

В файле playbook.yml определены все ваши задачи. Задача — это наименьшая единица действия, которую можно автоматизировать с помощью Ansible playbook. Создайте файл playbook с помощью vi или предпочитаемого вами текстового редактора:

  1. 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, вы можете использовать следующую команду:

  1. 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, если вы использовали пароль в первую очередь):

  1. ansible-playbook playbook.yml -l server1 -u sammy

Вы также сможете войти на сервер с помощью:

  1. ssh sammy@your_remote_server_ip

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

Заключение

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

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

Для получения дополнительной информации о том, как запускать плейбуки Ansible, ознакомьтесь с нашим руководством по Ansible Cheat Sheet.

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