迁移服务到另一台主机

AnsibleBeginner
立即练习

介绍

Riverlight Weekend 已有可用的节目,新准备的替代来源也已获准。你只需要将网站的节目连接迁移到新成员,同时保留场地、当前访客体验和原节目来源。

请先完成“接通活动页面”,或熟悉 inventory 分组、hostvars、模板、只读 uri 断言和 handler。本独立实验提供前面已教过的 playbook 与模板,无需安装服务或迁移来源数据。时长为作者估计。

迁移节目并保留原来源

在本步骤中,你将修改一个 inventory 分组,使用已准备好的替代节目,同时保留场地连接和原来源。

这是一个独立环境。Event Site 已提供可用的 Riverlight 节目,但获准的新来源包含不同活动。打开 Program:旧节目显示 Morning sketchbook 和 Lunch by the river。Visit 与 Visitor guide 也已可用,在更换成员期间必须始终保持可用。

切换到 Controller,起始目录是 /home/labex/project。上个实验中带前置检查的 connect.yml 和路由模板已提供;本 VM 不依赖上一个实验的文件。如果丢失当前目录,使用 cd /home/labex/project 返回。阅读获准的选择与当前分组成员:

cat approved-services.txt
cat inventory.ini
ansible-inventory --graph

获准的节目现在位于 web2,版本为 2026-revised。inventory 仍选择提供旧节目的 web1。web2 还在另一个端口提供场地服务:同一主机可以属于两个分组,因为成员关系表达的是服务角色,并不要求每种角色都使用独立机器。两个来源容器共享训练 VM 内核,入口运行在控制节点上。

查看主机数据和两个来源的身份。与前面一样,curl --config 从文件读取准备好的 URL 和错误报告选项:

cat host_vars/web2.yml
cat requests/new-program.conf
curl --config requests/new-program.conf
curl --config requests/old-program.conf

新旧两个来源都能使用,但只有新版本应接入当前网站入口。迁移连接并不意味着可以删除旧来源或其文件。

阅读提供的可复用自动化:

cat connect.yml
cat templates/routes.json.j2

groups['program'][0] 选择节目成员,hostvars 提供其地址和 program_port。场地表达式独立使用自己的分组与 venue_port。HTTP 断言位于模板之前。路由变化时会通知准备好的重新加载辅助程序,让现有入口进程重新加载。

用下面的内容替换这个小型 inventory。与第一个实验一样,这里使用 cat、输出重定向和带引号的 here-document。结束标记 EOF 必须单独占一行;若遗漏分隔符,按 Ctrl+C,再重新执行完整代码块。不要修改主机数据或获准版本:

cat > inventory.ini <<'EOF'
[gateway]
entry ansible_connection=local ansible_python_interpreter=/usr/bin/python3

[program]
web2

[venue]
web2
EOF
ansible-inventory --graph

现在两个服务分组都应包含 web2,本地 entry 仍位于 [gateway]。若分组拼写有误或多了成员,先在此文件中改正,不要在模板里写死地址来补偿。

检查语法并预览路由:

ansible-playbook connect.yml --syntax-check
ansible-playbook connect.yml --check --diff

只读 HTTP 探测会在预览期间执行,必须识别出获准的节目和场地。只有节目路由应发生变化;场地地址与端口保持原样。预览不会重新加载网关。应用变更:

ansible-playbook connect.yml

预期看到模板变化和 RUNNING HANDLER [Reload entry]。打开 Event Site,进入 Program,确认 Paper and ink、Acoustic afternoon 和 Shared supper 替代了旧节目。点击 Download the schedule,再打开 Visit 和 Visitor guide。它们应仍显示相同场地和到访说明。

入口现在应显示替代节目。注意三个活动,以及下载链接下方的 2026-revised 版本:

通过现有入口接通的替代节目

返回 Controller,把当前下载保存到 VM 中;-o 指定输出文件:

curl -fsS http://127.0.0.1:8081/program/schedule.csv -o schedule.csv
cat schedule.csv

CSV 必须列出当前三个活动,而非旧节目的两个活动。确认旧来源仍可直接响应:

curl --config requests/old-program.conf

它应仍标识为 program、riverlight、2026-original。它退出了入口配置,并未被关闭。这样既保留数据,也保留独立参考来源,同时不再把它当作当前所选来源。

最后重复运行 playbook:

ansible-playbook connect.yml

预期 changed=0、failed=0,且没有重新加载 handler。若某个来源暂时不可用,已有前置检查必须在模板之前停止;连接失败不是删除旧节点的指令。修正所选成员或来源数据引用,再重试。也可以用第一个实验的 sha256sum 比较方式确认入口文件未变化。

只管理 inventory 成员关系、可复用的 connect.yml 与 templates/routes.json.j2,以及通过该 playbook 管理的路由文件。保留提供的主机变量、获准活动标识与版本、来源内容、组织者私密便签、全部来源服务和网关实现。探测与模板应能适应不同成员名、地址和端口。重新加载时使用提供的 /opt/labex/service-links/reload.py 和本项目入口目录。采用已教的直接 uri、assert、template 任务与限定范围的重新加载 command handler;不要掩盖探测失败,也不要在 check mode 下执行写入。

总结

你修改了服务成员关系,而不是嵌入一个新地址;预览路由并应用变更后,通过真实网站和 CSV 确认了新节目。原来源仍可独立访问,场地和访客指南也保持完整。