Введение
Ava заменила старый ноутбук студии. Оба подготовленных хоста всё ещё принимают его ключ наряду с текущим и резервным ключами. Удалите только разрешение старого устройства, сохранив её аккаунт и оригинальные заметки.
Эта независимая лабораторная работа предполагает практику пользователей, публичных ключей, lookup и циклов из «Предоставьте доступ коллеге». Её собственные учебные ключи и существующие аккаунты подготовлены; файлы и подключения предыдущей VM не наследуются.
Удалите ключ одного старого устройства
На этом шаге вы отзовёте ключ старого устройства Ava на двух хостах студии, докажете отказ новых соединений и сохраните её текущий ключ, резервный ключ и исходную работу.
У этой лабораторной работы собственная свежая среда. Ava уже имеет аккаунты и работу на обеих целях. Каждый аккаунт сейчас принимает три учебных ключа: текущий, резервный и старого устройства. Вы удалите только старое разрешение. Удаление ключа блокирует новую аутентификацию с ним, но не завершает уже аутентифицированное соединение. Лаборатория тестирует новые подключения и не заявляет завершение сеансов.
Откройте Controller и перейдите в проект. Эта команда также помогает после случайного перехода в другой каталог:
cd /home/labex/project
Прочитайте подготовленные данные и псевдонимы клиента:
cat approved-staff.json
cat clients.conf
Утверждённый аккаунт — studio_ava. Отозвать нужно training-keys/ava-old.pub; training-keys/ava.pub и training-keys/ava-backup.pub остаются разрешёнными. Ключи с окончанием .pub публичные; соответствующие приватные остаются на учебном клиенте. Псевдонимы выбирают хост, пользователя и точный ключ. -F clients.conf выбирает конфигурацию проекта с зафиксированным доверием; каждый вызов ssh создаёт новое соединение. Не меняйте инвентарь, настройки клиента, доверие хостам и учебные ключи.
До изменения доступа посмотрите нормальное поведение. В одинарных кавычках удалённая оболочка выполняет id, затем cat; их разделяет точка с запятой:
ssh -F clients.conf web1-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava 'id -un; cat work/briefing.txt'
На обоих идентичность studio_ava, но заметки Riverside и Hill отличаются. Проверьте и резервный ключ:
ssh -F clients.conf web1-ava-backup 'id -un'
ssh -F clients.conf web2-ava-backup 'id -un'
Старое устройство на этом этапе ещё принимается:
ssh -F clients.conf web1-ava-old 'id -un'
ssh -F clients.conf web2-ava-old 'id -un'
Просто удалить ключ из списка добавляемых — не значит запросить его удаление с цели. Безопасно посмотрите разницу на пустом списке добавления. Here-document пишет полный файл контроллера: > заменяет его, а YAML в кавычках предотвращает подстановки оболочки. Закрывающий разделитель должен стоять один в начале строки. Если оболочка ждёт отсутствующий закрывающий разделитель, нажмите Ctrl+C для отмены незавершённого ввода, затем выполните полный блок из обычного приглашения. Циклу по [], пустому списку YAML, нечего обрабатывать.
cat > additions.yml <<'YAML'
- name: Add listed keys without removing other grants
hosts: all
become: true
gather_facts: false
vars:
keys_to_add: []
tasks:
- name: Add a listed key
ansible.posix.authorized_key:
user: studio_ava
key: "{{ lookup('file', item) }}"
state: present
loop: "{{ keys_to_add }}"
YAML
ansible-playbook additions.yml
Задача ключей пропущена на обоих хостах, изменений нет. Она не проверила все возможные разрешения и не убрала ключи вне списка. Старое устройство по-прежнему подключается:
ssh -F clients.conf web1-ava-old 'id -un'
Теперь объявите настоящий отзыв. group_vars/all.yml предоставляет список обоим хостам инвентаря, не меняя подготовленный файл утверждения. Каждый объект указывает учебного пользователя и путь публичного ключа на контроллере. Повторение неверного файлового блока заменяет этот файл контроллера; сбрасывать VM не нужно.
cat > group_vars/all.yml <<'YAML'
revoked_keys:
- name: studio_ava
key_file: training-keys/ava-old.pub
YAML
Используйте изученный модуль ключей с state: absent: он удаляет этот ключ, сохраняя аккаунт и другие разрешения. Цикл обрабатывает каждое указанное удаление. Двойные фигурные скобки подставляют значения текущей записи; lookup читает публичный ключ на контроллере. Коллекция установлена офлайн для проекта. Не применяйте эксклюзивную замену, не удаляйте домашние каталоги, не блокируйте пароли и не меняйте SSH-службу платформы.
cat > revoke.yml <<'YAML'
- name: Revoke only the approved old device keys
hosts: all
become: true
gather_facts: false
tasks:
- name: Remove each listed old public key
ansible.posix.authorized_key:
user: "{{ item.name }}"
key: "{{ lookup('file', item.key_file) }}"
state: absent
loop: "{{ revoked_keys }}"
YAML
Проверьте синтаксис. При ошибке YAML прочитайте указанную строку, сравните отступы/кавычки с полным блоком и перепишите только этот файл контроллера.
ansible-playbook revoke.yml --syntax-check
Эти аккаунты уже существуют, поэтому поддерживаемый check mode может предсказать удаление ключа. --diff вывел бы строки публичных ключей, не нужные для этого просмотра. Используйте --check:
ansible-playbook revoke.yml --check
Оба хоста должны предсказать изменение. Режим проверки ещё не отозвал настоящее разрешение. Примените его:
ansible-playbook revoke.yml
Оба хоста должны завершиться без недоступных целей или сбоев задач. Следующие два соединения должны отказать с Permission denied (publickey) и кодом выхода 255:
ssh -F clients.conf web1-ava-old 'id -un'
ssh -F clients.conf web2-ava-old 'id -un'
Тайм-аут, отказ сетевого соединения или предупреждение о ключе хоста не доказывают отзыв. Сервер должен оставаться доступным, разрешённые ключи — рабочими. Создайте новые текущие и резервные соединения для чтения обоих исходных файлов:
ssh -F clients.conf web1-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava 'id -un; cat work/briefing.txt'
ssh -F clients.conf web1-ava-backup 'id -un; cat work/briefing.txt'
ssh -F clients.conf web2-ava-backup 'id -un; cat work/briefing.txt'
Все четыре должны успешно войти как studio_ava и показать соответствующие исходные заметки. Сохраните байты, владельца и режим 0640; домашний/рабочий каталоги оставьте 0750, .ssh — 0700, authorized_keys — 0600. Файлы принадлежат studio_ava и её основной группе. Существующий модуль ключей сохраняет эти подготовленные безопасные права.
Повторите настоящую декларацию, затем её прогноз:
ansible-playbook revoke.yml
ansible-playbook revoke.yml --check
Обе сводки должны показать changed=0, unreachable=0 и failed=0. Правильный отзыв — выборочное изменение действительной авторизации, а не просто успешная сводка или пустой список контроллера. При выборе неверного пути исправьте данные контроллера; восстановите ошибочно удалённый законный ключ изученным state: present, затем снова примените верное точечное удаление. Не восстанавливайте доступ очисткой всего файла ключей или разрешением записи всем.
Резюме
Вы отличили пропущенное добавление от явного отзыва, удалили одно разрешение публичного ключа через state absent, проверили настоящий отказ новых соединений и сохранили текущий/резервный вход и оба исходных рабочих файла. Неизменённая декларация сошлась без лишних изменений.



