金鱼哥RHCA回忆录:CL210执行镜像操作--在部署期间初始化实例+章节实验
🎹 个人简介:大家好,我是 金鱼哥,CSDN运维领域新星创作者,华为云·云享专家,阿里云社区·专家博主
📚个人资质:CCNA、HCNP、CSNA(网络分析师),软考初级、中级网络工程师、RHCSA、RHCE、RHCA、RHCI、ITIL😜
💬格言:努力不一定成功,但要想成功就必须努力🔥🎈支持我:可点赞👍、可收藏⭐️、可留言📝
📜回顾CLOUD-INIT基础知识
为了避免镜像的激增,您可以只维护几个通用基本镜像,然后在部署期间执行特定于实例的定制。cloud-init是一组Python脚本和实用程序,用于执行实例的早期初始化。它的任务可能包括注入SSH密钥、配置网络设置和设置主机名。cloud-init设置实例所需的信息称为用户数据。用户数据支持几种格式,包括shell脚本、云配置格式、upstart作业、MIME多部分格式和include文件。这些都可以使用gzip进行压缩。
📑流行的cloud-init用户数据格式
shell脚本
cloud-init可以直接使用shell脚本作为用户数据,而不需要修改。如果您现有的强化或自定义是使用shell脚本执行的,那么这提供了一个简单的迁移路径。
cloud-config
云配置格式允许管理员使用简单的指令执行常见任务。云配置格式文件必须是有效的YAML,并具有# cloud-config头或Content-Type: text/cloud-config头文件用于MIME归档。它支持创建用户、组、文件和Yum存储库、安装包、确认SSH密钥和其他任务。
include
include文件包含一个url列表,每个url都指向支持的任何格式的用户数据。它必须有一个#include头或者Content-Type: text/x-include-url头用于MIME归档。
📜描述配置驱动
在Red Hat OpenStack平台中,cloud-init在实例启动期间运行,并从计算元数据API接收用户数据信息。OpenStack计算服务提供了–config-drive布尔值选项来自动生成一个小的ISO 9660或VFAT格式的镜像,其中包含特定于实例的用户数据。如果附加的项目网络没有启用DHCP,则此选项可以为实例提供静态网络配置信息。生成的镜像具有一个config-2的卷标,并在引导时附加到实例。
裸金属服务还支持–config-drive选项,但是这需要一个路径到包含您想要包含的文件的目录。Bare Metal服务创建一个gzip压缩的、使用base64编码的、带有config-2标签的ISO 9660镜像,其中包含目录中的文件。
📜描述元数据服务体系结构
随着Red Hat OpenStack Platform 13中OVN的引入,元数据架构发生了变化。元数据体系结构现在由元数据代理、Neutron OVN元数据代理和Nova元数据API组成。
📜描述cloud-init与计算元数据API的通信
运行在实例上的cloud-init通过两种方法之一被定向到元数据服务。在启用DHCP的项目网络上,DHCP响应包括169.254.169.254的静态路由。没有DHCP的项目网络在OVN路由器中包含一个静态路由。下面的列表描述了通信过程。
-
在实例部署期间,将选择一个compute节点作为部署目标。在目标计算节点上运行的neutron-ovn-metadata-agent负责管理网络名称空间(ovnmeta-xxx)、OVS接口和启动HAProxy进程。
-
如果实例网络的网络名称空间(ovnmeta-xxx)不存在,则neutron-ovn-metadata-agent会创建一个。
-
使用veth对将名称空间链接到OVS,并与IP地址相匹配,然后启动。
-
neutron-ovn-metadata-agent启动一个HAProxy进程,该进程被称为该名称空间中的元数据代理。下面的输出显示了名称空间、连接名称空间到OVN的接口和HAProxy进程,它们都使用相同的标识符。
-
如果实例有DHCP提供的主机路由,那么从cloud-init发出的请求将直接发送到元数据代理;如果网络上没有启用DHCP,则由OVN路由器转发到元数据代理。
-
元数据代理流程侦听HTTP流量,然后将任何请求转发到neutron-ovn-metadata-agent代理通过/var/lib/neutron/metadata_proxy套接字。作为计算元数据API不能区分实例的IP地址,包含ID的元数据代理注入一个X-OVN-Network-ID头项目的网络。
- neutron-ovn-metada-agent将请求发送给计算元数据APl,并通过相同的路径将任何响应转发回实例。
图4.1: cloud-init与计算元数据API通信
📜描述CLOUD-INIT结构
cloud-init应用程序由用Python编写的模块组成。它还包括四个Systemd服务、配置文件和一些用于分发特定文件的模板。cloud-init的数据存储在/var/lib/cloud.下。这些文件都在一个安装了cloud-init包的实例中。下面描述这四个服务的功能。
📑Cloud-Init服务
cloud-init-local.service
此服务在网络可用之前先运行,但在挂载根分区时运行读/写。理想情况下,该服务可以为实例提供网络配置信息。执行的命令是cloud-init init --local。
cloud-init.service
该服务在引导顺序中排名第二,并期望网络被确认。因为网络是可用的,所以这个阶段处理所有用户数据。所有模块列于cloud_init_modules在/etc/cloud/cloud.conf中执行。执行的命令是cloud-init init。
cloud-config.service
这个服务在cloud-init.service之后运行。所有模块列于cloud_init_modules在/etc/cloud/cloud.conf中执行。执行命令cloud-init modules --mode=config。
cloud-final.service
此服务根据cloud-config.service和rc-local.service尽可能地延迟运行。所有模块列于cloud_init_modules在/etc/cloud/cloud.conf中执行。执行命令cloud-init modules --mode = final。
您可以通过检查/var/log/下的日志文件来排除cloud-init故障。cloud-init.log文件包含这四个服务产生的信息。cloud-init-output.log文件可能存在,并包含每个模块产生的输出。可以手动运行上述服务中列出的任何命令来解决问题。
/etc/cloud/cloud.cfg文件是cloud-init的主要配置文件,但是可以通过将文件放在/etc/cloud/cloud.cfg.d下来包含其他配置文件。
📜课本练习
-
创建一个云配置格式的用户数据文件。
-
启动实例并验证是否应用了用户数据。
[student@workstation ~]$ lab customization-img-cloudinit setup
Setting up workstation for exercise work:
• Verifying project: finance.................................. SUCCESS
• Creating user environment file: developer1-finance-rc....... SUCCESS
• Creating keypair: example-keypair........................... SUCCESS
. Creating flavor: default.................................... SUCCESS
. Creating internal network: finance-network1................. SUCCESS
. Creating subnet: finance-subnet1............................ SUCCESS
. Creating external network: provider-datacentre.............. SUCCESS
. Creating router: finance-router1............................ SUCCESS
• Creating secgroup rule: ssh................................. SUCCESS
• Checking fip availability: 1................................ SUCCESS
• Adding yv alias:............................................ SUCCESS
📑1. 在cloud config格式创建/home/student/user-data文件。
[student@workstation ~]$ cat user-data
#cloud-config
users:
- name: cloud-admin
sudo: ALL=(ALL) NOPASSWD:ALL
ssh_authorized_keys:
- ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDHufCmzG95rJkXHZOe+7rHMaf3me7geAfdYAc2fuoKjSVoBni4aF4MYkSmb1UYyXjtQ++x2+i13+Osn9FJZmvda0maqT6DuIcpiAxldVrnNJFv5L1VFGiFDbUglThPc25Ytn7bWqg02pFJz4Nc9vN+PzVETevL8b0tMvWPQ44MRuXCCM+UaHO1mBD2pcEnpQ1R/MzYxTzzdvjP5iBn4GAp7KjUw/+FvBhlNiKsXJjQGl6MHbCZhtgsntJzl7tKGY4SgJXZaUD0TnpPeCBlEmWNUz4hAoVMfiiZA4fLAmJ7yZqwRcr4EVnqbmZC6CfIhVxb1J69UHhK62KS6513MP3v Generated-by-Nova
packages:
- aide
- nmap
- socat
- wireshark
[student@workstation ~]$ source .bashrc
[student@workstation ~]$ cat .bashrc
# .bashrc
# Source global definitions
if [ -f /etc/bashrc ]; then
. /etc/bashrc
fi
# Uncomment the following line if you don't like systemctl's auto-paging feature:
# export SYSTEMD_PAGER=
# User specific aliases and functions
yv(){
python -c "import sys,yaml; yaml.load(sys.stdin.read());" < "${1}"
}
[student@workstation ~]$ yv user-data
📑2. 加载/home/student/developer1-finance-rc环境文件。使用以下属性启动实例:
[student@workstation ~(developer1-finance)]$ openstack server create --flavor default --key-name example-keypair --nic net-id=finance-network1 --security-group default --image rhel7 --user-data user-data --wait finance-admin1
+-----------------------------+------------------------------------------------------+
| Field | Value
+-----------------------------+------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL
| OS-EXT-AZ:availability_zone | nova
| OS-EXT-STS:power_state | Running
| OS-EXT-STS:task_state | None
| OS-EXT-STS:vm_state | active
| OS-SRV-USG:launched_at | 2020-10-22T15:02:48.000000
| OS-SRV-USG:terminated_at | None
| accessIPv4 |
| accessIPv6 |
| addresses | finance-network1=192.168.1.11
| adminPass | gK7yKVZqwrr8
| config_drive |
| created | 2020-10-22T14:53:32Z
| flavor | default (e04380ed-b027-4a72-a697-4307bc014b6c)
| hostId | 3eb57302ddddc3af1fdc763eee541c699f0866f6458e3b5c9a722611 |
| id | 381b8bd4-3248-4384-abe2-8e2bb16bc832
| image | rhel7 (6b0128a9-4481-4ceb-b34e-ffe92e0dcfdd)
| key_name | example-keypair
| name | finance-admin1
| progress | 0
| project_id | 3c003f65d8d64914a053f178fbbf953c
| properties |
| security_groups | name='default'
| status | ACTIVE
| updated | 2020-10-22T15:02:48Z
| user_id | e4035d555f6b88cf42ca4cacb9fa9999dca9787392222d2eb0875e4e34e6d76f |
| volumes_attached |
+-----------------------------+------------------------------------------------------+
📑3. 列出可用的浮动IP地址,然后分配一个给finance-admin1。
[student@workstation ~(developer1-finance)]$ openstack floating ip list
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| ID | Floating IP Address | Fixed IP Address | Port | Floating Network | Project |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| 20e6fda9-9284-4f6a-891e-0d8889c27098 | 172.25.250.101 | None | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 3c003f65d8d64914a053f178fbbf953c |
| 93c41a42-3b3f-481e-9515-ab5098785d90 | 172.25.250.102 | None | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 3c003f65d8d64914a053f178fbbf953c |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
[student@workstation ~(developer1-finance)]$ openstack server add floating ip finance-admin1 172.25.250.101
📑4. 验证cloud-init定制是否有效。通过检查/var/log/cloud-init日志文件来调试任何失败。
[student@workstation ~(developer1-finance)]$ ssh cloud-admin@172.25.250.101
Warning: Permanently added '172.25.250.101' (ECDSA) to the list of known hosts.
[cloud-admin@ finance-admin1~]$ rpm -qa | egrep 'aide|nmap|socat|wireshark'
socat-1.7.3.2-2.el7.x86_64
wireshark-1.10.14-14.el7.x86_64
aide-0.15.1-13.el7.x86_64
nmap-ncat-6.40-13.el7.x86_64
nmap-6.40-13.el7.x86_64
📑清除实验
[student@workstation ~]$ lab customization-img-cloudinit cleanup
📜章节实验
-
使用diskimage-builder构建镜像。
-
使用安装后脚本定制镜像。
-
使用guestfish命令自定义镜像。
-
将图像上传到OpenStack图像服务。
-
使用自定义映像启动实例。
[student@workstation ~]$ lab customization-review setup
Setting up workstation for lab exercise work:
• Installing required packages on: workstation................ SUCCESS
• Verifying project: production............................... SUCCESS
• Creating user environment file: operator1-production-rc..... SUCCESS
• Creating keypair: example-keypair........................... SUCCESS
. Creating flavor: default.................................... SUCCESS
. Creating internal network: production-network1.............. SUCCESS
. Creating subnet: production-subnet1......................... SUCCESS
. Creating external network: provider-datacentre.............. SUCCESS
. Creating router: production-router1......................... SUCCESS
• Checking fip availability: 1................................ SUCCESS
📑1. 在工作站上,检索http://materials.example.com/osp-small.qcow2磁盘镜像并将其保存在/home/student/下。
[student@workstation ~]$ wget http://materials.example.com/osp-small.qcow2 -O osp-small.qcow2
📑2. 在/home/student/下创建要使用的/usr/share/diskimage-builder/elements目录的副本。
[student@workstation ~]$ cp -a /usr/share/diskimage-builder/elements .
📑3. 创建post-install.d目录下的rhe17元素。
[student@workstation ~]$ mkdir -p elements/rhel7/post-install.d
📑4. 在rhel7元素下post-install.d添加一个脚本,目录中启用httpd服务。
[student@workstation ~]$ mkdir -p elements/rhel7/post-install.d
[student@workstation ~]$ cd elements/rhel7/post-install.d/
[student@workstation post-install.d]$ vim 01-enable-services
[student@workstation post-install.d]$ chmod +x 01-enable-services
[student@workstation post-install.d]$ cd
📑5. 导出以下环境变量,这些环境变量将由diskimage-builder生成。DB_NO_TMPFS变量是必需的,因为工作站有一个小的硬盘,在大多数情况下不需要它。
[student@workstation ~]$ export DIB_LOCAL_IMAGE=/home/student/osp-small.qcow2
[student@workstation ~]$ export DIB_YUM_REPO_CONF=/etc/yum.repos.d/openstack.repo
[student@workstation ~]$ export ELEMENTS_PATH=/home/student/elements
[student@workstation ~]$ export DIB_NO_TMPFS=1
📑6. 构建一个名为production-rhel-web.qcow2的Red Hat Enterprise Linux 7镜像。使用之前确定的diskimage-builder元素。在镜像中包含httpd包。当提示时,提供student的密码。
[student@workstation ~]$ disk-image-create vm rhel7 -t qcow2 -p httpd -o production-rhel-web.qcow2
📑7. 使用questfish命令向production-rhel-web.qcow2镜像添加自定义web index.html。在index.html中包含文本production-rhel-web。确保SELinux上下文为/var/ www/html/index.html是正确的。
[student@workstation ~]$ guestfish -i -a production-rhel-web.qcow2
Welcome to guestfish, the guest filesystem shell for
editing virtual machine filesystems and disk images.
Type: 'help' for help on commands
'man' to read the manual
'quit' to quit the shell
Operating system: Red Hat Enterprise Linux Server 7.5 (Maipo)
/dev/sda1 mounted on /
><fs> touch /var/www/html/index.html
><fs> edit /var/www/html/index.html
><fs> cat /var/www/html/index.html
This instance uses the production-rhel-web image.
><fs> command "systemctl is-enabled httpd"
enabled
><fs> selinux-relabel /etc/selinux/targeted/contexts/files/file_contexts /var/www
><fs> selinux-relabel /etc/selinux/targeted/contexts/files/file_contexts /var/www
><fs> exit
📑8. 作为operator1用户,使用production-rhel-web.qcow2镜像创建一个新的OpenStack镜像,名为production-rhel-web。最小磁盘需求为10 GiB,最小RAM需求为2 GiB。
[student@workstation ~(operator1-production)]$ openstack image create --disk-format qcow2 --min-disk 10 --min-ram 2048 --file ~/production-rhel-web.qcow2 production-rhel-web
+------------------+-----------------------------------------------------------------+
| Field | Value
+------------------+-----------------------------------------------------------------+
| checksum | dd17daecd4493929bd9a5e75a721860b
| container_format | bare
| created_at | 2020-10-23T15:11:09Z
| disk_format | qcow2
| file | /v2/images/1c4481fe-5c1f-468a-b92e-4548a7d22307/file
| id | 1c4481fe-5c1f-468a-b92e-4548a7d22307
| min_disk | 10
| min_ram | 2048
| name | production-rhel-web
| owner | 294ad7735e6646d7bb908e32de8582c3
| properties | direct_url='rbd://fe8e3db0-d6c3-11e8-a76d-52540001fac8/images/1c4481fe-5c1f-468a-b92e-4548a7d22307/snap', locations='[{u'url': u'rbd://fe8e3db0-d6c3-11e8-a76d-52540001fac8/images/1c4481fe-5c1f-468a-b92e-4548a7d22307/snap', u'metadata': {}}]' |
| protected | False
| schema | /v2/schemas/image
| size | 701169664
| status | active
| tags |
| updated_at | 2020-10-23T15:11:49Z
| virtual_size | None
| visibility | shared
+------------------+-----------------------------------------------------------------+
📑9. 作为operator1用户,使用以下属性启动实例:
[student@workstation ~(operator1-production)]$ openstack server create --flavor default --key-name example-keypair --nic net-id=production-network1 --security-group default --image production-rhel-web --wait production-web1
+-----------------------------+------------------------------------------------------+
| Field | Value
+-----------------------------+------------------------------------------------------+
| OS-DCF:diskConfig | MANUAL
| OS-EXT-AZ:availability_zone | nova
| OS-EXT-STS:power_state | Running
| OS-EXT-STS:task_state | None
| OS-EXT-STS:vm_state | active
| OS-SRV-USG:launched_at | 2020-10-23T15:25:17.000000
| OS-SRV-USG:terminated_at | None
| accessIPv4 |
| accessIPv6 |
| addresses | production-network1=192.168.1.10
| adminPass | cTVM8Kw8hJSn
| config_drive |
| created | 2020-10-23T15:22:03Z
| flavor | default (e04380ed-b027-4a72-a697-4307bc014b6c)
| hostId | 8fd3f499e7f709993ddc2c96e26a7d2baa3a0e86bf738c695624c601 |
| id | 9b9be0d8-1d17-49a9-a14b-f78b23ca4fd8
| image | production-rhel-web (1c4481fe-5c1f-468a-b92e-4548a7d22307)
| key_name | example-keypair
| name | production-web1
| progress | 0
| project_id | 294ad7735e6646d7bb908e32de8582c3
| properties |
| security_groups | name='default'
| status | ACTIVE
| updated | 2020-10-23T15:25:17Z
| user_id | ac8f19029cdf35fa7083687862bf1235d5a10f5b98632be09d323616c640985e |
| volumes_attached |
+-----------------------------+------------------------------------------------------+
📑10. 列出可用的浮动IP地址,然后分配一个给production-web1
[student@workstation ~(operator1-production)]$ openstack floating ip list
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| ID | Floating IP Address | Fixed IP Address | Port | Floating Network | Project |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
| d0ae4d18-0444-487e-a42f-9904c368ac89 | 172.25.250.107 | None | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 294ad7735e6646d7bb908e32de8582c3 |
| f3a78fe1-ed50-4cf7-86f4-e5145c3a21ad | 172.25.250.112 | None | None | fc5472ee-98d9-4f6b-9bc9-544ca18aefb3 | 294ad7735e6646d7bb908e32de8582c3 |
+--------------------------------------+---------------------+------------------+------+--------------------------------------+----------------------------------+
[student@workstation ~(operator1-production)]$ openstack server add floating ip production-web1 172.25.250.107
📑11. 使用ssh命令登录到production-web1实例。验证httpd包已安装,httpd服务已启用并正在运行。
[student@workstation ~(operator1-production)]$ ssh cloud-user@172.25.250.107
[cloud-user@production-web1 ~]$
[cloud-user@production-web1 ~]$ rpm -q httpd
httpd-2.4.6-80.el7_5.1.x86_64
[cloud-user@production-web1 ~]$ systemctl status httpd
● httpd.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/httpd.service; enabled; vendor preset: disabled)
Active: active (running) since Fri 2020-10-23 12:46:42 EDT; 7h ago
Docs: man:httpd(8)
man:apachectl(8)
Main PID: 880 (httpd)
Status: "Total requests: 0; Current requests/sec: 0; Current traffic: 0 B/sec"
CGroup: /system.slice/httpd.service
├─880 /usr/sbin/httpd -DFOREGROUND
├─895 /usr/sbin/httpd -DFOREGROUND
├─897 /usr/sbin/httpd -DFOREGROUND
├─900 /usr/sbin/httpd -DFOREGROUND
├─901 /usr/sbin/httpd -DFOREGROUND
└─902 /usr/sbin/httpd -DFOREGROUND
Oct 23 12:46:12 localhost systemd[1]: Starting The Apache HTTP Server...
Oct 23 12:46:35 localhost httpd[880]: AH00558: httpd: Could not reliably determine the server's ...sage
Oct 23 12:46:43 localhost systemd[1]: Started The Apache HTTP Server.
Hint: Some lines were ellipsized, use -l to show in full.
[cloud-user@production-web1 ~]$ exit
logout
Connection to 172.25.250.107 closed.
📑12. 从workstation确认从production-web1中显示的定制web页面包含文本production-rhel-web。
[student@workstation ~(operator1-production)]$ curl http://172.25.250.107
This instance uses the production-rhel-web image.
📑评分脚本
[student@workstation ~]$ lab customization-review grade
Grading the student's work on workstation:
. Retrieving instance floating IP: ........................... PASS
. Checking instance image: ................................... PASS
. Checking whether httpd is installed: ....................... PASS
. Checking whether httpd is enabled: ......................... PASS
. Checking whether httpd is active: .......................... PASS
. Checking for custom site index page: ....................... PASS
Overall lab grade.............................................. PASS
📑清除实验
[student@workstation ~]$ lab customization-review cleanup
💡总结
-
与定制现有镜像相比,构建镜像的优点和缺点,例如满足组织安全标准(包括第三方代理)和添加操作员帐户。
-
何时使用guestfish和virt-customize工具。当您需要执行诸如磁盘分区之类的低级任务时,请使用guestfish。对所有常见的定制任务(如设置密码和安装包)使用virt-customize。
-
使用这些工具对镜像进行更改会影响SELinux文件上下文,因为chroot环境中不直接支持SELinux。
-
要避免镜像扩展,请使用较小的镜像集,并根据需要使用clound-init或配置管理系统执行每个实例定制。
RHCA认证需要经历5门的学习与考试,还是需要花不少时间去学习与备考的,好好加油,可以噶🤪。
以上就是【金鱼哥】对 第四章 执行镜像操作–在部署期间初始化实例+章节实验 的简述和讲解。希望能对看到此文章的小伙伴有所帮助。
💾红帽认证专栏系列:
RHCSA专栏:戏说 RHCSA 认证
RHCE专栏:戏说 RHCE 认证
此文章收录在RHCA专栏:RHCA 回忆录
如果这篇【文章】有帮助到你,希望可以给【金鱼哥】点个赞👍,创作不易,相比官方的陈述,我更喜欢用【通俗易懂】的文笔去讲解每一个知识点。
如果有对【运维技术】感兴趣,也欢迎关注❤️❤️❤️ 【金鱼哥】❤️❤️❤️,我将会给你带来巨大的【收获与惊喜】💕💕!
- 点赞
- 收藏
- 关注作者
评论(0)