Предоставьте доступ коллеге

AnsibleBeginner
Практиковаться сейчас

Введение

Small Frame Studio нужно, чтобы Ava и Noah работали на двух подготовленных хостах, а Maya сохранила свой доступ и заметки. Вы создадите ограниченные учебные аккаунты сотрудников с Ansible, используете их реальные SSH-идентичности и превратите декларацию для одного человека в переиспользуемый список.

Нужны базовая навигация в терминале и опыт чтения небольшого инвентаря и playbook Ansible. Лаборатория объясняет необходимые понятия аккаунта Linux, SSH-ключа, прав, lookup и цикла до использования. Все учебные ключи, доверенные идентичности хостов и отдельная коллекция подготовлены.

Настройте рабочий вход для Ava

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

Small Frame Studio хранит разные редакционные заметки на web1 и web2. Maya уже работает на обоих; Ava нужен доступ без потери работы Maya. Подготовленные цели — два SSH-контейнера, разделяющих ядро учебной VM, а не независимые VM. Ansible работает на контроллере и подключается как подготовленный аккаунт automation. Аккаунты сотрудников существуют только внутри этих учебных целей.

Откройте Controller. Он начинает в каталоге проекта. Эта команда также вернёт вас туда после ошибочного перехода:

cd /home/labex/project

Прочитайте инвентарь и утверждённые данные сотрудников через cat, который показывает файлы без изменения:

cat inventory.ini
cat approved-staff.json

Итоговый список содержит studio_ava и studio_noah для обоих хостов. Начнём с Ava, затем расширим ту же работу до списка. Не меняйте утверждённые входные данные, инвентарь и подготовленные настройки SSH.

SSH аутентифицирует пользователя на удалённом хосте. Публичный ключ можно установить на цель; соответствующий приватный ключ остаётся у клиента и доказывает владение. Здесь training-keys/ содержит новые одноразовые учебные ключи, а не настоящие личные данные доступа. Файлы с окончанием .pub публичные; одноимённый файл без этого суффикса — приватный. Не копируйте приватные ключи на цели и не выводите их содержимое.

Прочитайте подготовленную конфигурацию клиента:

cat clients.conf

Каждый псевдоним, например web1-maya, выбирает цель, учебное имя пользователя и приватный ключ. -F clients.conf указывает ssh использовать конфигурацию проекта. Она фиксирует доверенные ключи хостов, отключает запросы пароля и повторное использование соединений и предлагает только выбранную идентичность. Ключ хоста идентифицирует сервер; публичный ключ пользователя разрешает вход человеку. Это разные задачи. Не отключайте ни одну проверку доверия.

Сначала посмотрите на работающую идентичность сотрудника. Текст в одинарных кавычках — команда на удалённом хосте. Точка с запятой разделяет там две команды: определить пользователя, затем прочитать локальный рабочий файл.

ssh -F clients.conf web1-maya 'id -un; cat work/briefing.txt'

Будут выведены studio_maya и заметки студии Riverside. Прочитайте другой хост через новое соединение:

ssh -F clients.conf web2-maya 'id -un; cat work/briefing.txt'

Идентичность та же, но заметки другие — студии Hill. Сохраните оба файла. Сейчас подключение Ava должно завершиться отказом: её аккаунта и разрешения ещё нет.

ssh -F clients.conf web1-ava 'id -un'

Ожидайте Permission denied (publickey) и код выхода 255, а не запрос пароля. Тайм-аут соединения или предупреждение о ключе хоста — другая проблема: вернитесь в каталог проекта и проверьте неизменённые инвентарь/конфигурацию вместо ослабления доверия SSH.

У пользователя Linux есть домашний каталог, оболочка входа и основная группа. Модуль user создаёт аккаунт и на этих подготовленных целях одноимённую основную группу. create_home: true создаёт домашний каталог. become: true использует разрешённое повышение привилегий подготовленного аккаунта automation на целях; вход LabEx при этом не меняется.

Напишите полный playbook. В этом here-document > заменяет указанный файл контроллера, а заключённый в кавычки разделитель YAML предотвращает подстановки оболочки. Закрывающий разделитель должен стоять один в начале строки. При ошибке ввода повторите весь блок, заменив этот файл. Если оболочка ждёт отсутствующий закрывающий разделитель, нажмите Ctrl+C, отмените незавершённый ввод и выполните полный блок из обычного приглашения. YAML использует пробелы для вложенности и - для элементов списка.

cat > access.yml <<'YAML'
- name: Give Ava access to the studio hosts
  hosts: all
  become: true
  gather_facts: false
  tasks:
    - name: Create Ava's course account
      ansible.builtin.user:
        name: studio_ava
        shell: /bin/bash
        create_home: true
    - name: Keep Ava's home private
      ansible.builtin.file:
        path: /home/studio_ava
        state: directory
        owner: studio_ava
        group: studio_ava
        mode: '0750'
    - name: Create Ava's work directory
      ansible.builtin.file:
        path: /home/studio_ava/work
        state: directory
        owner: studio_ava
        group: studio_ava
        mode: '0750'
    - name: Authorize Ava's public key
      ansible.posix.authorized_key:
        user: studio_ava
        key: "{{ lookup('file', 'training-keys/ava.pub') }}"
        state: present
YAML

Модуль file управляет владельцами и правами каталогов, а не содержимым существующих рабочих файлов. Режим 0750 даёт владельцу полный доступ, основной группе — чтение/проход, другим пользователям — никакого. Кавычки вокруг цифр предотвращают числовую интерпретацию YAML. lookup читает публичный ключ с контроллера. Двойные фигурные скобки вычисляют выражение. state: present добавляет этот ключ, сохраняя остальные, и не заменяет целиком файл ключей аккаунта.

