Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
32 commits
Select commit Hold shift + click to select a range
dc55216
Merge pull request #3 from X-Mars/dev
X-Mars Dec 12, 2025
b5f4a40
Merge pull request #4 from X-Mars/dev
X-Mars Dec 12, 2025
8b1f58f
Merge pull request #5 from X-Mars/dev
X-Mars Dec 12, 2025
2687e12
Merge pull request #6 from X-Mars/dev
X-Mars Dec 12, 2025
cb11ca3
Merge pull request #8 from X-Mars/dev
X-Mars Jan 10, 2026
57801f7
Merge pull request #10 from X-Mars/dev
X-Mars Jan 12, 2026
6681c02
Merge pull request #11 from X-Mars/dev
X-Mars Jan 13, 2026
6174ec8
Merge pull request #16 from X-Mars/dev
X-Mars Feb 25, 2026
9a861ff
Merge pull request #17 from X-Mars/dev
X-Mars Feb 26, 2026
c0e188e
Merge pull request #18 from X-Mars/dev
X-Mars Feb 26, 2026
b40a112
Merge pull request #19 from X-Mars/dev
X-Mars Feb 27, 2026
4091c0b
Merge pull request #20 from X-Mars/dev
X-Mars Feb 27, 2026
2ced78d
Merge pull request #21 from X-Mars/dev
X-Mars Feb 27, 2026
7786168
Merge pull request #22 from X-Mars/dev
X-Mars Feb 27, 2026
34ae3de
Merge pull request #23 from X-Mars/dev
X-Mars Mar 5, 2026
336ea5d
Merge pull request #24 from X-Mars/dev
X-Mars Mar 5, 2026
68a8017
Merge pull request #27 from X-Mars/dev
X-Mars Mar 23, 2026
29ff903
Merge pull request #29 from X-Mars/dev
X-Mars May 24, 2026
65d2081
Merge pull request #30 from X-Mars/dev
X-Mars Jun 6, 2026
f6a8fa8
Merge pull request #32 from X-Mars/dev
X-Mars Jun 7, 2026
df8b3f0
Merge pull request #33 from X-Mars/dev
X-Mars Jun 7, 2026
9bc742f
Merge pull request #35 from X-Mars/dev
X-Mars Jun 13, 2026
eb8177a
Merge pull request #36 from X-Mars/dev
X-Mars Jun 13, 2026
c40e076
Merge pull request #37 from X-Mars/dev
X-Mars Jun 13, 2026
73a7e2f
Merge pull request #38 from X-Mars/dev
X-Mars Jun 13, 2026
4b89e15
Merge pull request #39 from X-Mars/dev
X-Mars Jun 28, 2026
440bb06
feat: add zabbix_clonehosts module
jxl1216 Jul 19, 2026
cde8527
Merge pull request #42 from jxl1216/feat/add-clonehosts-module
X-Mars Jul 19, 2026
1ffd787
feat: add auto-release workflow and Zabbix 7.2+ path compatibility
jxl1216 Jul 19, 2026
56c6c07
Merge pull request #43 from jxl1216/master
X-Mars Jul 19, 2026
f17d06f
feat: zabbix_clonehosts v1.3.0 - real-time progress stats, Zabbix 6.0…
jxl1216 Jul 20, 2026
176bc62
Merge pull request #44 from jxl1216/feat/clonehosts-v1.3.0
X-Mars Jul 21, 2026
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
202 changes: 202 additions & 0 deletions .github/workflows/release.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,202 @@
name: Release Zabbix Modules

# 当任意模块的 manifest.json 中 version 字段升级并推送到主分支时,
# 自动打包所有模块和整体项目到一个 Release 中。
# 版本号格式:模块数量.大版本.小版本(如 8.1.0)
# Release Assets 包含:
# - zabbix_modules-<版本号>.tar.gz(整体打包)
# - zabbix_<模块名>-<版本号>.tar.gz(每个模块独立打包)
# 也支持手动触发。

on:
push:
branches:
- main
- master
paths:
- 'zabbix_*/manifest.json'
workflow_dispatch:

jobs:
detect-and-release:
runs-on: ubuntu-latest
permissions:
contents: write

steps:
- name: Checkout
uses: actions/checkout@v4
with:
fetch-depth: 0

- name: Detect changed modules with version bump
id: detect
run: |
# Find all module directories
modules=()
for dir in zabbix_*/; do
[ -d "$dir" ] || continue
[ -f "${dir}manifest.json" ] || continue
modules+=("${dir%/}")
done

echo "Found modules: ${modules[*]}"

