AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / ubuntu / 问题 / 1290624
Accepted
LuxZg
LuxZg
Asked: 2020-11-09 05:53:34 +0800 CST2020-11-09 05:53:34 +0800 CST 2020-11-09 05:53:34 +0800 CST

基于 MAC 获取自动安装

  • 772

短的:

我正在寻找一种 PXE 引导 Ubuntu 20.04 的方法,并使用新的自动安装进行完全无人值守的安装。但我希望user-data根据客户端的 MAC 在服务器端修改 YAML

我发现了什么

  • 我有启动内核选项,nocloud-net;s=http://...但我看不到将自定义字符串作为 URL 的一部分发送(或完全基于本地 MAC 更改 URL)的方法
  • 我看到early-commands哪个说autoinstall运行后会刷新,但我没有产生任何有效的方法来使用它来将修改后的数据注入新的自动安装;例如。然后执行wget http://myurl/$MAC该文件并修改已经运行的自动安装
  • 使用late-commands是最后的选择,我确实可以这样做wget http://myurl/$MAC && .. && ... 。设置静态 IP/GW/网络掩码,但似乎更容易出错
  • 编辑:似乎我可以有另一种方式,但也需要在我预期的 Web 管理之外进行手动处理,即为每个客户端提供不同的 pxelinux.cfg 并更改其中的 URL,但这是通过 TFTP 提供的,因此没有服务器端脚本(除非有解决方法?) Edit#2:这可以工作,将 TFTP 和 HTTP 服务器指向同一个文件夹,并告诉 PHP 在 /pxelinux.cfg/AA-BB-CC-DD-EE- 下生成自定义文件01 ... -02 ... -03 .. 等用于我的数据库中的每个 MAC,并在保存 DB 中的条目时检查/重新生成文件。至少保持单一管理点的概念。但如果有人知道更好的解决方案,我会留下问题(见上面的选项)

最终目标

我想要一个“主”PXE 服务器,它是 HTTPS 服务器和 Web 管理的所在地,在那里我可以有一个包含所有设备的表(例如在 MySQL 中),以及与每个设备相关的所有设置。然后,当我们部署新客户端(主要是一些愚蠢的信息亭之类的东西)时,我会选择它们的 MAC,启用 PXE 引导,标记它们,然后将它们发送到远程位置。该 MAC 和位置将通过 Web 管理输入 MySQL,以及静态 IP、GW、DNS、浏览器主页、屏幕旋转等内容。一旦它们到达并有人连接它们,它们将启动到无人值守的 PXE 安装,通过它,在处理过程中,他们将从 Web 服务器中提取配置(例如user-data,实际上将由 PHP 处理,并根据需要注入所需的配置),它会 - 嗯......只是工作。它可以适用于live图像也是如此,只是以不同的方式。

我大部分时间都坚持autoinstall和nocloud-net启动,一开始看起来很棒,我可以为每个客户端提供一个自定义的无人值守文件,除了我无法从另一个客户端识别一个客户端的事实。获取http://myserver/user-data?AA-BB-CC-DD-EE-FF似乎不在规范中,仅通过 IP 选择它是行不通的,因为那些将是随机的 DHCP,不幸的是,使用 DHCP 保留修复它是一场噩梦,因为我们正在谈论 100 多个位置,每个位置都有自己的本地DHCP等

我的想法已经不多了,所以希望有人能加入。任何能让我前进的想法(来自late-commands)都会很棒!它不必是 MAC,也可以是 UIID 或其他一些硬件 ID(序列号等),但它应该是唯一且易于获取的。MAC通常是盒子外面的贴纸。

哦,如果你想知道我为什么这么反对late-commands......好吧.. 事情是我不反对它,只是动态修改无人参与的文件会更加灵活。我可以从一开始就设置主机名、IP、用户名、密码、磁盘大小等等。比使用某些默认值引导更干净,然后尝试使用 bash 脚本尝试修复它(特别是磁盘/分区)。毕竟,这就是为什么我们首先要有autoinstall脚本,而不是在第一次启动后重新执行所有操作。

automation pxe user-data
  • 3 3 个回答
  • 2172 Views

