debian

如何在Debian Cobbler中使用脚本自动化任务

小樊
38
2025-11-14 11:42:22
栏目: 智能运维

在 Debian 上使用脚本自动化 Cobbler 任务

一 总体思路与前置条件

二 自动化脚本骨架与用法

#!/usr/bin/env bash
set -Eeuo pipefail

# ===== 用户可配置 =====
COBBLER_IP="192.168.1.100"
DHCP_SUBNET="192.168.1.0"
DHCP_RANGE="192.168.1.100 192.168.1.200"
ROUTER="192.168.1.1"
DNS_SERVERS="8.8.8.8 1.1.1.1"
DEBIAN_ISO="/path/to/debian.iso"
PROFILE_NAME="debian-12-amd64"
SEED_FILE="/var/lib/cobbler/templates/debian.seed"
# ======================

log(){ echo "[$(date '+%F %T')] $*"; }

# 1) 环境校验
log "检查 cobbler 与必要服务..."
systemctl is-active --quiet cobblerd || { log "启动 cobblerd"; systemctl start cobblerd; }
systemctl is-active --quiet tftpd-hpa || { log "启动 tftpd-hpa"; systemctl start tftpd-hpa; }
systemctl is-active --quiet apache2   || { log "启动 apache2";   systemctl start apache2;   }
if command -v dhcpd >/dev/null 2>&1; then
  systemctl is-active --quiet isc-dhcp-server || { log "启动 isc-dhcp-server"; systemctl start isc-dhcp-server; }
fi

# 2) 写入关键配置
log "写入 /etc/cobbler/settings"
sed -i "s/^server: .*/server: ${COBBLER_IP}/" /etc/cobbler/settings
sed -i "s/^next_server: .*/next_server: ${COBBLER_IP}/" /etc/cobbler/settings
# 按需开启:manage_dhcp、manage_tftp(示例开启 DHCP)
sed -i "s/^manage_dhcp: .*/manage_dhcp: 1/" /etc/cobbler/settings
sed -i "s/^manage_tftp: .*/manage_tftp: 1/" /etc/cobbler/settings

# 3) 配置 DHCP 模板
log "配置 DHCP 子网"
cat >/etc/cobbler/dhcp.template <<EOF
subnet ${DHCP_SUBNET} netmask 255.255.255.0 {
    option routers ${ROUTER};
    option domain-name-servers ${DNS_SERVERS};
    range dynamic-bootp ${DHCP_RANGE};
    default-lease-time 21600;
    max-lease-time 43200;
    next-server \$next_server;
}
EOF

# 4) 导入镜像(若已导入可跳过)
if ! cobbler distro list | grep -qw "${PROFILE_NAME}"; then
  log "挂载并导入 ISO: ${DEBIAN_ISO}"
  mkdir -p /mnt/debian
  mount -o loop "${DEBIAN_ISO}" /mnt/debian
  cobbler import --path=/mnt/debian --name="${PROFILE_NAME}"
  umount /mnt/debian
fi

# 5) 绑定 Preseed
if [[ -f "${SEED_FILE}" ]]; then
  log "绑定 Preseed: ${SEED_FILE}"
  cobbler profile edit --name="${PROFILE_NAME}" --autoinstall="${SEED_FILE}"
fi

# 6) 同步
log "同步配置到 DHCP/TFTP/HTTP"
cobbler sync

# 7) 可选:从 CSV 批量注册主机(CSV 列:mac,ip,hostname,gateway)
register_from_csv(){
  local csv="$1"
  while IFS=',' read -r mac ip hostname gateway; do
    [[ -z "${mac}" || "${mac}" =~ ^# ]] && continue
    local name="host-${ip##*.}"
    cobbler system add \
      --name="${name}" \
      --profile="${PROFILE_NAME}" \
      --mac="${mac}" \
      --ip-address="${ip}" \
      --subnet="255.255.255.0" \
      --gateway="${gateway:-${ROUTER}}" \
      --hostname="${hostname}" \
      --name-servers="${DNS_SERVERS}"
  done < <(sed 's/\r//g' "$csv")
}

# 示例:register_from_csv "hosts.csv"
# 客户端需设置 PXE 启动,上电后将自动安装
log "完成。请为目标主机设置 PXE 启动。"

三 在 Preseed 中执行安装后脚本

# 示例:安装后执行本地脚本(位于安装介质的 preseed/late_command 可访问路径)
d-i preseed/late_command string \
  in-target sh -c ' \
    apt-get update && apt-get install -y curl vim htop; \
    echo "部署完成: $(date)" > /root/deploy-done.txt; \
  '

# 示例:从内网 Git 拉取并运行配置脚本
# d-i preseed/late_command string \
#   in-target sh -c ' \
#     apt-get update && apt-get install -y git; \
#     git clone https://git.example.com/deploy.git /root/deploy && \
#     bash /root/deploy/bootstrap.sh; \
#   '

四 批量编排与 API 方式

import cobbler_api
api = cobbler_api.CobblerAPI("http://${COBBLER_IP}/cobbler_api", "cobbler", "cobbler")
api.add_system({
    "name": "host-192-168-1-101",
    "profile": "debian-12-amd64",
    "mac_address": "00:11:22:33:44:55",
    "ip_address": "192.168.1.101",
    "hostname": "host1.example.com",
    "gateway": "192.168.1.1",
    "name_servers": ["8.8.8.8", "1.1.1.1"],
    "netboot_enabled": True
})
# 变更后同步
api.sync()

五 排错与最佳实践

0
看了该问题的人还看了