# Determine whether to release:
# - Manual trigger: always release
# - Push trigger: only when at least one module's version changed
should_release="false"
if [ "$GITHUB_EVENT_NAME" = "workflow_dispatch" ]; then
should_release="true"
echo "Manual trigger: will release"
else
for mod in "${modules[@]}"; do
mf="${mod}/manifest.json"
current_ver=$(python3 -c "import json; print(json.load(open('$mf'))['version'])")
prev_ver=$(git show HEAD~1:"${mf}" 2>/dev/null | python3 -c "import json,sys; print(json.load(sys.stdin)['version'])" 2>/dev/null || echo "")
if [ -z "$prev_ver" ] || [ "$current_ver" != "$prev_ver" ]; then
echo " $mod: version changed (${prev_ver:-new} -> ${current_ver}), will release"
should_release="true"
else
echo " $mod: version unchanged (${current_ver}), skip"
fi
done
fi

echo "should_release=${should_release}" >> $GITHUB_OUTPUT

- name: Package all modules and project into single Release
if: steps.detect.outputs.should_release == 'true'
run: |
# Count modules
MODULE_COUNT=$(ls -d zabbix_*/ 2>/dev/null | wc -l)
echo "Module count: ${MODULE_COUNT}"

# Find the latest major version for this module count
# Version format: {module_count}.{major}.{minor} (e.g., 8.1.0)
LATEST_MAJOR=0
for tag in $(git tag --list "v${MODULE_COUNT}.*"); do
major=$(echo "${tag}" | sed "s/v${MODULE_COUNT}\.\([0-9]*\)\.[0-9]*/\1/")
if [[ "${major}" =~ ^[0-9]+$ ]] && [ "${major}" -gt "${LATEST_MAJOR}" ] 2>/dev/null; then
LATEST_MAJOR="${major}"
fi
done

MAJOR_VER=$((LATEST_MAJOR + 1))
VERSION="${MODULE_COUNT}.${MAJOR_VER}.0"
echo "Release version: ${VERSION}"

tag="v${VERSION}"

# Check if tag already exists
if git rev-parse "refs/tags/${tag}" >/dev/null 2>&1; then
echo "Tag ${tag} already exists, skipping release"
exit 0
fi

mkdir -p assets

# Package each module
echo "=== Packaging individual modules ==="
MODULE_LIST=""
for mod in zabbix_*/; do
mod="${mod%/}"
[ -f "${mod}/manifest.json" ] || continue
mod_ver=$(python3 -c "import json; print(json.load(open('${mod}/manifest.json'))['version'])")
echo "Packaging ${mod} v${mod_ver}..."
tar -czf "assets/${mod}-${mod_ver}.tar.gz" "${mod}"
ls -lh "assets/${mod}-${mod_ver}.tar.gz"
MODULE_LIST="${MODULE_LIST}- ${mod} - v${mod_ver}\n"
done

# Package entire project (all modules together)
echo "=== Packaging entire project ==="
tar -czf "assets/zabbix_modules-${VERSION}.tar.gz" \
--exclude=".git" \
--exclude=".github" \
--exclude="*.md" \
--exclude="*.csv" \
--exclude="images" \
zabbix_*/

echo "Packaged zabbix_modules-${VERSION}.tar.gz:"
ls -lh "assets/zabbix_modules-${VERSION}.tar.gz"