3 个回答

  • Voted
  1. Best Answer
    LuxZg
    2020-11-16T10:26:00+08:002020-11-16T10:26:00+08:00

    所以看来我终于解决了。它既简单又充满了错误和障碍。答案是肯定的——使用早期命令。但真相在细节中,如此详细的答案。

    首先,准备好其余的环境,您可以查看我的另一篇文章,了解我执行 20.04 和 20.10 的 BIOS/UEFI PXE 启动的详细步骤: https ://askubuntu.com/a/1292097/1080682

    现在,当您的环境正常工作时(祝您好运),让我们根据通过 HTTP 中间安装提供的配置更改进行自定义自动安装。

    因此,如果您按照我在链接上发布的指南进行操作,我会将 Ubuntu 用户数据保存在这里:

    /var/www/html/ubuntu-server-20.04.1/user-data
    

    用这样的东西修改文件(注意我已经缩短了它的可读性):

    #cloud-config
    
    autoinstall:
      version: 1
      refresh-installer:
        update: yes
      apt:
        <apt stuff>
      identity:
        hostname: pxe-client
        password: $6$zN/uHJD1rEXD/ETf$q8CoBt3xXmBT37RslyWcpLT1za4RJR3QEtosggRKN5aZAAf6/mYbFEQO66AIPm965glBXB1DGd0Sf.oKi.Rfx/
        realname: pxe
        username: pxe
      keyboard: {layout: hr, toggle: toggle, variant: ""}
      early-commands:
        - curl -G -o /autoinstall.yaml http://10.10.2.1/user-data -d "mac=$(ip a | grep ether | cut -d ' ' -f6)"
      locale: en_US
      network:
        network:
          version: 2
          ethernets:
            eth0:
              dhcp4: yes
              dhcp6: no
    

    现在,这个用户数据可以是真正的基本数据,我们真正需要的只是启用网络并curl在early-commands. IP10.10.2.1是我的 HTTP 服务器的本地 IP(也是我的 PXE 服务器,因为我通过它提供其他配置文件和 ISO 映像以及所有这些,但没关系)。

    使用您想要修改的任何内容,并根据请求提供此文件。上面使用 curl 完成的方式实际上会从服务器请求如下内容:

    GET /user-data?mac=fa:fa:fa:00:0e:07
    

    这部分fa:fa:fa:00:0e:07是服务器在查询自己的接口后发送的内容。如果您有多个界面,您可能需要调整脚本,或者确保在早期安装步骤中只启动一个界面。

    我打算通过 PHP + MySQL 使用它,并在 PHP 中使用$_GET["mac"]类似的操作SELECT * FROM autoinstall-configs WHERE mac = '$_GET["mac"]';和从数据库表中的数据中获取它之后,构建新的autoinstall.yaml并将其返回给 subiquity。

    无论如何,您的回复必须没有线路autoinstall:!

    这是 HTTP/PHP 将回复的最小示例,我只更改了主机名和用户名,并对其进行了修改,使其通过 subiquity 语法检查,哦并排除了早期命令,以免陷入循环:

      version: 1
      refresh-installer:
        update: yes
      apt:
        <apt stuff>
      identity:
        hostname: php-client
        password: $6$zN/uHJD1rEXD/ETf$q8CoBt3xXmBT37RslyWcpLT1za4RJR3QEtosggRKN5aZAAf6/mYbFEQO66AIPm965glBXB1DGd0Sf.oKi.Rfx/
        realname: php
        username: php
      keyboard: {layout: hr, toggle: toggle, variant: ""}
      locale: en_US
      network:
        network:
          version: 2
          ethernets:
            eth0:
              dhcp4: yes
              dhcp6: no
      ssh:
        allow-pw: true
        install-server: true
      late-commands:
        - poweroff
    

    为了清楚起见,这是两个文件的差异:

    diff /var/www/html/ubuntu-server-20.04.1/user-data /var/www/html/user-data
    
    1,3d0
    < #cloud-config
    <
    < autoinstall:
    16c13
    <     hostname: pxe-client
    ---
    >     hostname: php-client
    18,19c15,16
    <     realname: pxe
    <     username: pxe
    ---
    >     realname: php
    >     username: php
    21,22d17
    <   early-commands:
    <     - curl -G -o /autoinstall.yaml http://10.10.2.1/user-data -d "mac=$(ip a | grep ether | cut -d ' ' -f6)"
    

    所以它几乎是一样的,只是不是。这些更改(删除autoinstall:和early-commands:)需要传递到安装的其余部分。您可以自行测试其他调整。

    之后,安装将继续使用通过 answer to request 提供的任何新信息/user-data?mac=<installer-mac-address>。

    现在,这为为您的虚拟机或服务器场或其他任何东西进行自己的 Web 管理打开了大门。您不再需要为每个服务器或服务器组手工制作的用户数据文件。您可以向他们发送各自独特的配置,包括准确的静态 IP 地址、分区大小、不同的主机名、密码等。

    规范,如果您从中选择一个想法,请至少将我放在学分中:)

    结案,加油!

    • 2
  2. Andrew Lowther
    2020-11-11T08:52:09+08:002020-11-11T08:52:09+08:00

    根据您用于 PXE 的内容,您可以在引导参数中使用变量。例如,使用 GRUB(通常用于 UEFI 机器)将提供${net_default_mac}MAC 地址作为变量。

    一般来说,我认为early-commands是最好的选择。我不确定您尝试时失败的原因。我认为您可以获取动态生成user-data的文件并覆盖该/autoinstall.yaml文件。

    • 0
  3. drlamb
    2021-01-20T08:43:30+08:002021-01-20T08:43:30+08:00

    尽管我使用 Ansible/Ansible Tower 作为我的事实来源,但我实现了类似的事情。本质上,我将 iPXE 脚本设置为使用存储在 OpenShift (kubernetes) 中的简单烧瓶应用程序,其中机器的 MAC 地址请求自动安装配置。Ansible 然后运行并生成一个特定于机器的自动安装(使用 Jinja2 模板)配置文件并提供它。没有早期的剧本。

    我对早于 20.04 的 Ubuntu 版本的 preseeds 做了类似的事情。

    import json
    import requests
    import subprocess
    from flask import Flask, abort, request, redirect, send_from_directory
    
    @autoinstaller.route('/ubuntu', defaults={'path': ''})
    @autoinstaller.route('/ubuntu/<path:mac_address>')
    @autoinstaller.route('/ubuntu/<path:mac_address>/meta-data')
    @autoinstaller.route('/ubuntu/<path:mac_address>/user-data')
    def get_autoinstall_config(mac_address):
        candidate_hostname = _isknownhost(mac_address)
        if candidate_hostname == None:
            abort(404)
        else:
            subprocess.run(["ansible-playbook", "playbooks/ubuntu/generate_autoinstall.yml", "--limit", f"{candidate_hostname}", "-e", f"candidate_mac={mac_address} candidate_hostname={candidate_hostname} authorized=True ansible_connection=local"])
            return send_from_directory(f'/tmp/{mac_address}', 'user-data')
    

    _isknownhost是一个调用 ansible-inventory 来查找具有匹配 mac 地址的系统的函数。

    def _isknownhost(mac_address):
        query = subprocess.Popen(["ansible-inventory", "--list"], stdout=subprocess.PIPE)
        hosts = json.loads(query.communicate()[0])['_meta']['hostvars']
        for system in hosts.keys():
            for hostvar in hosts[system].values():
                if hostvar == mac_address:
                    return system
        return None
    
    
    • 0

