网易首页 > 网易号 > 正文 申请入驻

仅需一条命令,Ansible轻松重现我的家庭实验室

0
分享至

html

我抵制为我的家庭实验室设置自动化很长一段时间,部分原因是我想手动重复这个过程,以便加深记忆,帮助学习。这意味着我错过了那些方便的命令行工具来进行一行修复,但我专注于设置的错误方面。如果我能重新来过,我会从一开始就学习像Terraform、Ansible和Packer这样的自动化工具,因为将基础设施视为代码(IaC)的范式转变,如果你已经陷入某种工作方式,会花费更长的时间。

现在我正在深入学习自动化所需的符文(抱歉,YAML和Jinja),并设置文本文件的文件夹,将它们串联成一个最终命令,只需几次按键就能重现我的家庭实验室。老实说,这种力量令人陶醉,但也有点令人畏惧,这就是为什么我一直在逐步进行。我离这个目标越来越近,使用Ansible,但还没有完全实现。

为什么Ansible是正确的答案
也许这些年我问错了问题

我老实说。我的家庭实验室在最好的时候几乎是无序的混乱。目前,它分布在两台运行Proxmox的迷你PC上,彼此差异巨大:一台有大量存储和低功耗CPU,另一台则配备Strix Halo、128GB内存和2TB存储。它还有一个NAS,里面仍然有我曾经使用但尚未完全替换(还在等待替换)的程序残余,以及一台Threadripper机器,由于我在等待一些部件到货,尚未完全配置。

在网络方面,它也是一个混合的组合,主要是Zyxel的设备,但有一些Firewalla设备在轮换使用。Firewalla路由器和接入点将很快成为未被触动的家庭网络,而家庭实验室即将进行一次重大升级,增加一些Unifi设备的机架。

关键不在于硬件;而是我需要一个多功能的解决方案,能够处理每个设备,平台无关且易于管理。我本可以选择Terraform(也许在玩了一段时间后我应该选择它),但我不喜欢中途放弃,所以Ansible有更多的时间来证明自己,而我在努力克服困难。

我的最终目标是用一行命令重现我的家庭实验室,ansible-playbook site.yml --vault-password-file ~/.vault_password

. 这个过程进展缓慢,但我希望只需做一次,因为我将最终拥有一个完全记录的家庭实验室,包含虚拟机、秘密管理、网络及其他一切。

这不是Proxmox管理的最佳解决方案

虽然Ansible可以用于许多任务,但它需要一些调整才能与Proxmox配合使用。 Proxmox主机需要安装一些工具,以便能够利用Proxmox Rest API,主要是Proxmoxer及其所需的Python依赖。

apt install build-essential python3-dev libguestfs-tools -y

apt install python3 virtualenv

apt install python3 proxmoxer

与任何其他外部工具一样,我还需要一个API令牌,以便Ansible能够在我的主机上运行剧本。我决定不使用root用户,因为我想正确地做事,所以ansible@pam应运而生,我取消选中特权分离框,以避免后续的ACL问题。

这其实不是最难的部分,因为我需要在Ansible中使用community.general.proxmox_kvm模块,而不是更新的community.proxmox.proxmox.lxc模块。这意味着每个虚拟机剧本看起来像这样(但我的秘密和其他信息已被替换):

- name: 从定义中配置虚拟机

community.general.proxmox_kvm:

proxmox_default_behavior: "{{ proxmox_behavior | default('no_defaults') }}"

node: "{{ item.node }}"

vmid: "{{ item.vmid }}"

name: "{{ item.name }}"

memory: "{{ item.memory | default(2048) }}"

cores: "{{ item.cores | default(2) }}"

sockets: "{{ item.sockets | default(1) }}"

disk: "{{ item.disk | default('100') }}"

storage: "{{ item.storage | default('local-lvm') }}"

ostype: l26 # Linux 2.6+

osimage: "{{ item.osimage | default('ubuntu-20.04-standard') }}" # 操作系统镜像