# Create release notes file
{
echo "## Zabbix Modules ${VERSION}"
echo ""
echo "### Included Modules"
echo ""
for mod in zabbix_*/; do
mod="${mod%/}"
if [ -f "${mod}/manifest.json" ]; then
mod_ver=$(python3 -c "import json; print(json.load(open('${mod}/manifest.json'))['version'])")
echo "- ${mod} - v${mod_ver}"
fi
done
echo ""
echo "### Assets"
echo ""
echo "- \`zabbix_modules-${VERSION}.tar.gz\` - 所有模块整体打包(All modules in one package)"
echo "- \`zabbix_<module>-<version>.tar.gz\` - 单个模块独立打包(Individual module packages)"
echo ""
echo "### Deployment"
echo ""
echo "#### 选项 A:部署所有模块(整体包)"
echo ""
echo "1. Download \`zabbix_modules-${VERSION}.tar.gz\` below"
echo "2. Upload to Zabbix server and extract:"
echo ""
echo '```bash'
echo "# Zabbix 6.0 / 7.0"
echo "tar -xzf zabbix_modules-${VERSION}.tar.gz -C /usr/share/zabbix/modules/"
echo ""
echo "# Zabbix 7.2+ / 7.4 / 8.0"
echo "tar -xzf zabbix_modules-${VERSION}.tar.gz -C /usr/share/zabbix/ui/modules/"
echo '```'
echo ""
echo "3. If using Zabbix 6.0, change manifest_version for all modules:"
echo '```bash'
echo "sed -i 's/\"manifest_version\": 2.0/\"manifest_version\": 1.0/' /usr/share/zabbix/modules/zabbix_*/manifest.json"
echo '```'
echo ""
echo "#### Option B: Deploy a single module"
echo ""
echo "1. Download the \`zabbix_<module>-<version>.tar.gz\` file for the module you want"
echo "2. Upload to Zabbix server and extract:"
echo ""
echo '```bash'
echo "# Zabbix 6.0 / 7.0"
echo "tar -xzf zabbix_<module>-<version>.tar.gz -C /usr/share/zabbix/modules/"
echo ""
echo "# Zabbix 7.2+ / 7.4 / 8.0"
echo "tar -xzf zabbix_<module>-<version>.tar.gz -C /usr/share/zabbix/ui/modules/"
echo '```'
echo ""
echo "3. If using Zabbix 6.0, change manifest_version:"
echo '```bash'
echo "sed -i 's/\"manifest_version\": 2.0/\"manifest_version\": 1.0/' /usr/share/zabbix/modules/zabbix_<module>/manifest.json"
echo '```'
echo ""
echo "### Enable modules in Zabbix Web"
echo ""
echo "1. Open Zabbix Web UI → Administration → General → Modules"
echo "2. Click **Scan directory** to detect new modules"
echo "3. Enable the modules you need"
} > release_notes.md

# Create single Release with all assets
echo "=== Creating release ${tag} with all assets ==="
gh release create "${tag}" \
assets/*.tar.gz \
--title "Zabbix Modules ${VERSION}" \
--notes-file release_notes.md \
--repo "${{ github.repository }}"

echo "=== Released ${tag} ==="
echo "Assets in release:"
gh release view "${tag}" --json assets --jq '.assets[].name' \
--repo "${{ github.repository }}"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
110 changes: 88 additions & 22 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,48 +167,113 @@

**兼容性**:Zabbix 6.0.x, 7.0.x, 7.4.x, 8.0.x

### 8. Zabbix Clonehosts

**简介**:基于已有监控主机的配置批量克隆导入大量主机的 Zabbix 前端模块,支持 CSV 文件导入和在线表格录入两种方式,并提供预览、冲突检测、选择性导入和实时导入进度反馈功能。

**功能特性**:

- 源主机克隆:选择任意已有监控主机作为克隆模板,其接口、群组、模板、标签、宏、TLS、IPMI、资产模式等全部配置均可被继承
- 双模式数据录入:CSV 文件上传(UTF-8/GBK 自动识别,可下载模板)/ 在线表格录入(增删行、清空、实时校验)
- 智能字段继承:仅主机名称和接口 IP 必填,其他字段留空时自动继承源主机配置
- 主机群组自动创建:CSV 中指定的主机群组若不存在,自动调用 API 创建后再关联
- 预览与冲突检测:导入前全面预览,自动检测主机名冲突、必填字段缺失、批次内重复、与已有主机/模板同名冲突;状态标识区分「已存在」「将新建」「未找到」「继承自源主机」
- 选择性导入:预览页支持勾选/取消要导入的主机,冲突主机自动跳过,就绪主机可单独取消导入
- 返回编辑:预览页可一键带着数据返回在线表格录入页,方便对非就绪主机进行编辑,不会清空已录入数据
- 导入进度反馈:逐台 AJAX 创建主机,实时进度条和成功/失败计数
- 结果报告导出:导入完成后可下载 CSV 格式的结果报告(含主机名、IP、主机ID、结果、错误信息)
- 支持中英文界面国际化

![1](zabbix_clonehosts/images/image.png)
![2](zabbix_clonehosts/images/image-1.png)
![3](zabbix_clonehosts/images/image-2.png)
![4](zabbix_clonehosts/images/image-3.png)

**文档链接**:[zabbix_clonehosts/README.md](./zabbix_clonehosts/README.md)([English](./zabbix_clonehosts/README_en.md))

**兼容性**:Zabbix 6.0.x, 7.0.x, 7.4.x, 8.0.x

## 安装说明

### 安装模块
### 方式一:下载 Releases 压缩包(适合生产部署,按需选择)

这是最简单快捷的安装方式,一次性部署所有模块:
Releases 页面提供两种压缩包,无需安装 git:

1. **Zabbix 6.0 / 7.0 部署方法**
- **整体打包压缩包**:`zabbix_modules-<版本号>.tar.gz`(包含所有模块,版本号格式:`模块数量.大版本.小版本`,如 `8.2.0`)
- **单模块压缩包**:`zabbix_<模块名>-<版本号>.tar.gz`(按需下载单个模块)

#### 选项 A:下载所有模块整体压缩包

1. 前往 [Releases 页面](https://github.com/X-Mars/zabbix_modules/releases),下载 `zabbix_modules-<版本号>.tar.gz` 文件(如 `zabbix_modules-8.2.0.tar.gz`)
2. 上传到 Zabbix 服务器并解压到模块目录:

```bash
git clone https://github.com/X-Mars/zabbix_modules.git /usr/share/zabbix/modules/
# Zabbix 6.0 / 7.0
tar -xzf zabbix_modules-<版本号>.tar.gz -C /usr/share/zabbix/modules/

# Zabbix 7.2+ / 7.4 / 8.0
tar -xzf zabbix_modules-<版本号>.tar.gz -C /usr/share/zabbix/ui/modules/
```

2. **Zabbix 7.4 / 8.0 部署方法**
3. **如果使用 Zabbix 6.0,修改所有模块的 manifest_version**

```bash
git clone https://github.com/X-Mars/zabbix_modules.git /usr/share/zabbix/ui/modules/
for mod in /usr/share/zabbix/modules/zabbix_*/; do
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' ${mod}manifest.json
done
```

3. **如果使用Zabbix 6.0,修改manifest_version**
如果使用 Zabbix 7.0+ 或 8.0+,则无需修改,保持默认值即可。

#### 选项 B:下载单个模块

1. 前往 [Releases 页面](https://github.com/X-Mars/zabbix_modules/releases),下载所需模块的 `zabbix_<模块名>-<版本号>.tar.gz` 文件
2. 上传到 Zabbix 服务器并解压到模块目录:

```bash
# Zabbix 6.0 / 7.0
tar -xzf zabbix_<模块名>-<版本号>.tar.gz -C /usr/share/zabbix/modules/