相关问题

  • 方便地在 Apple 和 PC 键盘之间切换(交换 Windows 和 Alt 键)

  • 如何解决启动进入黑屏的问题?[复制]

  • Mac OS X Automator 的替代品?

  • 我如何参与 Ubuntu 的测试和 QA?

  • 保持多个工作站同步

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何运行 .sh 脚本?

    • 16 个回答
  • Marko Smith

    如何安装 .tar.gz(或 .tar.bz2)文件?

    • 14 个回答
  • Marko Smith

    如何列出所有已安装的软件包

    • 24 个回答
  • Marko Smith

    无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗?

    • 25 个回答
  • Martin Hope
    Flimm 如何在没有 sudo 的情况下使用 docker? 2014-06-07 00:17:43 +0800 CST
  • Martin Hope
    Ivan 如何列出所有已安装的软件包 2010-12-17 18:08:49 +0800 CST
  • Martin Hope
    La Ode Adam Saputra 无法锁定管理目录 (/var/lib/dpkg/) 是另一个进程在使用它吗? 2010-11-30 18:12:48 +0800 CST
  • Martin Hope
    David Barry 如何从命令行确定目录(文件夹)的总大小? 2010-08-06 10:20:23 +0800 CST
  • Martin Hope
    jfoucher “以下软件包已被保留:”为什么以及如何解决? 2010-08-01 13:59:22 +0800 CST
  • Martin Hope
    David Ashford 如何删除 PPA? 2010-07-30 01:09:42 +0800 CST

热门标签

10.10 10.04 gnome networking server command-line package-management software-recommendation sound xorg

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve