RHCE认证资料2021.8.28

RHCSA

node1.domain250.example.com 172.25.250.100
node2.domain250.example.com 172.25.250.200
node1.domain250.example.com

一、配置网络环境
主机名:node1.domain250.example.com
IP 地址:172.25.250.100
子网掩码:255.255.255.0
网关:172.25.250.254
DNS服务器:172.25.250.254

解题方法A:

设置主机名
# hostnamectl set-hostname node1.domain250.example.com
查看所有网络接口信息
# nmcli connection show
配置静态IP、设置开机自动激活
# nmcli connection modify "Wired connection 1" ipv4.addresses 172.25.250.100/24 ipv4.gateway 172.25.250.254 ipv4.dns 172.25.250.254 ipv4.method manual connection.autoconnect yes
激活配置
# nmcli connection up "Wired connection 1"
检查网卡是否配置成功
# ifconfig
检查主机名是否配置成功
# hostname

解题方法B:

# vim /etc/hostname
node1.domain250.example.com
# nmtui
# nmcli connection up "Wired connection 1"

注:
1、 设置网卡时需注意网卡名是否带有特殊符号,包括含有空格,都需要用引号把名字括起来
2、 设置网卡时需注意method的前面要有ipv4.

二、配置yum源
http://content/rhel8.2/x86_64/dvd/BaseOS
http://content/rhel8.2/x86_64/dvd/AppStream

解题方法A:

yum-utils
yum-config-manager可用的情况下
# yum-config-manager --add-repo "http://content/rhel8.2/x86_64/dvd/BaseOS"
# yum-config-manager --add-repo "http://content/rhel8.2/x86_64/dvd/AppStream"
# vi /etc/yum.repo.d/
第二行改为:gpgcheck=0

解题方法B:

手动配置yum源
# vi /etc/yum.repo.d/content_rhel8.2_x86_64_dvd_BaseOS.repo
#yum源库的名字,方便在执行yum源时显示库是否配置成功
[content_rhel8.2_x86_64_dvd_BaseOS]
name=content_rhel8.2_x86_64_dvd_BaseOS
#yum源库存在的路径,指yum源从哪里能找到软件
baseurl=http://content/rhel8.2/x86_64/dvd/BaseOS
#enabled=1是指yum源这个库是使用的
enabled=1
#gpgcheck=0是指yum源这个库不需要校验
gpgcheck=0
# vi /etc/yum.repo.d/content_rhel8.2_x86_64_dvd_AppStream.repo
[content_rhel8.2_x86_64_dvd_AppStream]
name=content_rhel8.2_x86_64_dvd_AppStream
baseurl=http://content/rhel8.2/x86_64/dvd/AppStream
enabled=1
gpgcheck=0
清空yum源
# yum clean all
初始化并列出所有可用yum源
# yum repolist
(认证考试机器可能没有vim)安装vim测试yum源是否能正常使用
# yum install vim -y

注:
1、配置yum源时需检查是否能用yum-config-manager
2、Yum源库的名字可以自定义,除非目录有要求
3、填写yum源的baseurl路径时尽量复制

三、调试SELinux
非标准端口 82 上运行的 Web 服务器在提供内容时遇到问题。根据需要调试并解决问题,满足条件:
系统上的 Web 服务器能够提供 /var/www/html 中所有现有的 HTML 文件(注:不要删除或以其他方式改动现有的文件内容)
Web 服务器在端口 82 上提供此内容
Web 服务器在系统启动时自动启动

解题方法:

设置开机自启动
# systemctl enable httpd
启动apche报错,查看错误日志
# journalctl -xn
日志里会出现一行"# semanage port -a -t PORT_TYPE -p tcp 82"
# semanage port -a -t http_port_t -p tcp 82
重启apache
# systemctl restart httpd
# ls -ldZ /var/www/html/
# semanage fcontext -m -t httpd_sys_content_t "/var/www/html/file1"
使用restorecon来恢复SELinux文件属性即恢复文件的安全上下文
# restorecon -Rv /var/www/html/
检查
# curl http://node1.domain250.example.com:82/a.html

注:selinux在做题时需保持全程开启状态。

四、创建用户账户
创建下列用户、组和组成员资格:
名为 sysmgrs 的组
用户 natasha ,作为次要组从属于 sysmgrs
用户 harry ,作为次要组还从属于 sysmgrs
用户 sarah ,无权访问系统上的交互式 shell 且不是 sysmgrs 的成员
natasha 、 harry 和 sarah 的密码应当都是 flectrag 

解题方法:

创建用户组
# groupadd sysmgrs
创建用户并给用户附加一个组
# useradd natasha -G sysmgrs
# useradd harry -G sysmgrs
创建用户并指定用户不能登录到终端
# useradd sarah -s /sbin/nologin
检查组是否添加成功
# grep sysmgrs /etc/group
检查用户是否添加成功
# tail -3 /etc/passwd# grep /bin/bash /etc/passwd
# grep sarah /etc/passwd
明文设置用户密码
# echo "flectrag" | passwd --stdin natasha
# echo "flectrag" | passwd --stdin harry
# echo "flectrag" | passwd --stdin sarah
检查密码是否设置成功
# su - natasha
$ su - harry
$ su - natasha
$ su - sarah
$ exit

注:
1、root使用su切换时不需要输入密码,所以要切换到其他用户再切回上个用户测试密码
2、因为sarah这个用户设置了无法登陆终端的权限,所以su-sarah会提示该用户不可用

五、配置cron作业
配置 cron 作业,该作业每隔 5 分钟运行并执行以下命令: 
logger "EX200 in progress",以用户 natasha 身份运行

解题方法:

创建natasha的计划任务
# crontab -e -u natasha
*/5 * * * * logger "EX200 in progress"
检查
# crontab -l -u natasha

新增:

备注:该作业在14:34执行
# crontab -e -u natasha
34	14 * * * logger "EX200 in progress"
六、创建协作目录
创建目录/home/managers,并按以下要求设置: 
/home/managers 目录属于 sysmgrs 组 
目录可以被 sysmgrs 的组成员读取、写入和访问,其他任何用户不具备这些权限(root 用户除外)
在/home/managers 目录中创建的文件,所属组自动变成 sysmgrs 组

解题方法:

创建managers文件夹
# mkdir /home/managers
改变文件夹的属组
# chown :sysmgrs /home/managers# chgrp sysmgrs /home/managers
修改用户对文件夹使用权限
# chmod 2770 /home/managers
检查文件夹是否成功
# ls -ldZ /home/managers
命令说明
chown 可以用来更改文件的所有者和所有组,如chown harry:harry /home/ ,意为把home的所有者和所有组改成harry
chgrp 允许普通用户改变文件所属的组,只要该用户是该组的一员,但不能改变所有者
chmod 控制用户对文件的权限的命令;
chmod赋予的高级权限分为:
"4"是SUID普通用户提权,普通用户对该文件的所有操作相当于是root权限(只针对二进制、可执行的文件);
"2"是SGID获得该程序所属用户组的权限,这个用户组的所有用户在该文件夹下创建的任何一个文件夹或文件它们的群组都会与此目录的群组相同;
"1"是SBIT限制用户对文件执行的权限,当用户在该目录下建立文件或目录时,仅有自己与 root才有权力删除。
2770 "2"为SGID,"7"为wrx(w读 + r 写 + x 执行)"0"为什么权限都没有

注:看题目要求是否需要赋予高级权限

七、配置autofs 
配置 autofs ,自动挂载远程用户的主目录:
NFS 服务器 172.25.250.254 共享/rhome,包含用户remoteuser1 主目录
remoteuser1 的主目录是 172.25.250.254:/rhome/remoteuser1
remoteuser1 的主目录应自动挂载到/rhome/remoteuser1 
主目录允许remoteuser1用户写入
remoteuser1 的密码是 flectrag

解题方法:

autofs主配置文件
# vim /etc/auto.master
/rhome /etc/auto.rhome
配置子配置文件按照“挂载目录 挂载文件类型及权限 :设备名称”的格式进行填写,可以参考"/etc/auto.misc"的格式
# vim /etc/auto.rhome
remoteuser1 -rw,sync 172.25.250.254:/rhome/remoteuser1
重启服务并设置开机自启
# systemctl restart autofs
# systemctl enable autofs
检查是否部署完成
# su - remoteuser1
$ pwd
$ df -Th

注:如果切换到用户左边显示为bash说明autofs子配置文件写错或是需要更改挂载文件夹的权限

八、配置文件权限
将文件/etc/fstab 复制到/var/tmp/fstab,并配置权限:
/var/tmp/fstab 属于 root 用户和 root 组
/var/tmp/fstab 不能被任何人执行
用户 natasha 有读写权限
用户 harry 没有读写权限 
所有其他用户(当前或未来)只有读取权限

解题方法:

拷贝fstab文件
# cp /etc/fstab /var/tmp/fstab
查看文件是否拷贝成功
# ll /var/tmp/fstab
查看acl基本权限
# getfacl /var/tmp/fstab
设置acl基本权限
# setfacl -m u:natasha:rw /var/tmp/fstab
# setfacl -m u:harry:- /var/tmp/fstab
查看acl基本权限
# getfacl /var/tmp/fstab
命令说明
acl访问控制权限
setfacl 给文件添加访问控制权限
"setfacl -m u:natasha:rw /var/tmp/fstab" 给文件fstab 添加用户natasha 并赋予这个用户读写权限
"setfacl -m u:harry:-/var/tmp/fstab" 给文件fstab添加用户harry并设置这个用户没有权限操作文件
九、配置NTP
配置 node1 为 NTP 的客户端,与时间服务器172.25.250.254 同步时间

解题方法:

设置NTP同步地址
# vim /etc/chrony.conf
(可参考文件里面的写法,把中间的地址换成需要同步的地址)
server 172.25.250.254 iburst
重启服务并设置开机自启
# systemctl restart chronyd
# systemctl enable chronyd
检查时间是否同步成功
# timedatectl
十、配置用户帐户
创建用户manalo ,其用户ID为 3533,此用户的密码为flectrag

解题方法:

创建manalo用户并设置uid为3533
# useradd manalo -u 3533
# echo "flectrag" | passwd --stdin manalo# passwd manalo

检查方法可参考第四题

十一、查找文件
查找属于jacques 用户所属的文件,并将其副本拷贝到/root/findfiles目录

解题方法:

先创建一个存放jacques 用户所有文件的文件夹
# mkdir /root/findfiles
使用find文件搜索命令查找用户文件并拷贝到刚创建的文件夹中
# find / -user jacques -exec cp -a {} /root/findfiles \;
命令说明
find / -user jacques -exec cp -a {} /root/findfiles \"find":文件搜索命令;
"/":表示从根目录开始查找;
"-user":表示查找文件时只搜索和这个用户相关的文件;
"-exec":表示调用并执行一条shell命令;
"{}"为前面查找到的内容;
"\;""exec"的命令结束符;
"cp":拷贝命令;
"-a":在这里表示复制所有查找到的文件。

注:使用exec命令,该命令的格式必须要有"{}“和”;"

