สคีมาสูตร
สูตร OpenFactory ใช้ JSON แบบ snake_case รูปแบบมาตรฐานมี
ซองระดับบนขนาดเล็ก อ็อบเจ็กต์ os สำหรับการกำหนดค่าระบบปฏิบัติการ และ
อาร์เรย์ scenarios สำหรับการตรวจหลังบิลด์
การตรวจความถูกต้องพิสูจน์ว่ารูปร่างของฟิลด์ที่รู้จักยอมรับได้ ไม่ได้ พิสูจน์ว่าทุกแพ็กเกจมีอยู่ ทุกพฤติกรรมที่ขอถูกแทนแล้ว หรือ อิมเมจและการทดสอบจะสำเร็จ ฟิลด์ที่ไม่รู้จักอาจถูกเพิกเฉยเพื่อความเข้ากันได้ ย้อนหลัง ดังนั้นให้ตรวจสูตรที่ทำให้เป็นมาตรฐานซึ่งผลิตภัณฑ์คืนมา เสมอ
ซองมาตรฐาน
{
"name": "debian-web-check",
"display_name": "Debian Web Check",
"description": "Small Debian image with explicit smoke tests.",
"base_image": "debian-trixie",
"use_case": "Server evaluation",
"hardware": {},
"os": {},
"scenarios": [],
"publish_to": ["local"]
}อย่าใช้ฟิลด์ camelCase เช่น baseImage หรือ startupScripts ตัวตรวจ
ความเข้ากันได้ยอมรับสูตรแบบแบนแบบเก่าบางรายการ แต่เอาต์พุตที่ทำให้เป็นมาตรฐาน
ซ้อนฟิลด์ OS ใต้ os การรวมใหม่ควรส่งรูปแบบมาตรฐาน
ฟิลด์ระดับบน
| ฟิลด์ | ประเภท | จำเป็น/ค่าเริ่มต้น | ความหมาย |
|---|---|---|---|
name | สตริง | จำเป็น 3–100 ตัวอักษร | ชื่อสูตรภายในที่เสถียร |
display_name | สตริงหรือ null | ทางเลือก 1–100 ตัวอักษร | ชื่อที่มนุษย์เห็น |
description | สตริง | "" | ผลลัพธ์ที่ตั้งใจและขอบเขต |
base_image | สตริง | debian-trixie | เป้าหมายดิสทริบิวชัน/บิลด์ ใช้รายการคอนโซลปัจจุบัน |
task | สตริงหรือ null | ทางเลือก | เป้าหมายการปฏิบัติงาน |
executor | สตริงหรือ null | ทางเลือก | เทคโนโลยีที่คาดว่าจะทำงานนั้น |
use_case | สตริง | General | กรณีใช้หลัก |
hardware | อ็อบเจ็กต์ | ค่าเริ่มต้นด้านล่าง | ข้อกำหนดการปรับใช้ |
os | อ็อบเจ็กต์ | อ็อบเจ็กต์ว่าง/ค่าเริ่มต้น | แพ็กเกจ OS ผู้ใช้ บริการ ความปลอดภัย เดสก์ท็อป ตัวติดตั้ง และสคริปต์ |
scenarios | อาร์เรย์ | [] | โทโพโลยีและวัตถุประสงค์การทดสอบ |
publish_to | อาร์เรย์สตริง | ["local"] | จุดหมายเอาต์พุตที่ขอ |
delivery | อ็อบเจ็กต์ | {} | การกำหนดค่าการส่งที่ประกาศเพิ่ม |
community | บูลีน | false | ขอให้มองเห็นในตลาดชุมชน นโยบายการเผยแพร่ยังใช้ |
มีฟิลด์เฉพาะเป้าหมายขั้นสูงสำหรับรีมาสเตอร์ ISO ต้นทาง เพย์โหลดแขก Proxmox แหล่งที่มาของนโยบาย และการรวมการส่ง ใช้ตัวแก้ไขหรือสัญญา API ของรุ่นที่ปรับใช้แล้ว แทนการคัดลอกตัวอย่างเก่า
ฮาร์ดแวร์
{
"hardware": {
"platform": "pc",
"architecture": "x86_64",
"gpu": null,
"min_cpu_cores": 2,
"min_memory_gb": 4,
"min_storage_gb": 16,
"nic_count": 1
}
}platform เป็น pc, phone หรือ raspberry_pi ค่าอุปกรณ์ที่รองรับเป็น
เฉพาะเป้าหมาย architecture เป็น x86_64 หรือ aarch64 ค่า GPU ตั้งชื่อผู้ขาย
หรือชุดผู้ขายที่รองรับ สิ่งเหล่านี้เป็นข้อกำหนดที่ประกาศ ไม่ใช่
หลักฐานว่าอิมเมจที่ได้ถูกทดสอบบนฮาร์ดแวร์จริงที่ตรงกัน
อ็อบเจ็กต์ OS
ฟิลด์ os ที่พบบ่อยคือ:
| ฟิลด์ | ประเภท | จุดประสงค์ |
|---|---|---|
features | อาร์เรย์สตริง | โมดูลฟีเจอร์ที่ลงทะเบียน |
packages | อาร์เรย์สตริง | แพ็กเกจพื้นเมืองที่ขอ |
excluded_packages | อาร์เรย์สตริง | แพ็กเกจที่ต้องยังไม่มีหลังขยายฟีเจอร์ |
custom_packages | อาร์เรย์ | ที่เก็บต้นทางที่จะแพ็กผ่านเส้นทางบิลด์ที่รองรับ |
package_overrides | อาร์เรย์ | การเพิ่ม ถอด หรือแทนที่อย่างชัดเจน |
extra_repos | อาร์เรย์สตริง | ที่เก็บเพิ่ม ความเชื่อถือและการจัดการกุญแจยังต้องทบทวน |
services | อาร์เรย์ | การเปิดใช้และกำหนดค่าบริการที่มีชื่อ |
users | อาร์เรย์ | บัญชีและกลุ่มในอิมเมจ |
security | อ็อบเจ็กต์ | ทางเลือกการชุบแข็ง การเข้ารหัส การตรวจ (audit) SELinux และ fail2ban ที่ประกาศ |
networking | อ็อบเจ็กต์ | ความตั้งใจของอินเทอร์เฟซและเครือข่าย |
desktop_settings | อ็อบเจ็กต์ | ลักษณะและพฤติกรรมเดสก์ท็อป |
branding | อ็อบเจ็กต์ | ตัวตนและสินทรัพย์ของดิสทริบิวชัน |
runtime | อ็อบเจ็กต์ | ตัวตน init/บริการ/ตัวจัดการแพ็กเกจ |
boot | อ็อบเจ็กต์ | อาร์กิวเมนต์เคอร์เนลและทางเลือก GRUB |
installer | อ็อบเจ็กต์ | การกำหนดค่าติดตั้งลงดิสก์ |
persistence | อ็อบเจ็กต์ | ความคงอยู่แบบไลฟ์และนโยบายโซน |
integrity | อ็อบเจ็กต์ | การตั้งค่า dm-verity, Secure Boot และ IMA/EVM ที่ขอ |
file_attachments | อาร์เรย์ | ไฟล์ที่อัปโหลดแล้วระบุด้วย file_id |
startup_scripts | อาร์เรย์ | สคริปต์ systemd แบบครั้งเดียวที่มีขอบเขต |
time_zone | สตริงหรือ null | การตั้งค่าโซนเวลาของอิมเมจ |
การมีฟิลด์ความสมบูรณ์หรือความปลอดภัยเป็นการตั้งใจกำหนดค่า ไม่ใช่ หลักฐานว่ากลไกถูกสร้าง ถูกบังคับตอนรัน หรือผ่านคุณสมบัติ สำหรับระบอบการปฏิบัติตาม ต้องมีหลักฐานบิลด์และการทดสอบที่ตรงกัน
ผู้ใช้
{
"os": {
"users": [
{
"username": "deploy",
"full_name": "Deployment Operator",
"groups": ["sudo"],
"shell": "/bin/bash"
}
]
}
}ชื่อผู้ใช้และกลุ่มจำกัดอยู่ที่อักขระบัญชี Linux ที่ปลอดภัยและความยาว
การไม่ตั้ง password สร้างบัญชีที่ล็อกรหัสผ่านสำหรับเวิร์กโฟลว์ที่ใช้เฉพาะกุญแจหรือ
ข้อมูลรับรองตอนปรับใช้ หลีกเลี่ยงข้อมูลรับรองแบบข้อความธรรมดาในสูตรที่บันทึก
บริการ
{
"os": {
"services": [
{
"name": "ssh",
"enabled": true,
"config": {
"port": 22,
"disable_password_auth": true
}
}
]
}
}config เฉพาะบริการ คีย์ที่ถูกต้องตามวากยสัมพันธ์ยังอาจถูกตัวสร้างที่ไม่ได้ทำให้มีผลเพิกเฉย
ตรวจสูตรที่ทำให้เป็นมาตรฐาน การกำหนดค่าที่ถูกสร้าง และพฤติกรรมของแขก
ความปลอดภัยและตัวติดตั้ง
{
"os": {
"security": {
"hardening_level": "standard",
"disk_encryption": false,
"audit_logging": true,
"selinux": false,
"fail2ban": true
},
"installer": {
"enabled": false,
"type": "calamares",
"desktop_launcher": true,
"bootloader": "grub",
"delivery": [],
"user_setup": "build_time"
}
}
}ประเภทตัวติดตั้งขึ้นกับเป้าหมาย (calamares, anaconda หรือ
elster-mobile) การเปิดตัวติดตั้งต้องตามด้วยการทดสอบติดตั้งบนดิสก์ที่ใช้แล้วทิ้ง
ไอคอนบนเดสก์ท็อปไลฟ์ไม่ได้พิสูจน์ว่าการติดตั้งทำงาน
สคริปต์เริ่มต้น
{
"os": {
"startup_scripts": [
{
"name": "write-build-marker",
"description": "Create a local marker after networking is available.",
"command": "install -m 0644 /dev/null /var/lib/example-ready",
"packages": [],
"run_as": "root",
"after": "network.target"
}
]
}
}ยอมรับสคริปต์เริ่มต้นได้สูงสุด 32 รายการ คำสั่งต้องไม่ว่างและมี
ไบต์ NUL ไม่ได้ ถือว่าเป็นโค้ดเชลล์ที่รันด้วยสิทธิ์ root เว้นแต่ run_as จะระบุ
เป็นอย่างอื่น ทบทวนความทำซ้ำได้ การใส่เครื่องหมายคำพูด ความล้มเหลวของเครือข่าย และการเปิดเผยความลับ
สถานการณ์และการยืนยัน
{
"scenarios": [
{
"id": "primary-smoke",
"name": "Primary image smoke test",
"enabled": true,
"tests": ["boot", "login", "packages"],
"custom_tests": [
{
"description": "Confirm SSH is enabled on the configured port.",
"assertions": [
{
"type": "service_enabled",
"description": "The SSH service starts at boot.",
"params": {"service": "ssh"}
},
{
"type": "port_listening",
"description": "The guest listens on TCP port 22.",
"params": {"port": 22}
}
]
}
]
}
]
}สถานการณ์ยังกำหนด topology พร้อม VM และเครือข่าย การทดสอบรูปแบบเกณฑ์มาตรฐาน
และการตั้งค่า CIS ได้ หากละโทโพโลยี จะใช้เส้นทาง VM เดี่ยวตามปกติ
การยืนยันต้องมีคำอธิบายที่อ่านได้โดยมนุษย์และพารามิเตอร์เฉพาะประเภท
ประเภทการยืนยันที่ไม่รู้จักอาจผ่านการแยกสคีมา ดังนั้นให้ยืนยันว่าตัวรัน
รองรับก่อนถือเป็นหลักฐาน
ตัวอย่างน้อยที่สุดที่สมบูรณ์
{
"name": "debian-web-check",
"display_name": "Debian Web Check",
"description": "Debian image with SSH, curl, and explicit smoke tests.",
"base_image": "debian-trixie",
"use_case": "Server evaluation",
"hardware": {
"platform": "pc",
"architecture": "x86_64",
"min_cpu_cores": 2,
"min_memory_gb": 4,
"min_storage_gb": 16,
"nic_count": 1
},
"os": {
"features": ["ssh"],
"packages": ["curl"],
"users": [
{
"username": "deploy",
"groups": ["sudo"],
"shell": "/bin/bash"
}
],
"services": [
{
"name": "ssh",
"enabled": true,
"config": {"port": 22, "disable_password_auth": true}
}
],
"security": {
"hardening_level": "standard",
"audit_logging": true
},
"installer": {"enabled": false}
},
"scenarios": [
{
"id": "primary-smoke",
"name": "Primary image smoke test",
"enabled": true,
"tests": ["boot", "login", "packages"]
}
],
"publish_to": ["local"]
}เวิร์กโฟลว์การตรวจความถูกต้อง
- ตรวจ JSON ผ่านตัวแก้ไขสูตรปัจจุบัน API หรือเครื่องมือ MCP
validate_recipe - เปรียบเทียบสูตรที่ทำให้เป็นมาตรฐานที่คืนมากับคำขอเดิม
- ถือว่าฟิลด์ที่ไม่รู้จักที่ถูกทิ้งเป็นข้อบกพร่องในสูตร ไม่ใช่การกำหนดค่า ที่สำเร็จ
- สร้างบิลด์หลังจากข้อกำหนดชัดเจนถูกแทนแล้วเท่านั้น
- ตรวจหลักฐานที่ถูกสร้างและรันการยืนยันกับแขกที่ได้
ดู บิลด์แรกของคุณ สำหรับแนวทางกู้จากความล้มเหลวและ การดาวน์โหลด