Введение
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-идентичности, заменили повторение для одного человека структурированным циклом сотрудников и подтвердили сходимость, сохранив существующие доступ и заметки.