# Zabbix 7.2+ / 7.4 / 8.0
tar -xzf zabbix_<模块名>-<版本号>.tar.gz -C /usr/share/zabbix/ui/modules/
```

3. **如果使用 Zabbix 6.0,修改 manifest_version**

```bash
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' /usr/share/zabbix/modules/zabbix_<模块名>/manifest.json
```

如果使用 Zabbix 7.0+ 或 8.0+,则无需修改,保持默认值即可。

### 方式二:git clone 直接部署(适合开发/跟踪更新)

一次性部署所有模块:

1. **Zabbix 6.0 / 7.0 部署方法**

```bash
cd /usr/share/zabbix/modules/
# 修改 zabbix_reports 模块
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_reports/manifest.json
git clone https://github.com/X-Mars/zabbix_modules.git /usr/share/zabbix/modules/
```

# 修改 zabbix_cmdb 模块
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_cmdb/manifest.json
2. **Zabbix 7.2+ / 7.4 / 8.0 部署方法**

# 修改 zabbix_graphtrees 模块
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_graphtrees/manifest.json
```bash
git clone https://github.com/X-Mars/zabbix_modules.git /usr/share/zabbix/ui/modules/
```

# 修改 zabbix_rack 模块
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_rack/manifest.json
3. **如果使用Zabbix 6.0,修改manifest_version**

# 修改 zabbix_snmp 模块
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_snmp/manifest.json
一键修改所有模块:

# 修改 zabbix_jumpserver 模块
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_jumpserver/manifest.json
```bash
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' /usr/share/zabbix/modules/zabbix_*/manifest.json
```

# 修改 zabbix_im 模块
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_im/manifest.json
单独修改某个模块(如 zabbix_reports):

```bash
sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' /usr/share/zabbix/modules/zabbix_reports/manifest.json
```

如果使用 Zabbix 7.0+ 或 8.0+,则无需修改,保持默认值即可。
Expand Down Expand Up @@ -236,6 +301,7 @@ sed -i 's/"manifest_version": 2.0/"manifest_version": 1.0/' zabbix_im/manifest.j
- **数据采集 → SNMP Assistant** (SNMP 助手:Zabbix Mibs / Zabbix Walk)
- **资产记录 → JumpServer** (JumpServer 同步)
- **Users → IM同步助手** (IM 同步 / 同步设置)
- **数据采集 → 主机批量导入** (基于源主机批量克隆主机)

### 单独安装模块

Expand Down
Loading
Loading