本文探讨了使用virt-install版本 3 新引入的--cloud-init选项在 Fedora 33 Server Edition 中将 Fedora Cloud Base映像部署为 VM 的可能性。
为什么使用云映像?
Fedora Server的标准虚拟化工具是libvirt。很长一段时间以来,创建虚拟 Fedora 服务器实例的唯一方法是创建一个libvirt VM 并运行标准的 Anaconda 安装。有几种工具可以使此过程尽可能舒适和故障安全,例如驾驶舱模块。这个过程非常简单,每个 Fedora 系统管理员都习惯了。
随着云系统的出现,云图像也随之而来。这些是预先构建的即用型虚拟服务器。Fedora 为各种云系统提供专用映像,以及 Fedora Cloud Base 映像(一种通用的优化 VM)。映像将复制到服务器,并由虚拟机用作操作文件系统。
这些图像为系统管理员节省了通过Anaconda的许多个人传递的耗时过程。安装只需要调用具有合适参数的virt-install。它是一个CLI工具,因此很容易编写脚本和重现。在最坏的情况下,可以快速设置替换 VM。
Fedora Cloud Base 映像已集成到 Fedora QA 流程中。这可以防止在操作过程中可能导致不那么微妙的问题的细微不一致。对于任何关心安全性和可靠性的系统管理员来说,与来自第三方供应商的libvirt兼容VM映像相比,这是一个非常有价值的优势。云映像也加快了部署过程。
实现注意事项
像往常一样,没有免费的东西。云映像使用cloud-init进行自动初始配置,否则将作为 Anaconda 的一部分完成。云系统通常提供必要的信息。在没有云的情况下,系统管理员必须提供替换。
基本上,有两个实现选项。
首先,只需相对较少的额外工作,您就可以安装Vagrant和Vagrant libvirt插件。如果服务器也用于开发工作,则Vagrant可能已经在使用中,并且额外的工作量很小。然后,此选项是最佳选择。
其次,您可以直接使用virt-install。到目前为止,您必须通过几个额外的步骤创建一个云初始化的nocloud数据源iso。自 Fedora 33 以来包含的 virt-install版本 3 消除了这些附加步骤。新引入的 --cloud-init选项最初从云映像配置 VM,无需其他软件,也无需绕路。Virt-install负责驯服相当复杂的云初始化nocloud过程。
有两种方法可以使用virt-install:
- 快速且(不是真的)脏:最小的 Cloud-init
配置 这需要更多的安装后工作,并且只设置几个 VM 时适用。
- 使用简单的配置文件
精心设计基于云的配置 这需要更多的安装前工作,并且如果必须设置多个 VM,则效率更高。
准备
首先下载一个 Fedora 33 Cloud Base Image 文件,并将其存储在目录 /var/lib/libvirt/boot中。按照惯例,这是安装映像的位置。
# sudo wget https://download.fedoraproject.org/pub/fedora/linux/releases/33/Cloud/x86_64/images/Fedora-Cloud-Base-33-1.2.x86_64.qcow2 -O /var/lib/libvirt/boot/Fedora-Cloud-Base-33-1.2.x86_64.qcow2
# sudo wget https://getfedora.org/static/checksums/Fedora-Cloud-33-1.2-x86_64-CHECKSUM -O /var/lib/libvirt/boot/Fedora-Cloud-33-1.2-x86_64-CHECKSUM
# sudo cd /var/lib/libvirt/boot
# sudo sha256sum --ignore-missing -c *-CHECKSUM
*CHECKSUM 文件包含所有云映像的值。该检查应导致一个OK。
完成这些准备工作后,以下两个示例(创建 VM应用和Web)应该可以完美无缺地工作。
示例 1:快速和(不是真的)脏:最小的云初始化配置
应用程序VM 的安装首先在目录/var/lib/lib/libvirt/images中创建下载映像的副本作为(完全安装的)虚拟磁盘。按照惯例,这是虚拟磁盘池。virt-install程序执行安装。virt-install上的参数传递所有必需的信息。无需进一步的干预或准备 参数首先指定通常的一般属性,例如服务器的内存,CPU和(非图形)控制台。参数‐-graphics none强制重定向到终端窗口。引导后,您会收到 VM 终端提示,并立即从主机进行访问。参数‐-import会导致跳过安装任务并从‐-disk参数指定的第一个虚拟磁盘引导。VM"应用"将连接到内部虚拟网络,因此只有一个网络由‐-network参数指定。
唯一的新参数是‐-cloud-init,没有任何进一步的子参数。这会导致生成和显示 root 密码,从而启用一次性登录。cloud-init 使用合理的默认设置执行。最后,它将被停用,并且在后续引导过程中不会执行。
安装完成后,将显示 VM 终端。请注意,第一个 root 登录密码在此过程的早期显示,并用于初始登录。此密码是一次性使用的,必须在首次登录时替换。
# sudo cp /var/lib/libvirt/boot/Fedora-Cloud-Base-33-1.2.x86_64.qcow2 \
/var/lib/libvirt/images/app.qcow2
# sudo virt-install --name app \
--memory 3074 --cpu host --vcpus 3 --graphics none\
--os-type linux --os-variant fedora33 --import \
--disk /var/lib/libvirt/images/app.qcow2,format=qcow2,bus=virtio \
--network bridge=virbr0,model=virtio \
--cloud-init
WARNING Defaulting to --cloud-init root-password-generate=yes,disable=yes
Installation startet …
Password for first root login is: OtMQshytI0E8xZGD
Installation will continue in 10 seconds (press Enter to skip)…Running text console command: …
Connected to Domain: app
Escape character is ^] (Ctrl + ])
[ 0.000000] Linux version 5.8.15-301.fc33.x86_64 (mockbuild@bkernel01.iad2.fedoraproject …
…
…
[ 29.271451] cloud-init[721]: Cloud-init v. 19.4 finished … Datasource DataSourceNoCloud …
[FAILED] Failed to start Execute cloud user/final scripts.
See 'systemctl status cloud-final.service' for details.
[ OK ] Reached target Cloud-init target.
Fedora 33 (Cloud Edition)
Kernel 5.8.15-301.fc33.x86_64 on an x86_64 (ttyS0)
localhost login:
注:在Ubuntu 18.04.6 LTS (Bionic Beaver) bionic-server-cloudimg-amd64.img镜像测试也成功设置root密码。
错误消息不雅观,但不影响操作。(这可能是云初始化服务保持启用状态的原因。您可以手动禁用它或将其删除。
安装后任务
最初显示的密码启用root登录并强制设置新密码。
安装并重新启动完成后,使用<ctrl>+]退出并关闭控制台。
VM 将自动停用,并且在后续启动过程中不会执行。若要覆盖此设置,请在主机上启用应用VM 的自动启动
# sudo virsh autostart app
示例 2:实现复杂配置的简单方法
virt-install cloud-init 过程由两个子参数(元数据和用户数据)提供。每个都引用一个配置文件。这些文件以前被埋在一个特殊的iso映像中,现在由virt-install模拟。您可以自由选择存储这些文件的位置。但是,最好是系统化的,在引导目录中选择一个子目录是一个不错的选择。此示例将使用/var/lib/libvirt/boot/cloud-init。
元数据参数引用的文件包含有关运行时环境的信息。在此示例中,名称是Web 元数据。此处它仅包含必需参数instance-id。它在云环境中必须是唯一的,但可以在这里任意选择,就像在无云环境中一样。
# sudo mkdir /var/lib/libvirt/boot/cloud-init
# sudo vim /var/lib/libvirt/boot/cloud-init/web-meta-data
instance-id: web-app
user-data 参数引用的文件包含主要的配置工作。此示例使用名称Web 用户数据。第一行必须包含某种shebang,cloud-init使用它来确定以下数据的格式。格式本身是yaml。Web 用户数据文件定义了几个步骤:
- 设置主机名
- 使用复制到文件中的公共 RSA 密钥以及回退帐户"hostmin"(或类似名称)设置用户根目录。后者可以通过密码登录并分配给组轮
- 为两个用户设置首次登录密码以进行初始登录,该密码必须在首次登录时更改
- 安装所需的其他软件包,例如防火墙,fail2ban,postfix(fail2ban需要)和web服务器
- 某些软件包需要额外的配置文件
- VM 需要更新所有程序包
- 需要多个配置命令
- 将受信任的区域分配给接口 eth1(dbus 路径中的第 2 个位置,因此调用libvirt时网络参数的顺序至关重要!)并根据命名约定对其进行重命名。修改也会保留到配置文件中(仍在 /etc/sysconfig/network-scripts/ 中)
- 启动防火墙并添加 web 服务
- 最后禁用云初始化
配置文件完成后,如果手动完成,它将消除耗时的过程。这种效率使得云图像的使用具有吸引力。网络用户数据的定义如下:
# vim /var/lib/libvirt/boot/cloud-init/web-user-data
# cloud-config
# (1) setting hostname
preserve_hostname: False
hostname: web
fqdn: web.example.com
# (2) set up root and fallback account including rsa key copied into this file
users:
- name: root
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQA…jSMt9rC4uKDPR8whgw==
- name: hostmin
groups: users,wheel
ssh_pwauth: True
ssh-authorized-keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAIAQDix...Mt9rC4uKDPR8whgw==
# (3) set up a first-time password for both accounts
chpasswd:
list: |
root:myPassword
hostmin:topSecret
expire: True
# (4) install additional required packages
packages:
- firewalld
- postfix
- fail2ban
- vim
- httpd
- mod_ssl
- letsencrypt
# (5) some packages need additional configuration files
write_files:
- path: /etc/fail2ban/jail.local
content: |
# /etc/fail2ban/jail.local
# Jail configuration local customization
# Adjust the default configuration's default values
[DEFAULT]
##ignoreip = /24 /32
bantime = 6600
backend = auto
# The main configuration file defines all services but
# deactivates them by default. Activate those needed
[sshd]
enabled = true
# detect password authentication failures
[apache-auth]
enabled = true
# detect spammer robots crawling email addresses
[apache-badbots]
enabled = true
# detect Apache overflow attempts
[apache-overflows]
enabled = true
- path: /etc/httpd/conf.d/vhost_default.conf
content: |
<VirtualHost *:80>
ServerAdmin root@localhost
DirectoryIndex index.jsp
DocumentRoot /var/www/html
<Directory "/var/www.html">
Options Indexes FollowSymLinks
AllowOverride none
# Allow open access:
Require all granted
</Directory>
ProxyPass / http://app:8080/
</VirtualHost>
# (6) perform a package upgrade
package_upgrade: true
# (7) several configuration commands are executed on first boot
runcmd:
# (a.) assign a zone to internal interface as well as some other adaptations.
# results in the writing of a configuration file
# IMPORTANT: internal interface have to be specified SECOND after external
- nmcli con mod path 2 con-name eth1 connection.zone trusted
- nmcli con mod path 2 con-name 'System eth1' ipv6.method disabled
- nmcli con up path 2
# (b.) activate and configure firewall and additional services
- systemctl enable firewalld --now
- firewall-cmd --permanent –add-service=http
- firewall-cmd --permanent –add-service=https
- firewall-cmd --reload
- systemctl enable fail2ban --now
# compensate for a SELinux port handling issue
- setsebool httpd_can_network_connect 1 -P
- systemctl enable httpd –-now
# (c.) finally disable cloud-init
- systemctl disable cloud-init
- reboot
# done
云初始化项目文档的示例部分提供了用户数据配置选项的详细概述。
完成配置文件后,启动 virt 安装过程。根据需要调整CPU,内存,外部网络接口等的值。
# sudo virt-install --name web \
--memory 3072 --cpu host --vcpus 3 --graphics none \
--os-type linux --os-variant fedora33 --import \
--disk /var/lib/libvirt/images/web.qcow2,bus=virtio,size=20 \
--network type=direct,source=enp1s0,source_mode=bridge,model=virtio \
--network bridge=virbr0,model=virtio \
--cloud-init meta-data=/var/lib/libvirt/boot/cloud-init/web-meta-data,user-data=/var/lib/libvirt/boot/cloud-init/web-user-data
返回主机启用 VM 的自动启动:
# virsh autostart web
配置静态地址
根据规范,在元数据中配置静态网络连接。配置如下所示:
# vim /var/lib/libdir/boot/cloud-init/web-meta-data
instance-id: web-app
network-interfaces: |
iface eth0 inet static
address 192.168.1.10
netmask 255.255.255.0
gateway 192.168.1.254
Cloud-init将相应地创建一个配置文件。但有2个问题
- 配置文件是在通过 dhcp 默认初始化接口后创建的,并且不会重新初始化接口。
- 生成的配置文件包括onboot=no设置,因此在重新启动后也没有连接。
有几个提示表明这是一个已经存在很长时间的错误,因此需要手动干预。
在元数据中没有网络规范,并根据用户数据中的默认初始化手动进行调整,可能会更容易,更有效。在配置内部网络之前,请执行以下操作:
# nmcli con mod path 1 ipv4.method static ipv4.addresses '192.168.158.240/24' ipv4.gateway '192.168.158.1' ipv4.dns '192.168.158.1'
# nmcli con mod path 1 ipv6.method static ipv6.addresses '2003:ca:7f06:2c00:5054:ff:fed6:5b27/64' ipv6.gateway 'fe80::1' ipv6.dns '003:ca:7f06:2c00::add:9999'
# nmcli con up path 1
这样做,连接将立即重置为新规范,并立即调整配置文件。请记住根据需要调整配置值。
或者,这 3 个语句可以作为用户数据文件的一部分,并根据需要进行调整或注释。文件的相应部分将如下所示
...
# (7.) several configuration commands are executed on first boot
runcmd:
# If needed,convert interface eth0 as static
# comment in and modify as required
#- nmcli con mod path 1 ipv4.method static ipv4.addresses '<IPv4>/24' ipv4.gateway '<IPv4>' ipv4.dns 'IPv4
#- nmcli con mod path 1 ipv6.method static ipv6.addresses '<IPv6>/64' ipv6.gateway '<IPv6>' ipv6.dns '<IPv6>'
#- nmcli con up path 1
# (a) assign a zone to internal interface as well as some other adaptations.
# results in the writing of a configuration file
# IMPORTANT: internal interface have to be specified SECOND after external
- nmcli con mod path 2 con-name eth1 connection.zone trusted
- ...
同样,根据需要调整<IPv4>,<IPv6>等配置值!
通过 virt-install 版本 3 配置 cloud-init 过程非常高效且灵活。可以为每个 VM 创建一组专用文件,也可以保留一组通用文件,并根据需要通过注释来调整它们。可以使用两者的组合。您可以快速轻松地更改设置,以测试是否适合您的目的。
总而言之,虽然使用 Fedora Cloud Base Images 会带来一些不便,并且在文档中存在缺点,但 Fedora Cloud Base 镜像和 virt-install 版本 3 是快速高效地为 Fedora Server 创建虚拟机的绝佳组合。
原文地址:https://blog.csdn.net/allway2
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。