为同事开通访问

AnsibleBeginner
立即练习

介绍

Small Frame Studio 需要 Ava 和 Noah 在两台准备好的主机上工作,同时 Maya 保留已有访问和笔记。你将用 Ansible 创建限定范围内的员工账户,使用真实 SSH 身份,并把单人的声明改造成可复用员工列表。

你需要基本终端导航,以及阅读小型 Ansible 清单和 playbook 的练习。本实验在使用前解释所需的 Linux 账户、SSH 密钥、权限、lookup 和循环概念。所有训练密钥、可信主机身份和独立 collection 均已准备好。

让 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 用户具有主目录、登录 shell 和主组。user 模块创建账户,并在这些准备好的目标上创建同名主组。create_home: true 创建主目录。become: true 使用准备好的 automation 账户在目标上获得已授权的提升权限,不会改变 LabEx 登录。

编写完整 playbook。此 here-document 中,> 替换指定的控制端文件,带引号的 YAML 分隔符阻止 shell 展开内容。结束分隔符必须单独位于一行开头。若某个块输入有误,重跑整个块即可替换该文件。若 shell 因缺少结束分隔符仍在等待,按 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 来自单独的 collection,已为本项目离线安装。它会创建用户的 .ssh 目录(模式 0700)和 authorized_keys(模式 0600),归该用户及其主组所有。你无需安装 collection 或编辑 SSH 服务器设置。

先检查 YAML/playbook 语法:

ansible-playbook access.yml --syntax-check

若有语法错误,阅读报告的文件和行,与完整代码块比较空格和引号,重写后再检查,无需重置 VM。初次创建时,check mode 预览不可靠:后续密钥任务无法使用前一个任务仅预测会创建的账户。先实际应用创建声明,待账户存在后再用 check mode:

ansible-playbook access.yml

两台主机都须在没有不可达或失败任务的情况下完成。现在以 Ava 登录,保存她的真实身份。远端引号内的 umask 027 将新文件权限限制在至多 0640;> 把 id 的输出写到到达文件,cat 再读回。该设置只作用于本次远端命令的 shell。

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 身份保存工作,用结构化员工循环替代重复的单人配置,并在保留已有员工访问与笔记的同时确认收敛。