Модули с префиксом ansible.builtin поставляются с Core. ansible.posix.authorized_key входит в отдельную коллекцию, установленную офлайн для проекта. Он создаёт каталог пользователя .ssh с режимом 0700 и authorized_keys с режимом 0600; они принадлежат пользователю и его основной группе. Устанавливать коллекцию или менять настройки SSH-сервера не требуется.

Сначала проверьте синтаксис YAML/playbook:

ansible-playbook access.yml --syntax-check

При синтаксической ошибке прочитайте указанные файл и строку, сравните пробелы и кавычки с полным блоком, перепишите его и повторите проверку. Сброс VM не нужен. Прогноз check mode ненадёжен при первом создании: последующая задача ключей не может использовать аккаунт, создание которого предыдущая задача лишь предсказала. Примените объявленное создание, а режим проверки используйте, когда аккаунты уже существуют:

ansible-playbook access.yml

Оба хоста должны завершить работу без недоступных целей и ошибок задач. Теперь войдите как Ava и сохраните её реальную идентичность. В удалённых кавычках umask 027 ограничивает новые файлы правами не выше 0640; > записывает вывод id в файл прибытия, cat читает его обратно. Настройка действует только в оболочке этой удалённой команды.

ssh -F clients.conf web1-ava 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
ssh -F clients.conf web2-ava 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'

Обе команды выводят studio_ava. Вы выполнили настоящий вход сотрудника и запись файла, а не только получили успешную сводку Ansible. Отдельные файлы и вход Maya должны продолжать работать.

Переиспользуйте декларацию для списка сотрудников

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

Оставайтесь в Controller, в /home/labex/project. Каждая запись сотрудника содержит учебное имя пользователя и путь его публичного ключа на контроллере. Подготовленный каталог group_vars пуст. Файл group_vars/all.yml предоставляет переменные всем хостам инвентаря. Запишите утверждённый список двух человек:

cat > group_vars/all.yml <<'YAML'
staff:
  - name: studio_ava
    key_file: training-keys/ava.pub
  - name: studio_noah
    key_file: training-keys/noah.pub
YAML

Соответствующий host_vars/web1.yml может вместо этого предоставить список только для web1; значения хоста переопределяют общие значения группы по умолчанию. Здесь обоим хостам нужен один список, а challenge даёт разные утверждённые списки. Переиспользуемые задачи менять не нужно.

Цикл повторяет задачу для каждой записи staff. item.name читает текущее имя, item.key_file — путь публичного ключа. Один список управляет созданием аккаунтов, каталогов и разрешений. Замените playbook для одного человека переиспользуемой версией:

cat > access.yml <<'YAML'
- name: Manage the approved studio staff
  hosts: all
  become: true
  gather_facts: false
  tasks:
    - name: Create each course account
      ansible.builtin.user:
        name: "{{ item.name }}"
        shell: /bin/bash
        create_home: true
      loop: "{{ staff }}"
    - name: Keep each home private
      ansible.builtin.file:
        path: "/home/{{ item.name }}"
        state: directory
        owner: "{{ item.name }}"
        group: "{{ item.name }}"
        mode: '0750'
      loop: "{{ staff }}"
    - name: Create each work directory
      ansible.builtin.file:
        path: "/home/{{ item.name }}/work"
        state: directory
        owner: "{{ item.name }}"
        group: "{{ item.name }}"
        mode: '0750'
      loop: "{{ staff }}"
    - name: Add each approved public key
      ansible.posix.authorized_key:
        user: "{{ item.name }}"
        key: "{{ lookup('file', item.key_file) }}"
        state: present
      loop: "{{ staff }}"
YAML

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

Проверьте синтаксис и примените. Noah ещё не существует, поэтому ограничение check mode для начального создания по-прежнему действует.

ansible-playbook access.yml --syntax-check
ansible-playbook access.yml

Ava не должна требовать новых изменений; Noah создаётся на обеих целях. Прочитайте результаты по элементам и проверьте unreachable=0 и failed=0 в обеих сводках. Используйте реальную идентичность Noah для создания его собственного рабочего файла:

ssh -F clients.conf web1-noah 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'
ssh -F clients.conf web2-noah 'umask 027; id -un > work/arrival.txt; cat work/arrival.txt'

Обе команды выводят studio_noah. Файлы прибытия Ava остаются её собственными, заметки Maya не меняются. Прочитайте их через исходные идентичности:

ssh -F clients.conf web1-ava 'cat work/arrival.txt'
ssh -F clients.conf web2-ava 'cat work/arrival.txt'
ssh -F clients.conf web1-maya 'cat work/briefing.txt'
ssh -F clients.conf web2-maya 'cat work/briefing.txt'

Теперь все необходимые пользователи существуют. --check предсказывает поддерживаемые изменения без применения:

ansible-playbook access.yml --check

Обе сводки должны сообщить changed=0, unreachable=0 и failed=0. Повторите настоящую декларацию:

ansible-playbook access.yml

Она также должна сообщить об отсутствии изменений. Это идемпотентность объявленных аккаунтов, каталогов и разрешений ключей; обычный SSH-доступ всё ещё может писать системные журналы входа. Тот же цикл использует другой утверждённый список без переписывания реализации.

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

Резюме

Вы создали учебные аккаунты, приватные рабочие каталоги и разрешения публичных ключей, сохранили работу через реальные SSH-идентичности, заменили повторение для одного человека структурированным циклом сотрудников и подтвердили сходимость, сохранив существующие доступ и заметки.