소개
Small Frame Studio에서는 Ava와 Noah가 준비된 두 호스트에서 작업하는 동안 Maya의 기존 접근과 메모를 유지해야 합니다. Ansible로 범위가 한정된 직원 계정을 만들고 실제 SSH 신원을 사용하며, 한 사람용 선언을 재사용 가능한 직원 목록으로 바꿉니다.
기본 터미널 탐색과 작은 Ansible 인벤토리 및 플레이북을 읽어 본 경험이 필요합니다. 필요한 Linux 계정, SSH 키, 권한, lookup과 루프 개념은 사용하기 전에 설명합니다. 모든 교육 키, 신뢰된 호스트 신원과 별도의 컬렉션은 준비되어 있습니다.
Ava가 로그인해 작업하도록 설정하기
이 단계에서는 두 스튜디오 호스트에 과정 계정 하나를 만들고 교육 키를 승인한 뒤 그 신원으로 실제 작업 파일을 저장합니다.
Small Frame Studio는 web1과 web2에 서로 다른 편집 메모를 보관합니다. Maya는 이미 두 호스트에서 작업하며, Ava의 접근을 추가해도 Maya의 작업을 잃으면 안 됩니다. 준비된 대상은 교육 VM의 커널을 공유하는 SSH 컨테이너 두 개이며 독립 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 로그인은 바꾸지 않습니다.
완전한 플레이북을 작성하세요. 이 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/플레이북 문법을 확인하세요.
ansible-playbook access.yml --syntax-check
문법 오류가 나면 보고된 파일과 줄을 읽고 전체 블록과 공백 및 따옴표를 비교하여 다시 작성한 뒤 검사를 반복하세요. VM 초기화는 필요하지 않습니다. 최초 생성의 check mode 예측은 신뢰하기 어렵습니다. 앞선 작업이 생성한다고 예측만 한 계정을 뒤의 키 작업은 사용할 수 없기 때문입니다. 선언한 생성을 실제 적용하고 계정이 존재한 다음 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은 공개 키 경로를 읽습니다. 같은 목록이 계정, 디렉터리와 권한 생성을 이끕니다. 한 사람용 플레이북을 재사용 가능한 버전으로 교체하세요.
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의 도착 파일은 여전히 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 신원으로 작업을 저장했습니다. 한 사람씩 반복하던 구성을 구조화된 직원 루프로 바꾸고, 기존 직원의 접근과 메모를 보존하면서 수렴을 확인했습니다.



