devops特种兵 之 使用PXE引导和Preseed文件进行自动安装-bin文件怎么安装

devops特种兵 之 使用PXE引导和Preseed文件进行自动安装-bin文件怎么安装

使用PXE引导和Preseed文件进行自动安装

现在我们有了一个镜像的软件包存储库,我们也可以使用它来提供通过网络构建我们的主机的文件。通过网络构建裸机服务器有许多优点,允许您简单地启动裸机服务器并通过DHCP配置它并安装操作系统,所有这些都无需任何额外的交互。极端情况下,PXE启动允许使用完全无盘的客户端,可以在网络上启动和运行。

这是一个非常长的食谱,但它是必需的。尽管设置PXE引导环境相对简单,但它确实需要多个元素。在本文中,您将创建三个主要组件:Apache服务器,动态主机配置协议(DHCP)服务器和普通文件传输协议(TFTP)服务器。所有这些将协同工作以提供所需的文件,以便允许客户端启动和安装Ubuntu。虽然这里提到了几个组件,但它们都可以在一台服务器上轻松运行。

这个食谱的替代品是补鞋项目(https://cobbler.github.io)。 Cobbler提供了大部分开箱即用的元素,并在顶部添加了强大的管理层;然而,它的工作原理和需要进行评估以确定它如何适合您的环境是非常自以为是的,但是非常值得研究它。

值得记住的是,此配方专为裸机服务器安装而设计,一般来说,它不是管理虚拟化或基于云的服务器的最佳方式。在这种情况下,管理程序或提供程序几乎肯定会为该平台提供更好,更优化的安装方法。

做好准备

要遵循此配方,建议您拥有一个干净安装Ubuntu 14.04的主机。 理想情况下,此主机应具有至少20GB或更多的磁盘,因为它至少需要包含Ubuntu安装媒体。

怎么做…

我们设置一个PXE启动环境:

  • 我们要配置的第一个组件是TFTP服务器。 这是FTP的简化版本。 TFTP非常适合网络启动,您可以在其中获得需要简单快速交付的单向文件流。 我们将使用Ubuntu 14.04附带的TFTP服务器。 要安装它,请发出以下命令:
$ sudo apt-get install tftpd-hpa

这将安装包及其依赖项。

  • 接下来,我们需要配置TFTP服务器。 使用您喜欢的编辑器,编辑位于/ etc / default / tftpd-hpa的TFTP配置文件。 默认情况下,它应该类似于:
# /etc/default/tftpd-hpa
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="[::]:69"
TFTP_OPTIONS="--secure"
  • 您需要修改它以使其作为守护程序运行; 调整文件以添加以下行:
# /etc/default/tftpd-hpa
RUN_DAEMON="yes"
TFTP_USERNAME="tftp"
TFTP_DIRECTORY="/var/lib/tftpboot"
TFTP_ADDRESS="[::]:69"
TFTP_OPTIONS="--secure"
  • 这允许进程以服务模式启动。 另外,请注意TFTP目录; 如果您已选择将安装媒体存储在其他位置,则需要修改此目录。 最后,使用以下命令启动TFTP服务器:
$ sudo service tftpd start
  • 现在我们已经配置了TFTP服务器,我们需要为它提供一些数据。 在这种情况下,我们将把Ubuntu安装文件复制到我们的TFTP目录中,允许它将它们提供给客户端使用此服务器进行PXE引导。 如果还没有,请将Ubuntu的Ubuntu 14.04安装ISO下载到TFTP服务器上; 您可以从http://www.ubuntu.com/download/server下载它。 下载后,使用以下命令继续将其安装到mnt目录中:
$ sudo mount -o loop <location of ISO> /mnt
  • 安装ISO后,可以将其复制到TFTP根目录中。 您实际上并不需要整个ISO映像,只需要netboot目录的内容。 使用以下命令将其复制到位:
$ cp -r /mnt/install/netboot/* /var/lib/tftpboot/
  • 请注意,我正在将其复制到TFTP服务器的默认位置。 如果您希望将ISO映像保留在集中存储(例如NFS服务器)上,则可以配置此选项。
  • 最后,我们需要对我们复制的文件进行一些小编辑,以使我们的客户端从我们的PreSeed文件启动。 在您喜欢的编辑器中打开以下配置文件:
/var/lib/tftpboot/pxelinux.cfg/default
  • 插入以下内容:
label linux
kernel ubuntu-installer/amd64/linux
append preseed/url=http://<<NAME OF BOOT SERVER>>/ks.cfg vga=normal initrd=ubuntu-installer/amd64/initrd.gz ramdisk_size=16432 root=/dev/rd/0 rw --
  • 关于前面的配置,有几点需要注意。 首先,它基于64位的Ubuntu安装,因此您的架构可能会有所不同。 其次,请注意读取的行:
pressed/url=http:// <<NAME OF BOOT SERVER>>//ks.cfg
  • 这应该反映您已配置为PXE引导服务器的服务器的IP地址(甚至更好的DNS名称)。
  • 接下来,我们需要配置DHCP服务器,为我们刚刚启动的客户端提供一些基本的网络信息。如果您已有DHCP服务器并直接进入下一部分,则可以跳过此部分。但是,您需要将DHCP服务器配置为指向正在引导到PXE服务器的客户端。
  • 如果您不确定是否有DHCP服务器,请咨询管理您网络的人员。没有什么比在已经拥有DHCP服务器的情况下创建DHCP服务器更能保证能够破解网络管理员。充其量,它什么都不做;在最坏的情况下,它可能会导致您的网络出现严重问题,甚至会导致生产问题。如果有疑问,请问。
  • 如果您还没有安装DHCP服务器,那么安装和配置DHCP服务器相当简单。首先,我们使用以下命令为Ubuntu附带的DHCP服务器安装所需的软件包:
$ sudo apt-get install isc-dhcp-server
  • 接下来,我们配置新安装的DHCP服务器。 我将使用我在测试实验室中使用的IP范围作为示例(10.0.1.0),但请继续修改示例以适合您的设置。 使用首选编辑器打开以下配置文件:
/etc/dhcp/dhcpd.conf
  • 我们需要设置的前几个选项是域名和名称服务器。 默认情况下,配置应如下所示:
option domain-name "example.org";
option domain-name-servers ns1.example.org, ns2.example.org;
  • 我们需要更改它以匹配我们的设置。 就我而言,它看起来像这样:
option domain-name "stunthamster.com";
option domain-name-servers ns1.stunthamster.com, ns2.stunthamster.com;
  • 修改它们以匹配您自己的域名和服务器名称。 接下来,我们需要将此作为此网络的授权DHCP服务器。 找到读取的行:
authoritative
  • 确保它已取消注释。 这可确保DHCP服务器用于管理网络范围,客户端可以优雅地放弃租约等。
  • 最后,我们可以为我们的网络创建DHCP配置。 这应该添加到配置文件的底部。 再次,以下示例适用于我的网络。 您应该将值替换为您自己的IP范围:
subnet 10.0.1.0 netmask 255.255.255.0 {
range 10.0.1.20 10.0.1.200;
option domain-name-servers ns1.stunthamster.com;
option domain-name "stunthamster.com";
option routers 10.0.1.1;
option broadcast-address 10.0.1.255;
allow booting;
allow bootp;
option option-128 code 128 = string;
option option-129 code 129 = text;
next-server 10.0.1.11;
filename "pxelinux.0";
default-lease-time 600;
max-lease-time 7200;
}
  • 记下下一个服务器选项:这告诉客户端您的TFTP服务器在哪里,并且应该设置为与您的服务器匹配。
  • 虽然您的下一个服务器(TFTP)可以与DHCP服务器相同,但在此示例中,最好将其在生产中隔离。 尽管近年来它们已经变得更好,但TFTP服务器仍被认为是不安全的,并且最好安全地播放并将TFTP保留在自己的服务器上。
  • 对设置满意后,保存配置并使用以下命令重新启动DHCP服务器:
$ sudo service isc-dhcp-server restart

对于我们的下一个任务,我们将继续配置我们的Nginx服务器。 我们使用Nginx来托管安装媒体以及http上的preseed配置。 本质上,客户端连接到内核配置中指示的服务器,以便在使用PXE引导工具引导内核后下载其安装介质和预置指令.

  • 虽然我使用的是Nginx,但您可以使用您选择的任何HTTP服务器,例如Apache。 在这些情况下,Nginx是我的首选服务器,因为它很小,易于配置,并且在提供静态资产时非常高效:First, let's install nginx with the following command:
$ sudo apt-get install nginx
  • 接下来,我们需要将其配置为提供我们在上一步中复制的安装介质。 使用编辑器打开以下配置文件:
/etc/nginx/sites-available/default
  • 默认情况下,配置类似于以下代码段(为清楚起见,我删除了注释):
server {
listen 80 default_server;
listen [::]:80 default_server ipv6only=on;
root /usr/share/nginx/html;
index index.html index.htm;
server_name localhost;
location /
{
try_files $uri $uri/ =404;
}
}
  • 修改它类似于以下内容:
server {
listen 80 <<BOOT SERVERNAME>>;
listen [::]:80 <<BOOT SERVERNAME>>ipv6only=on;
root /var/lib/tftpboot/;
index;
server_name <<BOOT SERVERNAME>>;
location /
{
try_files $uri $uri/ =404;
}
}
  • 将前面示例中的<< BOOT SERVERNAME >>替换为引导服务器的DNS名称。
  • 此配置将提供TFTP目录的内容,并允许客户端下载Ubuntu安装文件。 请记住,此配置没有安全性,并允许人们浏览目录内容,因此请确保您不要在此目录中放置任何敏感性质的内容!
  • 最后,我们可以配置Preseed文件。 Preseed文件本质上是一个文件,其中包含Ubuntu交互式安装程序将提出的问题的答案,允许完全无人参与的安装。 让我们看一下Preseed文件并分阶段构建它。 在编辑器中创建以下文件:
/var/lib/tftpboot/ks.cfg
  • 首先,让我们指出我们的安装程序使用我们在上一个配方中创建的本地存储库:
d-i apt-setup/use_mirror boolean true
  • choose-mirror-bin | mirror / http / hostname string <HOSTNAME OF MIRROR>
  • 更改前面的示例以反映您的本地镜像。
  • 您不一定要设置此选项; 如果保持不变,Ubuntu将使用官方存储库来执行安装。 但是,正如本章第一篇文章中所述,使用本地镜像构建除少数服务器之外的任何东西都要快得多。
  • 让我们来处理一些基本设置,使用哪种语言,设置主机名的内容,键盘用途的语言环境以及设置我们正在构建的服务器的时区。 我们可以使用以下代码片段执行此操作:
d-i debian-installer/locale string en_UK.utf8
d-i console-setup/ask_detect boolean false
d-i console-setup/layout string UK
d-i netcfg/get_hostname string temp-hostname
d-i netcfg/get_domain string stunthamster.com
d-i time/zone string GMT
d-i clock-setup/utc-auto boolean true
d-i clock-setup/utc boolean true
d-i kbd-chooser/method select British English
d-i debconf debconf/frontend select Noninteractive
d-i pkgsel/install-language-support boolean false
  • 接下来,我们需要告诉安装程序如何在主机上配置磁盘。 以下代码段假定单个磁盘主机,并将删除任何现有分区。 我还指示分区管理器使用整个磁盘并设置逻辑卷管理器(LVM)设备:
d-i partman-auto/method string lvm
d-i partman-auto/purge_lvm_from_device boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/device_remove_lvm boolean true
d-i partman-auto/choose_recipe select atomic
d-i partman/confirm_write_new_label boolean true
d-i partman/confirm_nooverwrite boolean true
d-i partman/choose_partition select finish
d-i partman/confirm boolean true
preseed partman-lvm/confirm_nooverwrite boolean true
d-i partman-lvm/confirm boolean true
d-i partman-lvm/confirm_nooverwrite boolean true
d-i partman-auto-lvm/guided_size string max

下一组响应涉及用户管理:

  • 首先,我们需要配置我们的默认用户。 默认情况下,Ubuntu不允许您以root用户身份直接登录(这是一种非常好的做法!),而是允许您创建用于管理目的的用户。 以下代码段将创建一个adminuser用户,密码为password; 更改这些值以适合您自己的设置。
  • 以下示例使用加密密码。 这样可以确保只需浏览TFTP存储库,人们就无法看到默认用户的密码。 要创建加密密码,可以在Linux命令行中使用命令mkpasswd -m sha-512:
d-i passwd/user-fullname string adminuser
d-i passwd/username string changeme
d-i passwd/user-password-crypted password <<CRYPTED_PASSWORD>>
d-i user-setup/encrypt-home boolean false
  • 最后,我们告诉安装程序要安装哪些软件包作为基本安装的一部分。 一般来说,您希望将这些程序包限制为运行配置管理工具所需的程序包,而不是其他任何程序包。 这可以使您的基本安装保持较小,并确保您通过配置管理工具管理包。 以下代码段安装了一个Openssh服务器,允许您在构建服务器后登录并关闭自动更新。 你可能想要启用它,但我更喜欢将其关闭,以便我知道只有我明确安装的软件包才会被推送到我构建的服务器上.
d-i pkgsel/include string openssh-server
d-i pkgsel/upgrade select full-upgrade
d-i grub-installer/only_debian boolean true
d-i grub-installer/with_other_os boolean true
d-i finish-install/reboot_in_progress note
d-i pkgsel/update-policy select none
  • 对配置感到满意后,请保存文件。
  • 这是一个漫长的过程,但我们已准备好从我们闪亮的新构建服务器构建我们的第一个客户端。 为此,请确保您的客户端连接到与PreSeed服务器相同的网络,并配置客户端引导顺序以首先选择PXE引导并重新启动它.

虽然很少见,但有些客户端无法使用PXE启动; 这在旧硬件中尤为普遍。 在这种情况下,您仍然可以使用Preseed文件,但是您需要创建自定义引导介质来引导您的顽固客户端; 您可以在https://help.ubuntu.com/community/LiveCDCustomization上找到有关创建此说明的说明

如果一切顺利,您应该会看到一个快速浏览Ubuntu安装屏幕的屏幕,所有这些都无需抬起手指,您应该能够使用您在Preseed文件中设置的凭据登录新建的服务器 当它完成。

其他

我们已经在本文中介绍了很多内容,我强烈建议您阅读以下文档,以便更深入地了解每个组件的配置方式,并调查可用的选项:

  • DHCP help:
  • https://help.ubuntu.com/community/isc-dhcp-server
  • Official Ubuntu Preseed documentation:
  • https://help.ubuntu.com/14.04/installation-guide/amd64/apb.html
  • Example Preseed:
  • https://help.ubuntu.com/lts/installation-guide/example-preseed.txt

推荐阅读