netif: # 网络接口

net0: "virtio,bridge=vmbr{{ item.vlan | default('0') }}" # 网络配置

ipconfig0: "{{ item.ip_config | default('dhcp') }}" # IP配置

sshkeys: "{{ lookup('file', '~/.ssh/ansible_homelab.pub') }}" # SSH密钥

state: present # 状态

proxmox_default_behavior: no_defaults # Proxmox默认行为

loop: "{{ vms_to_create | default([]) }}" # 循环创建虚拟机

when: vms_to_create is defined # 当虚拟机列表已定义时

tags: vm_creation # 标签: 虚拟机创建

- name: 启动虚拟机 (Start VMs)

command: "qm start {{ item.vmid }}" # 启动指定的虚拟机

changed_when: false # 状态未改变

loop: "{{ vms_to_create | default([]) }}" # 循环创建虚拟机

when:

- vms_to_create is defined # 当虚拟机列表已定义时

- item.state | default('started') == 'started' # 如果状态为启动

- name: 等待虚拟机启动并获取IP地址

uri:

url: "{{ proxmox_url }}/api2/json/nodes/{{ item.node }}/qemu/{{ item.vmid }}/status/current" # API请求的URL

user: "{{ proxmox_user }}" # 用户名

password: "{{ proxmox_password }}" # 密码

validate_certs: no # 不验证证书

register: vm_status # 注册虚拟机状态

until: vm_status.json.data.status == 'running' # 直到虚拟机状态为运行中

重试次数:30

延迟:2

循环: "{{ vms_to_create | default([]) }}"

条件:vms_to_create 已定义

我们的 CMS 经常会提取 Ansible playbook 所需的缩进格式。大多数 IDE 都知道缩进的规则,而我现在很高兴使用 Cursor 进行开发。

记录所有内容是需要时间的
尤其是因为在设置过程中我什么都没记录

最终的目标是建立一个遵循最佳实践的完整项目结构,每个方面都细分为更小的角色:

homelab-infra/

├── ansible.cfg # 全局 Ansible 配置

├── site.yml # 主要入口 playbook

├── requirements.yml # Ansible 集合和角色

├── inventory/

│ ├── 00-static.yml # 手动定义主机和组

│ ├── 01-proxmox-dynamic.yml # 动态 Proxmox 插件配置

│ └── 02-constructed.yml # 组的后处理

├── group_vars/

│ ├── all.yml # 全局变量

│ ├── proxmox.yml # Proxmox 特定配置

│ ├── networking.yml # VLAN、DNS、NTP 配置

│ └── vault.yml # 加密的秘密(Ansible Vault)

├── host_vars/ # 主机特定的变量(如有需要)

├── roles/

│ ├── bootstrap/ # SSH 密钥的设置和初始访问

│ ├── proxmox_baseline/ # Proxmox 节点配置

│ ├── networking/ # VLAN、路由、防火墙

│ ├── vm_provisioning/ # 虚拟机的创建与销毁

│ ├── services/ # Docker, K3s, 监控

│ └── security/ # 安全加固, 备份

├── playbooks/

│ ├── bootstrap.yml # Ansible 初始化设置

│ └── configure.yml # 主要配置

├── roles/common/

│ ├── tasks/

│ │ └── main.yml

│ ├── handlers/

│ │ └── main.yml

│ ├── templates/

│ ├── vars/

│ │ └── main.yml

│ └── defaults/

│ └── main.yml

└── .gitignore # 排除 vault.yml, secrets 等

目前,我已经将网络部分规划并处理完毕,并使从 Proxmox 主机获取动态库存的功能正常运作。这个计划中的一些内容目前在我的实验室中还没有实现,比如 K3s,但它们随时可能成为功能,所以趁着我脑子里还在想着 Ansible 语法,干脆把这项工作做了。

我可不能忘了秘密管理

我最近开始使用 Bitwarden 来存储我在 Docker 文件中使用的秘密,我也想为我的 Ansible 剧本做同样的事。Ansible Vault 在使用时会创建加密字符串或文本文件,然后你可以在剧本中引用这些加密文件,让你的秘密,嗯……保持秘密。

ansible-vault create group_vars/vault.yml

这会让你创建一个 vault 密码,Ansible 会为你打开一个窗口,以便你添加 API 密钥、密码和其他秘密。我的文件里只有几个项目,因为我的家庭实验室比较简单,但随着我的需求增加,我可以在这个文件中添加更多内容。

# Proxmox API 凭证

vault_proxmox_user: automation@pve

vault_proxmox_password: "

# 服务凭证

vault_docker_registry_username: 我的用户名

vault_docker_registry_password: 我的密码

# 数据库凭据

vault_postgres_root_password: "(请填写密码)"

vault_postgres_replication_password: "(请填写密码)"

# TLS 证书

vault_tailscale_auth_key: "tskey-XXXXXXX"

然后,每个使用秘密的剧本都需要引用这个保管库,具体如下:

- name: 配置 Proxmox API 访问

set_fact:

proxmox_user: "{{ vault_proxmox_user }}"

proxmox_password: "{{ vault_proxmox_password }}"

- name: 用秘密来部署服务

docker_container:

name: postgres

image: postgres:14

env:

POSTGRES 密码: "{{ vault_postgres_root_password }}"

POSTGRES 复制密码: "{{ vault_postgres_replication_password }}"

老实说,这确实有点麻烦,但我更希望我的密码和 API 密钥能够被加密,尤其是因为我打算把剧本存储在自托管的 Git 实例里进行版本控制。而且我可不能忘了在那些任务里加上no_log: true,因为没人想在日志文件里泄露自己的秘密。

Ansible 是我脑子里需要的活文档工具

我很享受学习 Ansible 和它的语法。我知道我不会主动做文档,除非被迫,而把自动化工具当作文档,这种脑力黑客我很能接受。我期待有一天能用一行代码重建我的家庭实验室,无论我把它搞得多糟糕。当然,前提是我弄坏的东西不是实物,这可是完全不同的事情要处理。

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
最新:2026年3月全国25-29岁失业率破历史最高纪录——

最新:2026年3月全国25-29岁失业率破历史最高纪录——

叶初七
2026-04-24 15:01:00
64岁俞敏洪独居北京,妻儿定居加拿大原因曝光,原来他是身不由己

64岁俞敏洪独居北京,妻儿定居加拿大原因曝光,原来他是身不由己

阅微札记
2026-04-24 14:49:10
今夜,利好!涨疯了

今夜,利好!涨疯了

中国基金报
2026-04-25 00:19:32
亲手送吴亦凡入狱5年后,都美竹迎噩耗,法院出手或使其饭碗不保

亲手送吴亦凡入狱5年后,都美竹迎噩耗,法院出手或使其饭碗不保

老吴教育课堂
2026-04-25 01:00:44
成都天府新区投资集团董事长王科接受审查调查

成都天府新区投资集团董事长王科接受审查调查

界面新闻
2026-04-24 17:21:53
北控无缘季后赛!张庆鹏充满遗憾,直指球员问题,并亲承自己总结

北控无缘季后赛!张庆鹏充满遗憾,直指球员问题,并亲承自己总结

篮球资讯达人
2026-04-25 01:46:50
Coco又曝猛料!谢贤冬天解衣让她取暖,把女儿珠宝让她戴,太会了

Coco又曝猛料!谢贤冬天解衣让她取暖,把女儿珠宝让她戴,太会了

橙星文娱
2026-04-24 12:12:33
贝克汉姆家终于认清现实:儿子都是废柴,搞钱还得靠14岁的女儿

贝克汉姆家终于认清现实:儿子都是废柴,搞钱还得靠14岁的女儿

白露文娱志
2026-04-24 15:10:07
洗脑、性侵、乱伦,全球头号变态复出了

洗脑、性侵、乱伦,全球头号变态复出了

独立鱼
2026-04-23 22:35:39
铜梁龙董事长:演唱会280那么多人抢,足球80还有人骂,所以要改变

铜梁龙董事长:演唱会280那么多人抢,足球80还有人骂,所以要改变

懂球帝
2026-04-25 00:06:57
台媒猛料:赵薇前夫出轨女儿家教生私生子,卷走财产让她空手离婚

台媒猛料:赵薇前夫出轨女儿家教生私生子,卷走财产让她空手离婚

小邵说剧
2026-04-23 16:41:13
指挥官被斩,20年大仇欲报!以军血洗黎南重镇,内塔赌上政治生命

指挥官被斩,20年大仇欲报!以军血洗黎南重镇,内塔赌上政治生命

嫹笔牂牂
2026-04-23 11:36:56
全面取消“宽带5G融合套餐”,或是运营商未来扭转局面的最佳出路!

全面取消“宽带5G融合套餐”,或是运营商未来扭转局面的最佳出路!

通信老柳
2026-04-24 08:21:36
34岁女神裁判波娃抽烟照曝光!大量中国男球迷脱粉,滤镜碎了

34岁女神裁判波娃抽烟照曝光!大量中国男球迷脱粉,滤镜碎了

喜欢历史的阿繁
2026-04-24 18:13:27
乌专家:中国“榨干”苏联遗产,我们图纸都没看懂,他们造出2.0

乌专家:中国“榨干”苏联遗产,我们图纸都没看懂,他们造出2.0

马蹄烫嘴说美食
2026-04-24 18:45:06
演唱会现场气味熏天!粉丝哭诉:求来之前洗个澡吧

演唱会现场气味熏天!粉丝哭诉:求来之前洗个澡吧

东方不败然多多
2026-04-24 16:03:20
曾凡博时隔80天复出18+4三分!北京50分狂胜吉林 麦基18+5

曾凡博时隔80天复出18+4三分!北京50分狂胜吉林 麦基18+5

醉卧浮生
2026-04-24 21:16:18
蒋万安发出强硬警告,"中国台湾省"走向国际,10国选择明智应对

蒋万安发出强硬警告,"中国台湾省"走向国际,10国选择明智应对

影孖看世界
2026-04-24 11:59:09
女司机与保安“和好”?画面低俗,回应来了

女司机与保安“和好”?画面低俗,回应来了

都市快报橙柿互动
2026-04-24 18:14:22
伊朗方面否认卡利巴夫辞去谈判代表团团长一职

伊朗方面否认卡利巴夫辞去谈判代表团团长一职

界面新闻
2026-04-25 07:09:27
2026-04-25 08:35:00
生活魔术专家
生活魔术专家
里是「生活百科全书」,汇集了独特的生活小妙招和所见所得,让你轻松发现生活的美好与智慧
692文章数 6363关注度
往期回顾 全部

科技要闻

DeepSeek V4牵手华为,价格依然"屠夫级"

头条要闻

两届奥运冠军、中国羽协主席张军"失联" 知情人士发声

头条要闻

两届奥运冠军、中国羽协主席张军"失联" 知情人士发声

体育要闻

上海男篮23连胜+主场全胜 姚明之后最强一季

娱乐要闻

停工16个月!赵露思证实接拍新剧

财经要闻

LG财阀内斗:百亿美元商业帝国争夺战

汽车要闻

零跑Lafa5 Ultra北京车展上市:11.88-12.48万

态度原创

亲子
家居
旅游
手机
军事航空

亲子要闻

小狮子也只是个大宝宝呀,看到小朋友的车车满眼羡慕

家居要闻

自然肌理 温润美学

旅游要闻

朔州崇福寺:金代遗构,塞北千年佛殿

手机要闻

iQOO 15T首曝:天玑9500+144Hz 2K直屏+200MP主摄,主打一个堆料

军事要闻

美防长:战事不会“没完没了”

无障碍浏览 进入关怀版