十二、查找字符串
查找文件/usr/managers/xml/iso-codes/iso_639_3.xml中包含字符串 ng 的所有行
将找到的内容按原有顺序放到文件/root/list中,/root/list不能包含空行,且所有行必须是/usr/managers/xml/iso-codes/iso_639_3.xml 中原始行的确切副本。

解题方法:

使用grep命令限制需要查找的内容,如果内容没有特殊符号可以不用加引号
# grep ng /usr/managers/xml/iso-codes/iso_639_3.xml > /root/list
十三、文件归档
创建为/root/backup.tar.gz或/root/backup.tar.bz2 的归档包,用来压缩/usr/local目录

解题方法:

tar打包并压缩文件(看题目要求使用参数)
# tar -czvf /root/backup.tar.gz /usr/local
# tar -cjvf /root/backup.tar.bz2 /usr/local
检查是否打包压缩成功
# ll /root/backup.tar.gz
# file /root/backup.tar.gz
命令说明
tar -czvf /root/backup.tar.gz /usr/local
tar打包命令中:
"c":为指定归档包的创建路径;
"z":为把指定的文件压缩成gzip(gz)属性;
"j":为把指定的文件压缩成bz2属性;
"v":显示打包的详细过程,这个参数"v"可以不加;
"f":指定需要被打包的文件
file辨识文件类型命令,用来告诉你这个文件是什么类型的

注:看题目是要求打包成什么类型的压缩包

十四、十五、podman容器
注册服务器信息:
注册服务器地址registry.domain250.example.com
使用admin作为用户名,使用redhat321作为映像注册表的凭据
配置容器使其自动启动
利用注册服务器上的 rsyslog 镜像,创建一个名为 logserver 的容器
面向wallah用户,配置一个 systemd 服务
该服务命名为 container-logserver ,并在系统重启时自动启动,无需干预
为容器配置持久存储
通过以下方式扩展上一个任务的服务
配置主机系统的 journald 日志以在系统重启后保留数据,并重新启动日志记录服务
将主机 /var/log/journal 目录下任何以 *.journal 的文件复制到 /home/wallah/container_logfile 中
将服务配置为在启动时自动将 /home/wallah/container_logfile 挂载到容器中的 /var/log/journal 下

解题方法:

容器普通用户部分
切换到普通用户(必须使用ssh的方法去切换,使用su提权的方法,部分组件会认为还是root用户在执行)
# ssh wallah@localhost
登录到容器注册库
user$ podman login registry.domain250.example.com
搜索容器
user$ podman search registry.domain250.example.com/
创建一个新的容器
user$ podman run -d -–name logserver -v /home/wallah/container_logfile:/var/log/journal:Z registry.domain250.example.com/rhel8/rsyslog
检查容器是否创建成功
user$ podman ps
启用逗留功能
user$ loginctl enable-linger
查看是否启用
user$ loginctl show-user wallah
创建隐藏文件
$ mkdir -p .config/systemd/user
$ cd .config/systemd/user
创建一个容器进程
user$ podman generate systemd -f -n logserver
系统提示/home/wallah/.config/systemd/user/container-logserver.service
关闭容器
user$ podman stop logserver
user$ ls
系统提示container-logserver.service
重启创建出来的容器进程服务
user$ systemctl --user restart container-logserver.service
user$ systemctl - -user enable container-logserver.service
重启机器检查
# sync
# reboot

命令说明

@reboot systemctl --user start container-logserver.service在计划任务crontab里表示(@reboot)重启后以(--user)普通用户的身份运行容器导出来的进程服务container-logserver.service
十六、创建shell脚本
在/usr/bin目录下创建一个repwis脚本,查找/usr目录下小于10M并且组id不为root的文件,把查到的文件结果拷贝到/root/myfiles文件夹内

解题方法:

创建脚本文件,文件类型可以不用指定
#vi /usr/bin/repwis
#!/bin/bash
##使用awk过滤出GID(组ID)
for i in `awk -F':' '{print $3}' /etc/group`
do
##提醒脚本跑到哪个GID
echo GID is $i
##由于我自己的环境root组文件过多,为了检验脚本,就把root用户过滤掉
if [ 0 != $i ];then
##使用find查找
find /usr -size -10M -gid $i -exec cp -a {} /root/myfiles \;
fi
done
检查拷贝的文件是否符合
#ll -h /root/myfiles/#ls -lh /root/myfiles/
脚本说明
(#!/bin/bash):
"#!"是一个约定的标记,告诉系统该用什么编译器执行这个脚本;
/bin/bash:使用默认Shell
在这里需要用到for循环对查找到的GID(组id)进行遍历处理。
(awk -F':' '{print $3}' /etc/group):
"awk"用来对文本进行分割处理;
"-F"指定一个分隔符;
":"使用:(引号)来分隔文本内容;
"{print $3}":执行打印语句,打印出第三列的内容。

补充:

在/usr/bin目录下创建一个repwis脚本,查找/usr目录下大于30k小于50k并且具有用户权限的文件,把查到的文件结果拷贝到/root/myfiles文件夹内

解题方法:

#vi /usr/bin/repwis
#!/bin/bash
for i in $(find /usr -size +30k -size -50k -perm -4000)
do
    echo $i >> /root/myfiles.txt
done

node2.domain250.example.com

一、重置root密码
将 node2 主机的root密码设置成 flectrag

解题方法:

重启
内核选择界面按e,将光标移到Linux 那一行末尾添加如下内容:rd.break console=tty0
按下:Ctrl + X进入grup救援模式
重新挂载/目录
# mount -o rw,remount /sysroot
进入/目录
# chroot /sysroot
设置root密码
# echo "flectrag"|passwd --stdin root
或
下面设置密码需要敲两次密码
# passwd
flectrag
flectrag
在根目录下创建重新刷新SELinux 安全上下文标记的文件
# touch /.autorelabel
退出重启系统
# exit
# reboot

注:
1、rw和remount之间的符号是“,”(逗号)
2、touch创建的是一个在/目录下的隐藏文件所以是.autorelabel,不是在当前目录下创建autorelabel

二、配置yum源
http://content/rhel8.2/x86_64/dvd/BaseOS 
http://content/rhel8.2/x86_64/dvd/AppStream

解题方法:参考node1第二题

三、调整逻辑卷大小
将逻辑卷lv01的大小调整到300M,确保文件系统的内容保持不变
调整后的逻辑卷的大小范围在290到310M之间可以接受

解题方法:

查看需要调整的逻辑卷所挂载的路径和现有的大小、名字
# lvscan
查看卷组的容量有多大
# vgs
使用lvm逻辑卷扩容
# lvextend -L 300M /dev/qfvg/lv01
检查lvm大小是否符合
# lvscan
重新扩容过的文件系统
# resize2fs /var/lv01# xfs_growfs /var/lv01
查看是否扩容成功
# df -Th
命令说明
lvextend -L 300M /dev/qfvg/lv01:
"-L"指定逻辑卷的大小;
"300M"指定要扩展的大小可以为KB,MB,GB;
"/dev/qfvg/lv01":指定要扩容的逻辑卷路径
resize2fs /var/lv01:"resize2fs"为ext文件系统的刷新命令
xfs_growfs /var/lv01:"xfs_growfs"为xfs文件系统的刷新命令

注:看清题目要求是扩容ext类型的文件系统还是xfs类型的文件系统,ext类型就用resize2fs刷新,xfs类型就用xfs_growfs刷新

四、添加交换分区(SWAP虚拟内存)
向 node2 添加一个额外的交换分区512M;
交换分区应在系统启动时自动挂载;
不要删除或改动系统上的任何现有交换分区。

解题方法A:

使用dd if of创建虚拟内存(个人感觉用此方法比较容易且方便)
# dd if=/dev/zero of=/root/swap.jpg bs=512 count=1M
制作swap
# mkswap /root/swap.jpg
写入挂载
# vi /etc/fstab
/root/swap.jpg swap swap defaults 0 0
挂载swap
# swapon -a
# swapon -s
查看是否创建成功
# free -h
或者使用磁盘分区分出一个swap
# fdisk /dev/vdb
# mkswap /dev/vdb2
记住分出来的UUID,记不住可以用blkid查看
# blkid
UUID=*
写入挂载
# vim /etc/fstab
UUID=* swap swap defaults 0 0
挂载
# swapon -a
# swapon -s
检查
# free -h

解题方法B:

[root@node2 ~]# fdisk /dev/vdb
Welcome to fdisk (util-linux 2.32.1).
Changes will remain in memory only, until you decide to write them.
Be careful before using the write command.
Device does not contain a recognized partition table.
Created a new DOS disklabel with disk identifier 0xcad347a4.
Command (m for help): n
Partition type
p primary (0 primary, 0 extended, 4 free)
e extended (container for logical partitions)
Select (default p): p
Partition number (1-4, default 1): 敲回车即可
First sector (2048-41943039, default 2048): 敲回车即可
Last sector, +sectors or +size{K,M,G,T,P} (2048-41943039, default 41943039): +512M
Created a new partition 1 of type 'Linux' and of size 512 MiB.
Command (m for help): w
The partition table has been altered.
Calling ioctl() to re-read partition table.
Syncing disks.
[root@node2 ~]# mkswap /dev/vdb1
Setting up swapspace version 1, size = 512 MiB (512719360 bytes)
no label, UUID=5b0302b3-2a08-45a0-ada3-7e6461e2689e
[root@node2 ~]# swapon /dev/vdb1
[root@node2 ~]# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 21 05:03:40 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=2db66eb4-d9c1-4522-8fab-ac074cd3ea0b /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/vdb1 swap swap defaults 0 0
命令说明
dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。
if=文件名:输入文件名,缺省为标准输入。即指定源文件。
of=文件名:输出文件名,缺省为标准输出。即指定目的文件。
bs=bytes:同时设置读入/输出的块大小为bytes个字节。
count=blocks:仅拷贝blocks个块,块大小等于ibs指定的字节数。
dd if=/dev/zero of=/root/swap.jpg bs=512 count=1M表示从一个空设备"/dev/zero"中取出一个512块大小为1M的数据块给到一个指定的文件"/root/swap.jpg",文件类型名字随便取
swapon -a:激活swap分区(读取/etc/fstab)
swapon -s: 显示简短的装置讯息
/etc/fstab里面可写UUID也可以写要挂载的文件系统路径,认证不分哪种写法,但是用磁盘分区做的文件系统从安全角度来讲还是UUID比较好
五、创建VDO卷
根据以下要求,创建新的VDO卷: 
使用未分区的磁盘
该卷的名称为 vdough
该卷的逻辑大小为 50G
该卷使用 xfs 文件系统格式化
该卷在系统启动时挂载到/vbread

解题方法A:

使用stratis卷管理文件系统
# yum -y install stratisd stratis-cli
# systemctl restart stratisd
# systemctl enable stratisd
使用stratis创建池
# stratis pool create vdough /dev/vdc
查看创建的池是否成功
# stratis blockdev list vdough
前面是池的名字,后面是卷的名字
# stratis filesystem create vdough vdough
查看创建的卷是否成功
# stratis filesystem list
查看UUID
# lsblk --output=uuid /stratis/vdough/vdough
UUID*
# mkdir /vbread
# vim /etc/fstab
UUID=* /vbread xfs defaults,x-systemd.requires=stratisd.service 0 0
# mount -a
# df -Th
# reboot

解题方法B:

安装VDO工具
# yum install vdo
# man vdo | grep vdo.*create
创建VDO虚拟磁盘
# vdo create --name=vdough --device=/dev/vdc --vdoLogicalSize=50G
# mkfs.xfs -K /dev/mapper/vdough
查看udev事件队列
# udevadm settle
创建挂载的路径
# mkdir /vbread
# vim /etc/fstab
#
# /etc/fstab
# Created by anaconda on Tue Jul 21 05:03:40 2020
#
# Accessible filesystems, by reference, are maintained under '/dev/disk/'.
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info.
#
# After editing this file, run 'systemctl daemon-reload' to update systemd
# units generated from this file.
#
/dev/mapper/rhel-root / xfs defaults 0 0
UUID=2db66eb4-d9c1-4522-8fab-ac074cd3ea0b /boot xfs defaults 0 0
/dev/mapper/rhel-swap swap swap defaults 0 0
/dev/cdrom /media/cdrom iso9660 defaults 0 0 
/dev/vdb1 swap swap defaults 0 0
/dev/vdb2 /mnt/qa ext3 defaults 0 0 
/dev/mapper/vdough /vbread xfs defaults,_netdev 0 0 
# mount -a
命令说明
vdo create --name=vdough --device=/dev/vdc --vdoLogicalSize=50G
VDO:创建虚拟磁盘
	--name:后面跟vdo卷的名称,随便写
	--device:后面跟真实的物理磁盘
	--vdoLogicalSize:后面跟vdo卷的容量,这里按真实物理空间的1.5倍
udevadm settle:可以用来监视和控制udev运行时的行为,请求内核事件,管理事件队列,以及提供简单的调试机制;"settle" 查看udev事件队列,如果所有的events已处理则退出
stratis卷管理文件系统
	stratis pool create vdough /dev/vdc:从设备"/dev/vdc"中创建一个名为vdough的"池"
	stratis blockdev list vdough:查看创建的池使用的物理设备是否符合
	stratis filesystem create vdough vdough:创建卷
	stratis filesystem list:查看创建的卷是否符合

注:虚拟磁盘写入挂载文件的方式和普通磁盘的有点不同,需添加一条“xfs defaults,x-systemd.requires=”等号后面跟的是挂载使用的服务。

六、创建逻辑卷
根据如下要求,创建新的逻辑卷:
逻辑卷的名字为qa,卷组为qagroup,大小是10个PE
qagroup的PE大小是16M
格式化成ext4文件系统,系统启动时自动挂载到/mnt/qa

解题方法:

第一步创建一个基本分区
# fdisk -l /dev/vdb
# fdisk /dev/vdb
n
p
回车
+200M
w
第二步创建pv物理卷
# pvcreate /dev/vdb3
第三部创建vg逻辑卷组
# vgcreate qagroup /dev/vdb3 -s 16M
第四部创建lv逻辑卷
# lvcreate -l 10 -n qa qagroup# lvcreate -L 160M -n qa qagroup
制作文件系统
# mkfs.ext4 /dev/qagroup/qa
挂载路径
# mkdir /mnt/qa
# vim /etc/fstab
/dev/qagroup/qa /mnt/qa ext4 defaults 0 0
# mount -a
命令说明
pvcreate:创建物理卷,处于LVM最底层,可以是物理硬盘或者分区。
vgcreate qagroup /dev/vdb3 -s 16M:创建逻辑卷组,
"datastorge":卷组名,根据题目要求改;
"/dev/vdb3":之前划分好的物理卷;
"-s 16M":指的是在分区的时候指定vg的大小。
lvcreate -l 10 -n qa qagroup:创建逻辑卷,
"-l 10":指定PE;默认情况一块PE为4M,目前题中指定为16M;
"-n qa":指定逻辑卷的名字,一般"-n"后面跟逻辑卷名,名按题目要求改动;
"qagroup":之前创建出来的逻辑卷组。
七、配置系统调优
为系统选择建议的 tuned 配置集,并将它设为默认设置

解题方法:

# tuned-adm active
设置profile为推荐值
# tuned-adm recommend
virtual-guest
# tuned-adm profile virtual-guest
设置确认
# tuned-adm active
重启并设置开机自启
# systemctl restart tuned –now

2021.07.24补充新增
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

RHCE

系统IP 地址 Ansible ⾓⾊
control 172.25.250.254 ansible control node
node1 172.25.250.9 ansible managed node
node2 172.25.250.10 ansible managed node
node3 172.25.250.11 ansible managed node
node4 172.25.250.12 ansible managed node
node5 172.25.250.13 ansible managed node

一、安装和配置ansible
按照下方所述,在控制节点 control 上安装和配置 Ansible:
安装所需的软件包
创建名为 /home/greg/ansible/inventory 的静态清单文件,以满足以下要求:
node1 是 dev 主机组的成员
node2 是 test 主机组的成员
node3 和 node4 是 prod 主机组的成员
node5 是 balancers 主机组的成员
prod 组是 webservers 主机组的成员
创建名为 /home/greg/ansible/ansible.cfg 的配置文件,以满足以下要求:
主机清单文件为 /home/greg/ansible/inventory
playbook 中使用的角色的位置包括 /home/greg/ansible/roles

解题方法:

$ sudo yum -y install ansible
$ mkdir -p /home/greg/ansible/roles
$ cd /home/greg/ansible/
$ cp /etc/ansible/ansible.cfg /home/greg/ansible/ansible.cfg
修改当前用户的配置文件
$ vim /home/greg/ansible/ansible.cfg
inventory = /home/greg/ansible/inventory
roles_path = /home/greg/ansible/roles
host_key_checking = False
remote_user = root
配置ansible需要管理的主机
$ vim /home/greg/ansible/inventory
[dev]
node1
[test]
node2
[prod]
node3
node4
[balancers]
bastion
[webservers:children]	#组继承
prod
$ ansible-inventory --graph
二、创建和运行ansible临时命令
作为系统管理员,您需要在受管节点上安装软件。
请按照正文所述,创建一个名为 /home/greg/ansible/adhoc.sh 的 shell 脚本,该脚本将使用 Ansible 临时命令在各个受管节点上安装 yum 存储库:
存储库1:
存储库的名称为 EX294_BASE
描述为 EX294 base software
基础 URL 为 http://content/rhel8.0/x86_64/dvd/BaseOS
GPG 签名检查为启用状态
GPG 密钥 URL 为 http://content/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
存储库为启用状态
存储库2:
存储库的名称为 EX294_STREAM
描述为 EX294 stream software
基础 URL 为 http://content/rhel8.0/x86_64/dvd/AppStream
GPG 签名检查为启用状态
GPG 密钥 URL 为 http://content/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release
存储库为启用状态

解题方法:


```bash
$ vim /home/greg/ansible/adhoc.sh
$!/bin/bash
ansible all -m yum_repository -a "name= EX294_BASE _base description=’EX294 base software’_base
baseurl=http://content/rhel8.0/x86_64/dvd/BaseOS gpgcheck=yes gpgkey= http://content/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release enabled=yes"
ansible all -m yum_repository -a "name=EX294_STREAM _stream description=’EX294 stream software’ _stream baseurl=http://content/rhel8.0/x86_64/dvd/AppStream gpgcheck=yes gpgkey= http://content/rhel8.0/x86_64/dvd/RPM-GPG-KEY-redhat-release enabled=yes"
$ chmod +x /home/greg/ansible/adhoc.sh
$ /home/greg/ansible/adhoc.sh
$ ansible all -a ‘yum -y install ftp’
三、安装软件包
创建/home/greg/ansible/packages.yml 的 playbook:
在 dev、test、prod 组中安装 php 和 mariadb 软件包
在 dev 组中安装 Development Tools 包组
将 dev 组中的主机所有软件包更新为最新版本

解题方法:

$ vim /home/greg/ansible/packages.yml
---
- name: 安装软件包
 hosts:dev,test,prod
tasks:
- name: install packages
yum:
name:
	 vars:
		 packages:
- php
- mariadb
- name: 安装软件包2
 hosts:dev
tasks:
- name: install packages
yum:
name:”@RPM Development Tools”
state: present
- name: update all
yum:
name: '*'
state: latest
$ ansible dev,test,prod -a ‘rpm -qa php mariadb’
$ ansible dev -a ‘yum grouplist’
四、使用RHEL系统角色
安装 RHEL 系统角色软件包,并创建一个 playbook 名字为 /home/greg/ansible/timesync.yml
在所有受管主机中运行
使用 timesync 角色
配置角色使用的时间服务器是172.25.254.254
配置时间同步的方式是 iburst

解题方法:

$ sudo yum -y install rhel-system-roles.noarch
$ vim ansible.cfg
roles_path = /home/greg/ansible/roles:/usr/share/ansible/roles
$ ansible-galaxy list
$ cp /usr/share/doc/rhel-system-roles/timesync/example-timesync-playbook.yml /home/greg/ansible/timesync.yml
修改主机
$vim /home/greg/ansible/timesync.yml
---
- hosts: all
vars:
timesync_ntp_servers:
- hostname: 172.25.254.254
iburst: yes
relos:
- rhel-system-roles.timesync
修改服务器主机
$ ansible-playbook timesync.yml
查看是否同步
$ ansible all -a ‘timedatactl’
五、使用Ansible Galaxy安装角色
使用名为 requirements.yml 的文件下载并安装 Ansible Galaxy 角色到 /home/greg/ansible/roles 目录中,可以从下列URL下载:
http://materials/haproxy.tar 此角色的名称 balancer
http://materials/phpinfo.tar 此角色的名称 phpinfo

解题方法:

$ vim /home/greg/ansible/roles/requirements.yml
---
- src: http://materials/haproxy.tar
name: balancer
- src: http://materials/phpinfo.tar
name: phpinfo
$ ansible-galaxy install -r /home/greg/ansible/roles/requirements.yml
$ ansible-galaxy list
六、创建和使用角色
在/home/greg/ansible/roles 目录中创建名为 apache 的角色,要求:
安装 httpd 软件包,设为在系统启动时启用并启动
启用防火墙,开放 web 服务
模板文件index.html.j2,复制到/var/www/html/index.html,内容如下:
welcome to HOSTNAME on IPADDRESS
防火墙也需要自启动

解题方法:

$ cd /home/greg/ansible/roles
$ ansible-galaxy init apache
$ vim roles/apache/tasks/main.yml
---
- name: start service httpd
service:
name: httpd
state: started
enabled: yes
- name: start service firewalld
service:
name: firewalld
state: started
enabled: yes
- name: open firewalled port
firewalld:
service: http
permanent: yes
state: enabled
immediate: yes
- name: template a file 
template: 
src: index.html.j2 
dest: /var/www/html/index.html
$ vim roles/apache/templates/index.html.j2
welcome to {{ ansible_nodename }} on {{ ansible_default_ipv4.address }}
七、从Ansible Galaxy使用角色
根据下列要求,创建一个名为 /home/greg/ansible/roles.yml 的 playbook :
playbook 中包含一个 play,该 play 在 balancers 主机组中的主机上运行并将使用 balancer 角色。
此角色配置一项服务,以在 webservers 主机组中的主机之间平衡 Web 服务器请求的负载。
使用浏览器访问 balancers 主机组, 如 http://bastion.lab.example.com 可以看到如下输出:
welcome to serverb.lab.example.com on 172.25.250.11
重新刷新浏览器,可以看到如下输出:
welcome to serverc.lab.example.com on 172.25.250.12
这个 playbook 运行在 webservers 主机组上使用 phpinfo 的角色。
使用浏览器 URL:bastion.lab.example.com/hello.php 访问主机组 webservers 时,看到如下输出:
Hello PHPWorld from FQDN
其中,FQDN 是主机的完整域名。
比如,浏览器访问 URL:http://serverc.lab.example.com/hello.php 看到如下输出:
Hello PHP World from serverc.lab.example.com

解题方法:

$ vim /home/greg/ansible/roles.yml
---
- name: use apache and php
hosts: webservers
roles:
- role:phpinfo
- role:apache
- name: use role balancer
hosts: balancers
roles:
- role:balancer
$ ansible-playbook /home/greg/ansible/roles.yml
八、创建和使用逻辑卷
创建一个 playbook 名字叫/home/greg/ansible/lv.yml,对所有的节点操作:
创建一个逻辑卷要求如下:
LV 创建在 research 这个卷组里
LV 的名字叫 data
LV 的大小是 1500M
格式化成 ext4 文件系统
如果 LV 的大小不满足,产生报错信息:
Could not create logical volume of that size
,则创建分区大小变成 800M
如果卷组 research不存在,显示错误信息:
 Volume group done not exist
不要使用任何方式挂载逻辑卷

解题方法:

$ vim /home/greg/ansible/lv.yml
---
- name: create lv
hosts: all
tasks:
- block:
- name: create lv01 of 1500M
lvol:
vg: research
lv: data
size: 1500
- name: ext4 filesystem
filesystem:
fstype: ext4
dev: /dev/research/data
when: ansible_lvm.vgs.research is defined
rescue:
- debug:
msg: Could not create logical volume of that size
- name: create lv01 of 800M
lvol:
vg: research
lv: data
size: 800
when: ansible_lvm.vgs.research is defined
- debug:
msg: Volume group done not exist
when: ansible_lvm.vgs.research is not defined
$ ansible-playbook /home/greg/ansible/lv.yml
九、生成主机文件
下载 http://materials/hosts.j2 的初始化模板文件到/home/greg/ansible/ 目录
完成该模板,以便可以使用它以与/etc/hosts 相同的格式生成每个库存主机的文件
创建一个 playbook 名为/home/greg/ansible/hosts.yml,来使用模板为 dev 组中的主机生成/etc/myhosts 文件
完成时,/etc/myhosts 文件内容为:
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
172.25.250.9 node1.domain250.example.com servera
172.25.250.10 serverb.lab.example.com serverb
172.25.250.11 serverc.lab.example.com serverc
172.25.250.12 serverd.lab.example.com serverd
172.25.250.13 bastion.lab.example.com bastion
注意:生成的文件顺序不重要。

解题方法:

$ wget http://materials/hosts.j2
$ vim http://materials/hosts.j2
{% for host in groups['all'] %}
{{ hostvars[host]['ansible_facts']['default_ipv4']['address'] }} {{ hostvars[host]['ansible_facts']['nodename'] }} {{ hostvars[host]['ansible_facts']['hostname'] }}
{% endfor %}
$ vim /home/greg/ansible/hosts.yml
---
- name: create myhosts
hosts: all
tasks:
- name: template a file /etc/myhosts
template:
src: /home/greg/ansible/hosts.j2
dest: /etc/myhosts
when: inventory_hostname in groups.dev
$ ansible-playbook /home/greg/ansible/hosts.yml
十、修改文件内容
创建一个 playbook 名为/home/greg/ansible/issue.yml,修改/etc/issue 的内容,要求如下:
在 dev 主机组上,单行显示的内容是: Development
在 test 主机组上,单行显示的内容是: Test
在 prod 主机组上,单行显示的内容是:Production

解题方法:

$ vim /home/greg/ansible/issue.yml
---
- name: replace issue
hosts: all
tasks:
- name: replace Development
copy:
content: ’Development’
dest: /etc/issue
when: inventory_hostname in groups.dev
- name: replace Test
copy:
content: ‘Test’
dest: /etc/issue
when: inventory_hostname in groups.test
- name: replace Production
copy:
content: ‘Production’
dest: /etc/issue
when: inventory_hostname in groups.prod
$ ansible dev -a ‘cat /etc/issue’
十一、 创建Web内容目录
创建一个 playbook 名字叫/home/greg/ansible/webcontent.yml, 要求如下:
这个 playbook 运行在 dev 主机组
创建/webdev 目录,要求如下:
目录属于webdev 组
权限是 2775
软链接/var/www/html/webdev 到/webdev
在/webdev 中创建 index.html,内容为: Development
通过 node1.domain250.example.com/webdev/ 能访问到内容

解题方法:

$ vim webcontent.yml
---
- name: create web directory
hosts: dev
tasks:
- name: create directory webdev
file:
path: /webdev
state: directory
mode: '2775'
group: webdev
setype: httpd_sys_content_t
- name: create a symbolic link
file:
src: /webdev
dest: /var/www/html/webdev
state: link
- name: create web content
copy:
content: ‘Development’
dest: /webdev/index.html
setype: httpd_sys_content_t
- name: start service httpd
service:
name: httpd
state: started
enabled: yes
$ ls -ldZ /webdev
$ ls -ldZ /webdev/index.html
$ ls -ld /var/www/html/webdev
$ curl http://node1.domain250.example.com/webdev/
$ ansible-playbook /home/greg/ansible/webcontent.yml
十二、生成硬件报告
创建一个 playbook 名字叫/home/greg/ansible/hwreport.yml, 在所有的受管主机上创建/root/hwreport.txt, 
包含如下内容:
清单主机名称
以 MB 表示的总内存大小
BIOS 版本
磁盘设备 vda 的大小
磁盘设备 vdb 的大小
每行含有一个键值对
playbook 会下载 http://materials/hwreport.empty,并修改成为 /root/hwreport.txt
如果硬件不存在,则对应的值为:NONE

解题方法:

$ vim /home/greg/ansible/hwreport.yml
---
- name: hw report
hosts: all
tasks:
- name: Download
get_url:
url: "http://materials/hwreport.empty"
dest: /root/hwreport.txt
- name: Ensure 1
lineinfile:
path: /root/hwreport.txt
regexp: ‘^HOST=’
line: HOST={{ inventory_hostname }}
- name: Ensure 2
lineinfile:
path: /root/hwreport.txt
regexp: ‘^MEMORY=’
line: MEMORY={{ ansible_memtotal_mb }}
- name: Ensure 3
lineinfile:
path: /root/hwreport.txt
regexp: ‘^BIOS=’
line: BIOS={{ ansible_bios_version }}
- name: Ensure 4
lineinfile:
path: /root/hwreport.txt
regexp: ‘^DISK_SIZE_VDA=’
line: DISK_SIZE_VDA={{ ansible_devices.vda.size }}
- name: Ensure 5
lineinfile:
path: /root/hwreport.txt
regexp: ‘^ DISK_SIZE_VDB=’
line: DISK_SIZE_VDB={{ ansible_devices.vdb.size | default('NONE', true) }}
$ ansible-playbook /home/greg/ansible/hwreport.yml
$ ansible all -a ‘cat /root/hwreport.yml’
十三、创建密码库
库名称:/home/greg/ansible/locker.yml ,
其中包含两个变量:
pw_developer,值为Imadev
pw_manager,值为lmamgr
加解密密钥为: redhat
密钥保存在/home/greg/ansible/secret.txt

解题方法:

$ vim ansible.cfg
vault_password_file = /home/greg/ansible/secret.txt
$ ansible-vault create /home/greg/ansible/locker.yml
---
pw_developer: Imadev
pw_manager: lmamgr
$ ansible-vault view /home/greg/ansible/locker.yml
十四、创建用户账户
从http://materials/user_list.yml 下载要创建的⽤户的列表,并将它保存到/home/greg/ansible
在本次考试中使⽤在其他位置创建的密码库/home/greg/ansible/locker.yml 。创建名为/home/greg/ansible/users.yml 的playbook ,从⽽按以下所述创建⽤户帐户:
职位描述为developer 的⽤户应当:
在dev 和test 主机组中的受管节点上创建
从pw_developer 变量分配密码
是补充组devops 的成员
职位描述为manager 的⽤户应当:
在prod 主机组中的受管节点上创建
从pw_manager 变量分配密码
是补充组opsmgr 的成员
密码采⽤SHA512哈希格式。
您的 playbook 应能够在本次考试中使⽤在其他位置创建的库密码⽂件/home/greg/ansible/secret.txt 正常运⾏。

解题方法:

$ vim /home/greg/ansible/users.yml
---
- name: create user 1
hosts: dev,test
vars_files:
- /home/greg/ansible/locker.yml
- /home/greg/ansible/user_list.yml
tasks:
- name: Ensure group 
group:
name: devops
state: present
- name: Add the user
user:
name: "{{ item.name }}"
groups: devops
password: "{{ pw_developer | password_hash( 'sha512' ) }}"
append:yes
loop: "{{ users }}"
when: item.job == 'developer'

- name: create user 2
hosts: prod
vars_files:
- /home/greg/ansible/locker.yml
- /home/greg/ansible/user_list.yml
tasks:
- name: Ensure group 
group:
name: opsmgr
state: present
- name: Add the user
user:
name: "{{ item.name }}"
groups: opsmgr
password: "{{ pw_manager | password_hash( 'sha512' ) }}"
append:yes
loop: "{{ users }}"
when: item.job == ' manager '
$ ansible_playbook /home/greg/ansible/users.yml
十五、更新Ansible库的密钥
按照下方所述,更新现有 Ansible 库的密钥
从 http://materials/salaries.yml 下载 Ansible 库到 /home/greg/ansible
当前库的密码为: mysecret
新的库密码为: newsecret
库使用新密码保持加密状态

解题方法:

$ wget http://materials/salaries.yml
$ ansible-vault rekey salaries.yml
Vault password: 粘贴当前密码
New Vault password: 粘贴新密码
Confirm New Vault password: 粘贴新密码
$ ansible-vault view salaries.yml
新增:配置 cron 作业
创建一个名为 /home/greg/ansible/cron.yml 的 playbook ,
配置 cron 作业,该作业每隔 2 分钟运行并执行以下命令:
logger "EX294 in progress",以用户 natasha 身份运行
解题方法:

解题方法:

[greg@bastion  ansible]$ vim cron.yml 
---
- name: 配置 cron 作业
	hosts: all
	tasks:
          - name: one
          	user:
                  name: natasha
                  state: present
          - name: two
          	cron:
                  name: "logger info"
                  minute: "*/2"
                  user: natasha
                  job: logger "EX294 in progress"
  • 24
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 18
    评论
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Carlos Zhang

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值