CocKpit驾驶舱
于SSH类似,用于远程控制,类似于阿里云的控制台。为初级管理员提供基本操作,通过web端的控制台,访问地址:服务器IP:9090
yum包安装并开启服务:
yum -y install cockpit cockpit-dashboard cockpit-machines
systemctl enable cockpit.socket --now
Web浏览器访问 https://虚拟机的IP地址:9090:
本机访问虚拟机的cockpit:
本机的虚拟机网卡的ip要和虚拟机的网卡ip设置为同一个网段的才可以访问。
配置网卡
RHEL7/8的系统管理器init(systemd)
- 配置单元(unit):
service(服务)、target(启动级别)
关于网络服务设置:network --> NetworkManager(RHEL8已经没有network服务)
+临时设置:命令工具:
hostname、hostname 新主机名
ifconfig [-a]、ifconfig 连接名 IP地址/掩码长度
route -n、route add|del default gw 默认网关地址
host 查询对象 [DNS服务器地址]
固定/永久设置:改配置文件、重载服务
/etc/hostname
/etc/sysconfig/network-scripts/ifcfg-连接名
hostnamectl set-hostname 新主机名
辅助配置工具: nmcli(命令行)、nmtui(文本用户界面)、nm-connection-editor(图形)
接口名
:内核识别的网卡设备的物理名称连接名
:网卡所使用的这一份网络配置的逻辑名称
nmcli基本用法:
nmcli device status
nmcli connection show
nmcli connection show "连接名"
nmcli connection modify "连接名" ipv4.method man ipv4.addresses "IP地址/掩码"
nmcli connection modify "连接名" ipv4.gateway 默认网关地址
nmcli connection modify "连接名" ipv4.dns DNS服务器地址
nmcli connection modify "连接名" connection.autoconnect yes
nmcli connection up "连接名"
nmcli connection down "连接名"
nmcli connection add con-name "连接名" ifname 接口名 type ethernet
nmcli connection del "连接名
[root@server1 ~]$ ifconfig #查看ip地址
[root@server1 ~]$ nmtui #文本方式配置ip地址为ens33网卡配置ip,如果找不到ens33网卡,可按以下方式添加
[root@server1 ~]$ nmcli connection add con-name ens33 ifname ens33 type ethernet #添加ens33网卡
[root@server1 ~]$ nmtui #然后再使用该命令配置ip,
vmnet的虚拟网络编辑器添加虚拟网卡,用来让真机和虚拟机互联,虚拟网卡构建
[root@server1 ~]# nm
nm nm-connection-editor nmtui nmtui-edit
nmcli nm-online nmtui-connect nmtui-hostname
[root@server1 ~]# nmtui
[root@server1 ~]#
配置网卡分三步,配置ip。网关,激活网卡,修改域名
修改获取方式为手动,Manual, 配置IP/掩码、网关、DNS、demo: 192.168.1.8/24、192.168.1.254、192.168.1.254
激活
或者使用命令行的方式配置
nmcli connection modify enp1s0 ipv4.method manual ipv4.addresses 172.25.0.25/24 命令行修改ip
nmcli connection up enp1s0 命令行激活网卡
显示所有包括不活动连接:nmcli con show
显示所有活动连接: nmcli con show –active
显示网络连接配置:nmcli con show "System eth0“
显示设备状态:nmcli dev status
显示网络接口属性:nmcli dev show eno16777736
linux常见目录
图形环境,通过 Activities -> Files -> Other Locations -> Computer
- 命令行环境,ls /
Linux目录的层次分隔:斜杠 / - 最顶层 就是 一个 / ,表示根目录
名称 | 描述 |
---|---|
bin、sbin | 存放可执行文件 |
home | 存放普通用户的家目录 |
dev | 存放硬件设备 |
mnt | 可挂载外部设备 |
media | 自动识别并挂载的目录 |
proc | 内存数据的映射,临时数据,不占硬盘空间 |
tmp | 存放临时文件的目录 |
var | 存放经常变化的数据 ,比如日志、邮件 |
boot | 存放内核文件 |
etc | 存放配置文件 |
opt | 可以存放第三方文件 |
usr | 存放用户相关数据 |
命令行的基本格式:
命令名字 [-选项…] [参数…]
- 选项的作用,控制命令的执行方式、效果
- 参数的作用,为命令提供操作对象
基本命令
命令行常用的快捷键
CTRL-A
将光标移到行首(在命令行下)CTRL-E
将光标移动到行尾(在命令行下)CTRL-U
擦除从光标位置开始到行首的所有字符内容。在某些设置下,CTRL-U会不以光标位置为参考而删除整行的输入。CTRL+ K
·: 从光标处向后删除指令串CTRL-J
新行(换行[line feed]并到行首)。在脚本中,也可能表示为八进制形式(‘/012′)或十六进制形式(‘/x0a’)。CTRL-B
退格 (非破坏性的),这个只是将光标位置往回移动一个位置。CTRL-H
擦除(Rubout)(破坏性的退格)。在光标往回移动的时候,同时擦除光标前的一个字符。CTRL-C
中断,终结一个前台作业。CTRL-D
“EOF” (文件结尾:end of file)。它用于表示标准输入(stdin)的结束。在控制台或xterm 窗口输入文本时,CTRL-D 删除在光标下的字符。从一个shell中退出 (类似于exit)。如果没有字符存在,CTRL-D 则会登出该会话。在一个xterm窗口中,则会产生关闭此窗口的效果。- CTRL-F 将光标向前移动一个字符(在命令行下)
- CTRL-G BEL。在一些老式打印机终端上,这会引发一个响铃。在xterm终端上可能是哔的一声。
- CTRL-I 水平制表符。
CTRL-O
产生一个新行(在命令行下)。
+CTRL-P
从history缓冲区召回上一次的命令(在命令行下)。此快捷键召回的顺序是由近及远的召回,即按一次,召回的是前一次的命令,再按一次,是召回上一次之前的命令,这和CTRL-N都是以当前的输入为起点,但是两个命令操作刚好相反,CTRL-N是从起点开始由远及近(如果起点是历史命令的话)。
+CTRL-Q
Resume (XON)。恢复/解冻,这个命令是恢复终端的stdin用的,可参见CTRL-S。- CTRL-R 回溯搜索(Backwards search)history缓冲区内的文本(在命令行下)。注意:按下之后,提示符会变成(reverse-i-search)”:输入的搜索内容出现在单引号内,同时冒号后面出现最近最匹配的历史命令。
CTRL-S
Suspend(XOFF),挂起。这个是冻结终端的stdin。要恢复可以按CTRL-Q。- CTRL-T 交换光标位置与光标的前一个位置的字符内容(在命令行下)。比如:echo $var;,假设光标在a上,那么,按下C-T之后,v和a将会交换位置:echo $avr;。
- CTRL-V 在输入文本的时候,按下C-V之后,可以插入控制字符。比如:echo -e '/x0a’;和echo ;这两种效果一样。这点功能在文本编辑器内非常有效。
- CTRL-W 当在控制台或一个xterm窗口敲入文本时, CTRL-W 会删除从在光标处往后(回)的第一个空白符之间的内容。在某些设置里,
- CTRL-W 删除光标往后(回)到第一个非文字和数字之间的字符。
- CTRL-X 在某些文字处理程序中,这个控制字符将会剪切高亮的文本并且将它复制到剪贴板中。
CTRL-Y
将之前已经清除的文本粘贴回来(主要针对CTRL-U或CTRL-W)。CTRL-Z
暂停一个前台的作业;在某些文本处理程序中也作为替换操作;在MSDOS文件系统中作为EOF(End-of-file)字符。
ctrl+l | 清屏 |
ctrl+c | 终止任务 |
tab键 | 补全命令 (如果不好用,要装bash-completion软件包) |
esc+. | 调用上个指令的最后一个参数,使用alt+.可以实现相同效果 |
ls -l | 查看文件详细信息 |
ls -lh | 详细信息+易读容量单位 |
ls -ld /opt | 查看opt目录本身的详细信息 |
ls -A | 查看隐藏文件 |
pwd | 看当前所在位置 |
cd /opt | 切换到/opt目录 |
mkdir a | 创建a目录 |
mkdir -p e/e | 创建多级目录 |
touch x | 创建普通文件,名字叫x |
cat x | 查看x文件里面的内容 |
cat /etc/hosts | 查看ip域名对应关系 |
less /etc/passwd | 查看长篇文档,可以使用键盘方向键手动翻页,而不是像cat命令直接看到最后一页 |
su - test | 切换到名为test的账户,管理员切换到其他账户无需密码,但是普通账户切换到其他账户需要密码 |
rm a | 删除a文件 |
rm -r a | 如果a是个目录,需要加r选项 |
rm -rf a | 强制删除无提示 |
rm -rf * | 删除当前目录下所有文件,高风险命令,慎用!! |
cp /etc/passwd /opt | 拷贝etc下的passwd文件,到根目录下opt,常用选项 -r,recursive,复制多级目录的时候需要加 |
mv passwd /root | 移动passwd文件到管理员的家目录 |
mv passwd abc | 为passwd文件改名为abc |
获取命令的帮助man
- 执行 man 命令名 来获取这个命令的使用帮助
- 重点看
SYNOPSIS(语法格式)
、DESCRIPTION(选项的含义和用法描述)
- 按
/word
查找包含word的文字描述,按n或N
来切换不同查找结果 - 按
PgUp、PgDn
翻页,按q键退出
文本编辑器
vi / vim
三种工作模式:
- 1,命令模式 刚进入编辑器时,可以查看文档内容,可以进行复制yy、粘贴p操作、剪切dd(可以当删除使用),u可以撤销上一次操作
- 2,输入模式 在命令模式按i 键 ,再按esc可以返回命令模式
- 3,末行模式 在命令模式输入:
yum -y install vim-enhanced 可以安装增强版的vim编辑器
客户端配置文件:/etc/yum.conf、/etc/yum.repos.d/*.repo
配置软件仓库
用途:软件仓库/YUM源为其他客户机集中提供软件包及关联信息 ,RHEL8光盘预设源:BaseOS、AppStream
[仓库1标识]
name = 仓库描述
baseurl = 仓库的地址
enabled = 1|0
gpgcheck = 1|0
#gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-redhat-release
[仓库2标识]
cd /etc/yum.repos.d/
vi abc.repo
[BaseOS] 仓库名称
name=BaseOS 仓库描述
baseurl=http://server1.net0.example.com/rhel8/BaseOS 仓库软件来源
enabled=1 仓库是否开启 ,1是开启0是关闭,默认不写这行也行,不写就是开启
gpgcheck=0 检测软件合法性,通常是0无需检测
[AppStream]
name=AppStream
baseurl=http://server1.net0.example.com/rhel8/AppStream
enabled=1
gpgcheck=0
常见的软件包安装:
# yum -y install bash-completion net-tools vim-enhanced bind-utils
阿里云 yum文件
yum repolist 查询仓库
yum -y install vim 利用仓库安装vim软件
yum -y install bash-completion 安装支持tab键的软件,安装完后需要退出,再登陆
yum provides ifconfig 查询ifconfig命令来自于哪个软件包
yum -y install net-tools 安装支持ifconfig等命令的软件包
#yum配置好之后使用yum或者dnf命令都可以调用仓
yum clean all 清除软件仓库缓存
yum repolist 查询软件仓库信息
yum -y install vsftpd 安装软件包(vsftpd服务)
yum -y remove vsftpd 删除软件包
yum provides ifconfig 查询ifconfig命令来自哪个软件包
yum search 关键词 //根据关键词搜索相关的软件
yum -y update 软件名.. .. //升级软件包
-
systemctl服务控制:
- systemctl,系统控制器,用来管理Linux系统的开机/关机/服务资源运行状态
直接执行 systemctl
列出可以管理的系统资源,包括各种系统服务- 控制服务
当前运行状态
:systemctl start|stop|restart|status 服务名.. ..
- 控制服务
开机自启
状态:systemctl enable|disable 服务名.. .. [--now]
-
firewalld、SELinux安全开关:
-
防火墙的作用,
内核的一套网络保护机制,通过firewalld服务来控制
-
如何停止防火墙:
systemctl disable firewalld --now
-
SELinux的作用,
内核的一套系统保护机制
,通过内核启动参数或者启动配置来控制 -
如何关闭SELinux机制
(三种状态 —— Enforcing强制保护、Permissive宽松模式、Disabled禁用
-
# vi /etc/selinux/config
SELINUX=Permissive ==》重启后生效
# setenforce 0|1 ==》立即变成宽松|强制模式
# getenforce ==》查看结果
服务管理:
systemctl start vsftpd 开启服务
systemctl stop vsftpd 关闭服务
systemctl restart httpd 重启服务
systemctl status vsftpd 查服务详细状态,可以看到服务是否开启等信息
systemctl is-active vsftpd 查服务精简状态,仅仅看是否开启
systemctl is-enabled vsftpd 查看服务是否开机自启
systemctl enable vsftpd 设置服务开机自启
systemctl disable firewalld --now 取消服务的开机自启,并关闭服务
systemctl enable firewalld --now 设置开机自启,并且开启服务
忘记服务名字查看
[root@liruilong tmp]# systemctl list-unit-files | grep ^fire*
firewalld.service disabled
[root@liruilong tmp]#
防火墙 :
systemctl stop firewalld 关闭
systemctl disable firewalld 取消开机自启
selinux :
美国NSA国家安全局提供的一套基于内核的增强的强制安全保护机制,主要针对用户、进程、文档做了一些安全标签及相关限制。
getenforce 查selinux是否开启,可以看到下列3种状态
Enforcing是开启状态 ,Permissive是关闭(宽松),disabled是永久关闭
setenforce 1 临时设置selinux,1是开启,0是关闭
- 安全策略谁来提供:NSA、RedHat
- 查看文件、进程的安全上下文:
- ls -Z … …
- ps -Z … …
vim /etc/selinux/config 此配置文件决定了服务器重启后,selinux处于什么状态,永久设置
可设置项目:
- 1,设置布尔值(对某些软件工具提前预设的开关)
getsebool -a 查看布尔值
setsebool -P ftpd_anon_write=on 修改某服务对应的布尔值开关on是开启,off是关闭
- 2,设置安全的上下文
ls -Z abc.html 查看某文件上下文值
chcon -t admin_home_t abc.html 修改文件上下文值,-t是指定文件的归属
restorecon abc.html 根据服务的预设值自定定义abc文件的上下文值
- 3,设置端口
yum -y install setroubleshoot-server selinux排错工具包
semanage port -l 查询
semanage port -l | grep http 过滤查询,只看http相关内容
semanage port -a -t http_port_t -p tcp 82 在selinux管理的服务端口中,为http添加82端口
-a 是添加,如果是-d 就是删除
-t 指定某服务类型
-p 是定义协议和要添加的端口
账户管理:
useradd abc 添加账户
userdel -r xyz01 删除用户,-r是删除与用户有关的文件
echo xxxxx | passwd --stdin abc 为abc账户非交互式配置密码 xxxxx
id abcd 查看用户基本信息 uid是用户id号码 gid是用户所在基本组的号码 groups是用户附加组信息
---------------------------
tail -1 /etc/passwd 查看系统刚刚创建的用户信息
grep abc: /etc/passwd 查看系统种名字包含abc字符串的用户信息
usermod -u 1600 xyz02 为已经创建好的xyz02账户修改id号
usermod -d /opt xyz03 修改xyz03的家目录为/opt
gpasswd -a xyz03 xyz02 为xyz03添加一个附加组(附属组)xyz02
gpasswd -d xyz03 xyz02 为xyz03从附加组xyz02中删除
usermod -s /sbin/nologin abcd 修改abcd账户的解释器为不可交互的状态
groupadd admins 创建组admins
useradd -G admins zhsan 创建账户zhsan的同时添加附加组admins组
su - zhsan 切换账户
--------------------------------
定义计划任务:
crontab -e 为当前账户添加计划任务
crontab -e -u lisi 指定lisi账户添加计划任务
* * * * * date >> /opt/test 每分钟执行date任务
5-15 * * * * date >> /opt/test 每小时的5-15分钟
10,13,17 * * * * date >> /opt/test 每小时的10,13,17分钟执行
*/5 * * * * date >> /opt/test 每隔3分支执行一次
10-15/2 * * * * date >> /opt/test 每小时的10-15分钟里,每隔2分钟执行一次
crontab -r 删除计划任务
systemctl is-enabled crond.service 检测计划任务服务是否开机自启
设置基本权限:
基本权限 r 读 w写 x执行(目录是进入权限)
chmod o+w abcd 为abcd文件的其他人添加写权限
chmod u-x abcd 为abcd文件的所属主删除x权限
chmod g+x abcd 为abcd文件的所属组 添加x权限
所属主 所属组 其他人
u g o
------------------
数字方式定义文件权限
r=4 w=2 x=1
chmod 777 abcd 将abcd文件的所属主 所属组 其他人 的权限都设置成拥有rwx
chmod 700 abcd 将abcd文件的所属主设置成拥有rwx权限 而所属组与其他人没有任何权限
-----------------------
修改所属
chown lisi test 只修改所属用户
chown :lisi test 只修改所属组
chown abcd:abcd test 修改用户:组
chown -R lisi abc 递归修改abc目录以及目录中所有文件的所属主为lisi -R表示递归,对chmod命令也适用
--------------------
acl 访问控制列表
setfacl -m user:zhsan:rw /var/tmp/hosts 给zhsan用户单独针对hots文件的rw权限
setfacl -m group:zhsan:rw /var/tmp/hosts 给zhsan组单独针对hots文件的rw权限
setfacl -b /var/tmp/hosts 清除acl权限
getfacl /var/tmp/hosts 查看acl权限
特殊权限,创建共用目录
附加权限:
- 4 set uid:附加到 “属主” 的x位上,变成 s
使普通的程序具有特殊属性(任何人在执行这个程序的时候,自动拥有这个程序的所有者的权限) - 2 set gid:附加到 “属组” 的x位上,变成 s
使普通的程序具有特殊属性(任何人在执行这个程序的时候,自动拥有这个程序的所属组的权限)
使普通的目录的属组权限能够自动往下继承(在目录下新建的文档自动属于这个目录的属组) - 1 粘滞位:附加到 “其他人” 的x位上,变成 t
使用户在拥有w权限的目录下不能够删除其他人的文件
附加权限设置示例:
+ chmod u+s 文件… … //比如:/usr/bin/passwd
+ chmod g+s 文件… …
+ chmod o+t 文件… … //比如:/tmp
+ chmod 4755 文件… …
+ chmod 1777 目录… …
+ chmod 2770 目录… …
set uid 可以使某用户在执行拥有此权限的文件时自动拥有此文件所属主的权限
set gid 可以使某用户在执行此文件时,自动拥有此文件的所属组权限,如果是目录拥有此权限,表示在该目录下创建的文件自动属于此目录的属组
粘滞位(t权限) 在一个拥有w权限的目录中,使用户之间不可以任意删除别人的文件
配置时间同步
NTP,Network Time Protocol,时间同步:将计算机与指定服务器的时间保持一致
- NTP服务端(考试服务器):
ntpd或chronyd
- NTP客户端:
软件包chrony(系统服务chronyd)
- 客户端配置文件:
/etc/chrony.conf
- pool 时间服务器的域名 iburst //适合一个域名解析为多个IP地址的情况(服务器池)
- server 时间服务器的域名 iburst //适合一个域名解析为单个服务器IP地址的情况
iburst 参数的作用:
+ 1)第一次同步时,头4个包的间隔为2秒,以便能更快的获得标准时间。
+ 2)如果在一个标准轮询间隔内没有应答,会向NTP服务器再发送8个包(而不是通常的一个)。
+ 3)如果NTP 服务器仍没有给出可识别的应答,那么本机的时间将不会变化。
NTP验证/设置工具:
timedatectl //查看时间日期状态信息
chronyc sources -v//检查当前使用的NTP源信息
手动设置系统日期、时间:
date -s 'HH:MM'
date -s 'HH:MM:SS'
date -s 'yyyy-mm-dd'
date -s 'yyyy-mm-dd HH:MM'
补充:
- 根据BIOS时间设置系统时间: hwclock -s
- 根据系统时间设置BIOS时间:hwclock -w
systemctl status chronyd 查看同步服务状态,通常都是开启状态
vim /etc/chrony.conf 修改配置文件
server server1.net0.example.com iburst 将有iburst字样那行注释掉,从新添加此内容
systemctl restart chronyd 重启服务
chronyc sources -v 检查结果 带^*表示同步时间成功
date -s 20:20:00 随意修改时间后,在重启服务器检测是否同步
远程复制:
配置autofs自动挂载,
在网络资源使用时自动挂载,不使用时自动卸载,达到节约资源的目的。
- 本地文件系统:文档存放在本机连接的磁盘上
EXT4、XFS、SWAP,FAT32
- 网络文件系统:文档存放在网络中的一台服务器上,通过共享方式提供(比如NFS)
NFS,Network File System
mount挂载(本地):
mount /dev/cdrom /mnt/dvd
mount /dev/sda1 /mnt/tdir
NFS客户端 ——查看共享资源列表:
- showmount -e 目标主机 //需要软件包 nfs-utils
挂载NFS共享资源:
+ mount 服务器地址:共享文件夹路径 /mnt/tdir
文件系统的挂载方式
-
1)手动挂载:
mount 设备路径 挂载点目录
-
2)开机自动挂载:
修改 /etc/fstab 配置文件
设备路径 挂载点目录 文件系统类型 defaults,_netdev 0 0
-
3)半自动挂载(已经配置好/etc/fstab):
- mount 设备路径
- mount 挂载点目录
-
4)触发挂载(按需自动挂载):
autofs服务
-
软件包/系统服务:
autofs nfs-utils
-
主配置:
/etc/auto.master
目标文件夹监控策略配置文件
-
监控策略配置:
/etc/*
子目录名 -挂载选项:设备路径
子目录名 -挂载选项NFS服务器地址:共享目录绝对路径
通过部署autofs服务,可以代替管理员按需、自动完成以下任务:
- 1)当有用户需要使用 /rhome/ 目录下的 ldapuser0 子目录时,提前创建此目录,并将服务器上的 classroom.example.com:/rhome/ldapuser0 挂载到本机的 /rhome/ldapuser0
- 2)当用户不再使用 /rhome/ 目录下的 ldapuser0 子目录时,自动卸载此目录上已挂载的资源,并删除此目录
本地账号:存放在本机的/etc/passwd、/etc/shadow,家目录一般位于 /home/用户名
网络账号:存放在网络(AD域、LDAP域)中的认证服务器上,家目录也存在认证服务器上
showmount -e server1
yum -y install autofs nfs-utils 安装所需软件包
vim /etc/auto.master 修改主配置文件
/rhome /etc/rhome.rule 在第一行添加,/rhome是在本地什么位置作为远程资源的挂载目录,/etc/rhome.rule是远程资源配置文件所在路径,可以自定义
vim /etc/rhome.rule 修改上一步定义的远程资源配置文件,添加以下内容:
ldapuser0 -fstype=nfs 172.25.0.254:/rhome/ldapuser0 定义账户、文件系统类型、远程资源路径
systemctl restart autofs 重启服务
ls /rhome 查看原本没有的/rhome目录,发现已经自动生成
ls rhome/ldapuser0 再查看里面的内容,报权限错误 ,正常,已经激活自动挂载
ls /rhome 再次查看目录,已经看到远程资源,成功
find搜索
按照条件查找系统当中的任何文件:
find [目录范围] [查找条件1] -o [查找条件2] .. ..
find [目录范围] [查找条件1] -a [查找条件2] .. ..
常见的查找条件表示:
- -name 文档名称
- -type 文档类型 【f、d、l、b、c】
- -size +|-文档大小
- -mtime +|-修改时间 【1 之前24小时~48小时】
- -user 所属用户
- -group 所属组
处理find查找结果:
- -exec 命令行(嵌入 {} 替代查找结果) ;
修改文件的时间戳:
touch -d '2015-12-31 12:30' f2.txt
demo
可以按条件查找文件
-type 按文件类型搜索
f 普通文件 d 目录 l 连接文件 b 块设备
find /opt -type f //在/opt下查找所有普通文件
-name 按名称搜索
find /opt -name abc //在/opt下查找名字叫abc的文件
-size + - 按文件大小搜索
find / -size +50M //在根目录下找大于50M的文件
-user 按用户名搜索
find . -user root //再当前目录找所属主是root的文件
----------------------------------
-o 或者 -a 并且 可以实现多个条件的逻辑组合
find . -type f -a -name abc // 找当前目录下的普通文件并且名字叫abc,此处的-a也也可省略不写
find . -type f -o -name abc //找当前目录下的普通文件或者名字叫abc的文件
----------------------------------
#找出/etc/目录下大小超过 5MB 的文件,并将其副本放入/root/findfiles 目录。
find /etc -size +5M -exec cp -p {
} /root/findfiles \;
-exec代表有继续执行的指令 cp 是拷贝 -p保持原文件属性权限,{
}是find搜索到的文件 \;是结束
grep查找字符串
可以找到文档中的字符串,并且以行为单位输出.
grep基本用法:
- grep ‘关键词’ 文件… …
- grep ‘正则表达式’ 文件… …
常见的选项:
- -v:将条件取反
- –color:突出显示结果
- -w:单词匹配
- -c:统计匹配行数
简单正则表达式:
- ^word:查找以word开头
- word$:查找以word结尾
- ^$:查找空行
- -E:支持使用扩展正则表达式(egrep)
grep "abc" abc //在abc文档中找有abc字符串的行
grep "ab" abc //在abc文档中找有ab字符串的行
grep "^ab" abc //在abc文档中找以ab字符串开头的行
grep "ab$" abc //在abc文档中找以ab字符串结尾的行
找到的内容还可以利用重定向保存到文件中
> 覆盖重定向 >> 追加重定向
echo 123 > xyz.txt //喊出123 覆盖保存在文件xyz.txt中,如果xyz.txt中之前有内容,将会被覆盖
echo 123 >> xyz.txt //喊出123 追加保存在文件xyz.txt中,不会覆盖原有内容
grep "sbin" /etc/man_db.conf > /root/out.txt //使用grep在man_db.conf 文件中搜索到的包含sbin的行都保存到 out.txt文件中
tar归档
将多个文件合成一个文件,方便保存和管理 ,还可以配合gzip、bzip2 、xz三种压缩工具进行压缩
-c 创建 -f指定文件名 -x 释放
-P 保存原始路径
-z 使用gzip方式在归档时压缩,扩展名可以写.gz
-j 使用bzip2 方式在归档时压缩,扩展名可以写.bz2
-J 使用xz 方式在归档时压缩,扩展名可以写.xz
- 归档:把很多文件归纳到一起 tar
- 压缩:减小文件占用空间的大小 gzip、bzip2、xz
tar命令的选项:
-c:创建新文档
-x:释放备份文档
-f:指定文档名称
-z:处理 .gz 格式
-j:处理 .bz2 格式
-J:处理 .xz 格式
-t:显示文档列表
-p:保持原有权限
-P:保持绝对路径
-C:指定释放备份文件时的目标位置
–exclude=排除的子目录
tar 制作备份文件:
- tar -zcf 备份文件名.tar.gz 被备份的文档…
- tar -jcf 备份文件名.tar.bz2 被备份的文档…
- tar -Jcf 备份文件名.tar.xz 被备份的文档…
tar 从备份文件恢复:
tar -xf 备份文件名 [-C 目标文件夹]
tar 查看备份文件内容:
tar -tf 备份文件名
yum -y install tar //安装tar工具
yum -y install bzip2 //安装压缩工具
tar -czPf test.tar.gz /var/log //将/var/log打包压缩成test.tar.gz,使用的压缩方式是gzip
tar -cjPf test.tar.bz2 /var/log
tar -cJPf test.tar.xz /var/log
破解密码
//重启 系统,按 e 键打断启动过程
//修改 linux 行(ro 改 rw,末尾添加 rd.break)然后按 ctrl+x 启动
按ctrl+x //以无需密码的方式启动系统
chroot /sysroot/ //切换到根系统
echo redhat | passwd --stdin root //改密码
touch /.autorelabel //重置selinux标记
exit
reboot //重启
yum -y install vim net-tools bash-completion //在blue主机安装常用软件包
磁盘的使用
lsblk //查看分区状态
fdisk /dev/vdc //使用fdisk分区工具,对/dev/vdc硬盘进行分区
p 查询分区状态
q 不保存退出
n 新建分区
Select (default p): //回车,默认是主分区
Partition number (1-4, default 1): //第一个分区默认序号是1
First sector : //起始扇区,直接回车
Last sector +500M //创建500M分区
w //保存退出
mkfs.xfs /dev/vdc1 //使用xfs文件系统为vdc1这个分区格式化
mount /dev/vdc1 /mnt //将新分区挂载到/mnt目录
df -h
umount /dev/vdc1 //卸载分区
调整逻辑卷大小
在计算机上使用磁盘空间的过程:
识别磁盘 --> 分区 --> 格式化 --> 挂载 --> 访问挂载点
lsblk --> fdisk -l --> fdisk(MSDOS分区表)/gdisk(GPT分区表 >2.2TB磁盘)/parted --> mkfs相关 --> mount --> ls、vim
磁盘分区操作 ——
fdisk -l
fdisk /dev/vdb
parted /dev/vdb
分区模式msdos:四个主分区、扩展分区、逻辑分区
分区模式gpt(支持>2T空间):主分区(操作系统支持一般<128个)
刷新硬盘分区表:
partprobe /dev/vdb 或者 partx -a /dev/vdb
reboot
格式化操作:
- mkfs.ext3 分区设备
- mkfs.ext4 分区设备
- mkfs.xfs 分区设备
- mkfs.vfat 分区设备
逻辑卷管理
LVM逻辑卷
管理机制 —— 化零(物理卷PV)为整(卷组VG)、动态扩容伸缩,按需(逻辑卷LV)分配
把零散的分区(PV物理设备(物理卷)) ===》整编的大卷组(VG虚拟磁盘) ===》 根据需要获取空间(虚拟分区LV)
游击队 ===》 八路军 ===》按需增编/简编人员
识别磁盘 --> 分区 --> 卷组 --> 逻辑卷 --> 格式化 --> 挂载 --> 访问挂载点
实现方式:
分区/物理卷(2G、4G、6G)
-->卷组(12G)
--> 逻辑卷(10G、1G)
LVM管理工具
- 物理卷操作(不常用):pvscan、pvdisplay、pvcreate
- 卷组操作:vgscan(扫描)、vgdisplay(显示)、vgcreate、vgremove、vgextend(扩容)
- 逻辑卷操作:lvscan、lvdisplay、lvcreate、lvremove、lvextend
PE
:分配逻辑卷空间的时候,最小的单位,默认为4M
创建卷组:
vgcreate [-s PE大小] 卷组名 分区.. ..
创建逻辑卷:
lvcreate -L 大小 -n 名称 卷组名
lvcreate -l PE个数 -n 名称 卷组名
扩展逻辑卷:
lvextend -L +大小 /dev/卷组名/逻辑卷名
扩展卷组:
vgextend 卷组名 分区.. ..
通知内核新的文件系统大小:
resize2fs /dev/卷组名/逻辑卷名 //适用于EXT2/3/4文件系统(blkid检查)
xfs_growfs 逻辑卷名的挂载点//适用于XFS文件系统(blkid检查)
逻辑卷的设备位置:
/dev/卷组名/逻辑卷名
或者
/dev/mapper/卷组名-逻辑卷名
[root@blue ~]# vgscan
Reading all physical volumes. This may take a while...
Found volume group "myvg" using metadata type lvm2
Found volume group "test" using metadata type lvm2
Found volume group "rhel" using metadata type lvm2
[root@blue ~]# pvscan
PV /dev/vdb2 VG myvg lvm2 [1008.00 MiB / 208.00 MiB free]
PV /dev/vdb1 VG test lvm2 [<2.00 GiB / <1.67 GiB free]
PV /dev/vda2 VG rhel lvm2 [<29.00 GiB / 0 free]
Total: 3 [<31.98 GiB] / in use: 3 [<31.98 GiB] / in no VG: 0 [0 ]
[root@blue ~]# lvscan
ACTIVE '/dev/myvg/mylv' [800.00 MiB] inherit
ACTIVE '/dev/test/vo' [336.00 MiB] inherit
ACTIVE '/dev/rhel/swap' [<2.17 GiB] inherit
ACTIVE '/dev/rhel/root' [<26.83 GiB] inherit
[root@blue ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 30G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 29G 0 part
├─rhel-root 253:0 0 26.8G 0 lvm /
└─rhel-swap 253:1 0 2.2G 0 lvm [SWAP]
vdb 252:16 0 10G 0 disk
├─vdb1 252:17 0 2G 0 part
│ └─test-vo 253:2 0 336M 0 lvm /vo
└─vdb2 252:18 0 1G 0 part
└─myvg-mylv 253:3 0 800M 0 lvm
vdc 252:32 0 10G 0 disk
└─vdc1 252:33 0 500M 0 part /mnt
[root@blue ~]#
创建卷组
逻辑卷 化零为整 更自由的使用磁盘空间 创建逻辑卷之前先要创建卷组
,然后从卷组中划分空间给逻辑卷
vgcreate /dev/myvg /dev/vdb2 //正常创建卷组,默认扩展单元是4M(不满足目前题意,目前要求是16M)
vgdisplay /dev/myvg //可以在PE一栏中看到扩张单元的大小
vgremove /dev/myvg //删除卷组myvg
vgcreate -s 16MiB /dev/myvg /dev/vdb2 //创建扩展单元为16MiB的卷组(目前练习题要求),之后可以用vgdisplay查看PE的大小
创建逻辑卷
lvcreate -n mylv -L 800M /dev/myvg //正常创建
lvcreate -n mylv -l 50 /dev/myvg //按照扩展单元的数量创建(目前练习题要求),之后可以用vgs查看
vgs // 查看邏輯卷
- 创建逻辑卷
根据以下要求,创建新的逻辑卷:
1) 逻辑卷的名字为mylv,属于myvg卷组,大小为50个扩展单元
2) 卷组myvg中的逻辑卷的扩展块大小应当为16MiB
3) 使用vfat文件系统将逻辑卷mylv格式化
4) 此逻辑卷应当在系统启动时自动挂载到/mnt/mydata目录下
[root@blue ~]# 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.
Command (m for help): n
Partition type
p primary (2 primary, 0 extended, 2 free)
e extended (container for logical partitions)
Select (default p):
Using default response p.
Partition number (3,4, default 3):
First sector (2074624-20971519, default 2074624):
Last sector, +sectors or +size{
K,M,G,T,P} (2074624-20971519, default 20971519): +1000M
Created a new partition 3 of type 'Linux' and of size 1000 MiB.
Command (m for help): w
The partition table has been altered.
Syncing disks.
[root@blue ~]# part
parted partprobe partx
[root@blue ~]# partprobe /dev/vdb
[root@blue ~]# vgcreate -s 16MiB myvg /dev/vdb3
Physical volume "/dev/vdb3" successfully created.
Volume group "myvg" successfully created
[root@blue ~]# lvcreate -l 50 -n mylv myvg
Logical volume "mylv" created.
[root@blue ~]# lvscan
ACTIVE '/dev/myvg/mylv' [800.00 MiB] inherit
ACTIVE '/dev/test/vo' [300.00 MiB] inherit
ACTIVE '/dev/rhel/swap' [2.16 GiB] inherit
ACTIVE '/dev/rhel/root' [<46.84 GiB] inherit
[root@blue ~]# vgscan
Found volume group "myvg" using metadata type lvm2
Found volume group "test" using metadata type lvm2
Found volume group "rhel" using metadata type lvm2
[root@blue ~]# lsblik
-bash: lsblik: command not found
[root@blue ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 50G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 49G 0 part
├─rhel-root 253:0 0 46.9G 0 lvm /
└─rhel-swap 253:1 0 2.2G 0 lvm [SWAP]
vdb 252:16 0 10G 0 disk
├─vdb1 252:17 0 500M 0 part
│ └─test-vo 253:2 0 300M 0 lvm /vo
├─vdb2 252:18 0 512M 0 part [SWAP]
└─vdb3 252:19 0 1000M 0 part
└─myvg-mylv 253:3 0 800M 0 lvm
vdc 252:32 0 10G 0 disk
[root@blue ~]# mkfs.vfat /dev/myvg/mylv
-bash: mkfs.vfat: command not found
[root@blue ~]# yum -y install dosfstools
Updating Subscription Management repositories.
Unable to read consumer identity
.......
[root@blue ~]# mkfs.vfat /dev/myvg/mylv
mkfs.fat 4.1 (2017-01-24)
[root@blue ~]# vim /etc/fstab
[1]+ Stopped vim /etc/fstab
[root@blue ~]# mkdir /mnt/mydata
[root@blue ~]# fg
vim /etc/fstab
[root@blue ~]# mount -a
[root@blue ~]# df
Filesystem 1K-blocks Used Available Use% Mounted on
devtmpfs 483592 0 483592 0% /dev
tmpfs 501328 0 501328 0% /dev/shm
tmpfs 501328 6880 494448 2% /run
tmpfs 501328 0 501328 0% /sys/fs/cgroup
/dev/mapper/rhel-root 49087060 1765620 47321440 4% /
/dev/vda1 1038336 163540 874796 16% /boot
/dev/mapper/test-vo 301728 12732 288996 5% /vo
tmpfs 100264 0 100264 0% /run/user/0
/dev/mapper/myvg-mylv 817584 4 817580 1% /mnt/mydata
[root@blue ~]#
逻辑卷扩容
lvextend -L 300M /dev/test/vo //将名字叫vo的逻辑卷扩容到300M
blkid /dev/test/vo //查看vo逻辑卷的文件系统
lsblk //再查看该逻辑卷的挂载点
xfs_growfs /vo //刷新大小,如果是xfs的文件系统
resize2fs /vo //刷新大小,如果是ext的文件系统
交换分区
相当于win的虚拟内存
,在物理内存不足时借用硬盘空间,硬盘中预先划分一定的空间
,然后将把内存中暂时不常 用的数据临时存放到硬盘中
,以便腾出物理内存空间让更活跃的程序服务来使用的技术,其设计目的是为了解决真实物理内存不足的问题。
但由于交换分区
毕竟是通过硬盘设备读写数据的, 速度肯定要比物理内存慢
,所以只有当真实的物理内存耗尽后才会调用交换分区的资源
.
- 交换分区:虚拟内存,一般设置成物理内存的1~2倍,<16G
格式化交换分区
swapon -s //查询交换分区状态,通常有可能会存在个默认的交换分区,不能删除
先用fdisk /dev/vdb //再创建一个512M的分区比如创建了vdb3
mkswap /dev/vdb3 //格式化交换分区
vim /etc/fstab //修改开机挂载磁盘的文件
/dev/vdb3 swap swap defaults 0 0
swapon -a //测试上述文件是否修改正确
swapon -s //再次查看会多出swap分区
启用/停止控制:
swapon 设备路径
swapoff 设备路径
查看交换分区使用情况:
swapon -s
free
- 添加交换分区
为你的系统额外添加一个512MiB的交换分区,此交换分区应在系统启动时自动挂载,不要删除或以任何方式改动系统上原有的交换分区。
[root@blue ~]# 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.
Command (m for help): n
Partition type
p primary (1 primary, 0 extended, 3 free)
e extended (container for logical partitions)
Select (default p):
Using default response p.
Partition number (2-4, default 2):
First sector (1026048-20971519, default 1026048):
Last sector, +sectors or +size{
K,M,G,T,P} (1026048-20971519, default 20971519): +512M
Created a new partition 2 of type 'Linux' and of size 512 MiB.
Command (m for help): w
The partition table has been altered.
Syncing disks.
[root@blue ~]# part
parted partprobe partx
[root@blue ~]# part
parted partprobe partx
[root@blue ~]# partprobe /dev/vd
vda vda1 vda2 vdb vdb1 vdb2 vdc
[root@blue ~]# partprobe /dev/vdb
[root@blue ~]# lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 1024M 0 rom
vda 252:0 0 50G 0 disk
├─vda1 252:1 0 1G 0 part /boot
└─vda2 252:2 0 49G 0 part
├─rhel-root 253:0 0 46.9G 0 lvm /
└─rhel-swap 253:1 0 2.2G 0 lvm [SWAP]
vdb 252:16 0 10G 0 disk
├─vdb1 252:17 0 500M 0 part
│ └─test-vo 253:2 0 300M 0 lvm /vo
└─vdb2 252:18 0 512M 0 part
vdc 252:32 0 10G 0 disk
[root@blue ~]# mkswap /dev/vd
vda vda1 vda2 vdb vdb1 vdb2 vdc
[root@blue ~]# mkswap /dev/vd
vda vda1 vda2 vdb vdb1 vdb2 vdc
[root@blue ~]# mkswap /dev/vdb2
Setting up swapspace version 1, size = 512 MiB (536866816 bytes)
no label, UUID=ac1a1ba6-7f1a-4b92-80bc-11836d4236c0
[root@blue ~]# vim /etc/fstab
[root@blue ~]# swapon -a
[root@blue ~]# swapon -s
Filename Type SizeUsed Priority
/dev/dm-1 partition 2265084 0 -2
/dev/vdb2 partition 524284 0 -3
[root@blue ~]#
VDO卷
虚拟数据优化器,可以对数据进行重删过滤,
VDO(Virtual Data Optimize)是RHEL8/Centos8上新推出的一个存储相关技术(最早在7.5测试版中开始测试),是Redhat收购的Permabit公司的技术。
VDO的主要作用是节省磁盘空间,比如让1T的磁盘能装下1.5T的数据,从而降低数据中心的成本。
那vdo是如何实现的呢,关键原理主要是重删和压缩
,重删就是硬盘里拷贝来相同的数据,以前要占多份空间,现在只需要1份空间就可以了。类似我们在百度网盘中上传一个大型软件安装包,能实现秒传,其实是之前就有,所以无需再传一遍,也无需再占百度一份空间。另一方面是数据压缩,类似于压缩软件的算法,也可以更加节省磁盘空间。
VDO是一个内核模块
,目的是通过重删减少磁盘的空间占用,以及减少复制带宽
,VDO是基于块设备层之上
的,也就是在原设备基础上映射出mapper虚拟设备,然后直接使用即可,功能的实现主要基于以下技术。
- 1)零区块的排除:在初始化阶段,整块为0的会被元数据记录下来,这个可以用水杯里面的水和沙子混合的例子来解释,使用滤纸(零块排除),把沙子(非零空间)给过滤出来,然后就是下一个阶段的处理。
- 2)重复数据删除:在第二阶段,对于输入的数据会判断是不是冗余数据(在写入之前就判断),这个部分的数据通过UDS内核模块来判断(Universal Deduplication Service),被判断为重复数据的部分不会被写入,然后对元数据进行更新,直接指向原始已经存储的数据块即可。
- 3)压缩:一旦消零和重删完成,LZ4压缩会对每个单独的数据块进行处理,然后压缩好的数据块会以固定大小4KB的数据块存储在介质上,由于一个物理块可以包含很多的压缩块,这个也可以加速读取的性能。
yum -y install vdo //装包
systemctl restart vdo //启动服务,并设置开机自启
找到vdc磁盘(此盘之前不能有配置)
man vdo //搜索 /example ,在例子中查找相关配置命令
vdo create --name=vdo0 --device=/dev/sdb1 --vdoLogicalSize=10T //然后按题目稍作修改,name是vdo卷的名称,device是使用哪个物理磁盘,最后是定义虚拟磁盘大小
格式化 mkfs.xfs -K /dev/mapper/myvdo // `-K可以加快速度`
设置/etc/fstab文件,并且使用mount -a检测
/dev/mapper/myvdo /vblock xfs _netdev 0 0 // _netdev的作用是等待网络相关程序启动后再执行挂载任务,通常网络启动之后vdo服务也就起来了,就可以挂载了
vdo基本操作:
vdo create --name=VDO卷名称 --device=设备路径 --vdoLogicalSize=逻辑大小
vdo list
vdo status -n VDO卷名称
vdostats [–human-readable] [/dev/mapper/VDO卷名称]
vdo remove -n VDO卷名称
系统调优
使用tuned服务,RHEL7/8的调优服务tuned
:提供了大量预设的调优方案,旨在于简化调优的实施,充分利用系统资源与能效。
管理员可以针对不同的业务选择不同的优化策略
tuned-adm 命令直接回车 可以看到选项提示信息
tuned-adm list //列出可用的优化方案
tuned-adm recommend 查询建议的优化方案
tuned-adm profile XXXXX 使用某优化方案
tuned-adm active 查看当前使用的优化方案
根据练习时的需求分进度开启下列主机,control必须开启,node主机可以开启1~2台进行初步的练习
rht-vmctl reset control //还原控制主机
rht-vmctl reset node1 //还原node1主机
rht-vmctl reset node2 //还原node2主机
rht-vmctl reset node3 //还原node3主机
rht-vmctl reset node4 //还原node4主机
rht-vmctl reset node5 //还原node5主机
Podman(podmanager):
是一个功能齐全的容器引擎,它是一个简单的无需守护的用来管理镜像、容器的工具。Podman提供了一个与Docker CLI兼容的操作方式,简单地说:alias docker=podman。大多数Podman命令都可以普通用户运行,而无需其他额外的权限。
图片
容器(Container):
指的是针对应用所需的运行环境资源
(依赖库/目录/网络/用户……等)进行整体封装的技术
。封装好的镜像
相比虚拟机的粒度
要更细,可移植性强。每个容器采用沙箱机制,相互隔离。
传统虚拟化与容器技术对比:
图片
仓库
=》镜像
=》容器
的关系:
- 仓库:用来提供/存放镜像,有官方仓库(比如红帽的registry.redhat.io、刀客的docker.io),或自建私有仓库。
- 镜像:针对某个虚拟机或某个应用封装的独立环境,作为容器的模板。
- 容器:基于某个镜像启动的在内存中运行的实例。
图片
一、安装环境
# yum module install -y container-tools //安装容器工具及其模块配置
# yum install -y podman-docker //安装docker兼容包(可选)
二、访问仓库
1)设置默认的仓库地址(全局配置)
可以使用官方仓库(比如registry.access.redhat.com)、第三方仓库(比如docker.io),或者私有仓库(比如registry.lab.example.com)。
# vim /etc/containers/registries.conf
[registries.search]
registries = ['registry.lab.example.com'] //设置搜索镜像的默认仓库地址
.. ..
[registries.insecure]
registries = ['registry.lab.example.com'] //允许访问不安全的仓库(比如HTTPS证书无效或过期等情况)
.. ..
2)登录仓库(如果需要的话,比如push上传镜像时)
# podman login registry.lab.example.com
Username: admin
Password: ***********
Login Succeeded!
3)搜索仓库中的镜像(比如nginx)
# podman search nginx
INDEX NAME DESCRIPTION STARS OFFICIAL AUTOMATED
example.com registry.lab.example.com/library/nginx
三、管理镜像
1)下载镜像到本地
# podman pull registry.lab.example.com/library/nginx
.. ..
//容器存储默认工作目录 /var/lib/containers/
2)查看镜像
# podman images //列出本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.lab.example.com/nginx latest 4bb46517cac3 3 months ago 137 MB
# podman image inspect 4bb4 //查看xxxx镜像的详细配置信息
.. ..
3)导出/备份镜像
# podman save nginx > /root/nginx.tar
4)导入镜像
# podman load -i /root/nginx.tar nginx-new:latest
5)删除镜像
# podman rmi xxxx //删除ID为xxxx的镜像
# podman rmi -a //删除所有镜像
四、管理容器
1. 启动容器
- 1)在后台启动一个容器(-d 后台运行)
# podman run -d registry.lab.example.com/library/nginx
80b22e7bd4d789773223f5afc85808ea472e82ec72f162903cd658ed6d98091c
# podman ps //列出启用中的容器(结合-a选项可以列出所有)
.. ..
# podman container inspect 4bb4 //查看xxxx容器的详细信息
.. ..
- 2)新启动一个容器并执行其中的命令“cat /etc/os-release”,然后删除此容器
# podman run --rm registry.lab.example.com/library/nginx cat /etc/os-release
PRETTY_NAME="Debian GNU/Linux 10 (buster)"
NAME="Debian GNU/Linux"
.. ..
- 3)启动一个容器,并进入容器内的/bin/bash命令行环境(-i 允许交互,-t 开启终端)
# podman run -it registry.lab.example.com/library/nginx /bin/bash
root@840b592a6d3f:/# nginx -v //检查nginx版本
nginx version: nginx/1.19.2
root@840b592a6d3f:/# ls /usr/share/nginx/html/ //检查网页目录
50x.html index.html
root@840b592a6d3f:/# exit //退出容器
exit
#
- 4)在后台启动一个nginx容器,添加端口映射(-p 本地端口:容器端口)
[root@red ~]# podman run -d -p 8000:80 nginx
2b9ef8c0864149e2cf7860e903e36ba9deaa1717863f172b2bf2e5c5f3f6600c
[root@red ~]# podman ps //列出活动中的容器
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
2b9ef8c08641 registry.lab.example.com/library/nginx:latest nginx -g daemon o... 2 minutes ago Up 2 minutes ago 0.0.0.0:8000->80/tcp ecstatic_maxwell
.. ..
[root@red ~]# curl http://127.0.0.1:8000 //通过主机端口访问容器中的web站点
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
.. ..
- 5)在后台启动一个nginx容器,将主机的/opt/webroot映射为此nginx容器的web目录(-v 本地目录:容器内目录)【持久存储】
# mkdir /opt/webroot //准备网页目录
# echo "Podman Test" > /opt/webroot/index.html //准备默认测试网页
# podman run -d -p 8001:80 -v /opt/webroot:/usr/share/nginx/html nginx
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
# curl http://127.0.0.1:8001 //测试结果
Podman Test
2. 访问运行中的容器
- 1)连接到ID值以ba64开头的(或者以-l表示最近一个容器)容器的命令行
[root@red ~]# podman exec -it ba64 bash
root@ba64a15abdce:/# service nginx status
[ ok ] nginx is running.
root@ba64a15abdce:/# exit
exit
[root@red ~]#
- 2)检查容器的IP地址
[root@red ~]# podman inspect ba64 | grep IPAddress
.. ..
"SecondaryIPAddresses": null,
"IPAddress": "10.88.0.6",
.. ..
- 3)从主机向ID值为ba64的(或者以-l表示最近一个容器)容器传输文件
[root@red ~]# echo AAAA > /root/a.html //建立测试网页
[root@red ~]# podman cp /root/a.html ba64:/usr/share/nginx/html/a.html //复制文件到容器
[root@red ~]# curl http://127.0.0.1:8001/a.html //确认结果
AAAA
- 4)通过映射端口访问容器中的Web服务
[root@red ~]# curl http://localhost:8001/ //浏览8001端口访问目标容器首页
Podman Test
[root@red ~]# curl http://localhost:8001/a.html //浏览指定页面
AAAA
3. 关闭/杀死容器
- 1)关闭/杀死ID值为ba64的容器
[root@red ~]# podman stop ba64 //若要杀容器改用kill
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
[root@red ~]# podman ps -a | grep ba64 //检查容器状态
ba64a15abdce registry.lab.example.com/library/nginx:latest nginx -g daemon o... 47 minutes ago Exited (0) 25 seconds ago 0.0.0.0:8001->80/tcp dreamy_swirles
- 2)重新启动被关闭的ID值为ba64的容器
[root@red ~]# podman start ba64 //启用已关闭的xx容器
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
[root@red ~]# podman ps -a | grep ba64 //检查容器状态
ba64a15abdce registry.lab.example.com/library/nginx:latest nginx -g daemon o... 48 minutes ago Up 2 seconds ago 0.0.0.0:8001->80/tcp dreamy_swirles
- 3)强制删除ID值为ba64的容器
[root@red ~]# podman rm -f ba64 //删除已关闭的xx容器(如果不加-f,则需要先stop此容器)
ba64a15abdce1dbd4ed834ad061efde2f7ea421a862076468cbbd694c587f8ca
[root@red ~]# podman ps -a | grep ba64 //检查删除结果(无输出)
[root@red ~]#
五、为容器设置systemd服务
- 1)启动一个容器,命名为myweb
[root@red ~]# podman run --name myweb -d -p 80:80 -v /opt/webroot:/usr/share/nginx/html nginx
52e6996bef86c501731115216c84a2f48d1a03f8c1a2cad70d27e281bd642b18
- 2)为名称为myweb的容器创建对应的systemd服务配置
[root@red ~]# cd /etc/systemd/system/ //进入服务配置目录
[root@red system]# podman generate systemd -n myweb --files
/etc/systemd/system/container-myweb.service
- 3)更新systemd服务配置
[root@red system]# systemctl daemon-reload
4)配置congtainer-myweb服务开机自启
[root@red system]# systemctl enable container-myweb
Created symlink /etc/systemd/system/multi-user.target.wants/container-myweb.service → /etc/systemd/system/container-myweb.service.
5)关闭当前运行的容器
[root@red system]# podman stop 52e6
52e6996bef86c501731115216c84a2f48d1a03f8c1a2cad70d27e281bd642b18
6)重启主机后,检查是否可以访问此web
[root@red system]# reboot
.. ..
[root@server1 ~]# curl http://172.25.0.26/
Podman Test
六、使用无根(rootless)环境
通过rootless无根模式,非特权用户也可以很方便的运行容器(允许开启1024以上端口),以提高服务管理的安全性。
!!! 确认非特权用户的起始可用端口(需要时可更改)
# cat /proc/sys/net/ipv4/ip_unprivileged_port_start
1024
使用systemctl --user会话时,注意要直接以普通用户SSH或console控制台登录,不要使用su或sudo的方式执行。
- 1)配置仓库
可参考man containers-registries.conf手册,
如果已经在/etc/containers/registries.conf 文件全局设置过,这里可以不做。
[zaniu@red ~]$ mkdir -p ~/.config/containers
[zaniu@red ~]$ vim ~/.config/containers/registries.conf
unqualified-search-registries = ['registry.lab.example.com']
[[registry]]
location = "registry.lab.example.com"
insecure = true //允许访问不安全的仓库(全局配置中也需要添加仓库地址)
blocked = false
- 2)下载(或导入)镜像
[zaniu@red ~]$ podman login registry.lab.example.com //登录仓库(如果仓库要求的话)
Username: admin
Password:
Login Succeeded!
[zaniu@red ~]$ podman pull registry.lab.example.com/library/nginx //下载镜像到本地
.. ..
//用户容器存储默认工作目录 ~/.local/share/containers/
[zaniu@red ~]$ podman images //检查本地镜像
REPOSITORY TAG IMAGE ID CREATED SIZE
registry.lab.example.com/library/nginx latest 4bb46517cac3 3 months ago 137 MB
2)启动一个名为xxnginx的容器(如果SELinux要求启用的话,可以通过:Z传递安全标签)
[zaniu@red ~]$ mkdir /home/zaniu/html
[zaniu@red ~]$ echo zaniu > /home/zaniu//html/index.html
[zaniu@red ~]$ podman run --name xxnginx -d -p 8080:80 -v /home/zaniu/html:/usr/share/nginx/html:Z nginx
8fa1bc2ccd14ddc57e187ffe8e0035b6bfb1c3189460b3470b3935365f5d9a85
[zaniu@red ~]$ curl http://127.0.0.1:8080
zaniu
- 3)创建container-xxnginx服务配置
[zaniu@red ~]$ mkdir -p ~/.config/systemd/user //创建用户服务配置目录
[zaniu@red ~]$ cd ~/.config/systemd/user //进入用户服务配置目录
[zaniu@red user]$ podman generate systemd --name xxnginx --files //生成container-xxnginx服务配置
/home/zaniu/.config/systemd/user/container-xxnginx.service
- 4)更新用户服务配置,设置开机自启动
[zaniu@red user]$ systemctl --user daemon-reload //更新用户服务配置
[zaniu@red user]$ systemctl --user enable container-xxnginx.service //配置自启动
Created symlink /home/zaniu/.config/systemd/user/multi-user.target.wants/container-xxnginx.service → /home/zaniu/.config/systemd/user/container-xxnginx.service.
[zaniu@red user]$ loginctl enable-linger //允许为未登录的用户启动/保持后台服务
//如果linger方式无效,也可以通过用户计划任务实现开机自启动
[zhsan@red user]$ crontab -e
@reboot systemctl --user start container-xxnginx.service
- 5)测试用户服务控制
[zaniu@red user]$ podman stop xxnginx //停止原来手动运行的容器
[zaniu@red user]$ systemctl --user start container-xxnginx.service //启动容器服务
[zaniu@red user]$ systemctl --user status container-xxnginx.service //检查容器状态
[zaniu@red user]$ systemctl --user stop container-xxnginx.service //停止容器服务
6)重启主机后,确认仍然可以访问web
[root@red system]# reboot
.. ..
[root@server1 ~]# curl http://172.25.0.26:8080/
ansible
1,安装ansible软件包
[root@control ~]# yum -y install ansible
ansible使用配置文件顺序
- 1, 查找ANSIBLE_CONFIG变量
- 2,
查当前目录下ansible.cfg
//目前重点练习方式 - 3,检查家目录下ansible.cfg
- 4,查/etc/ansible/ansible.cfg
配置文件
root@control ~]# mkdir ansible
[root@control ~]# cd ansible/
[root@control ansible]# vim ansible.cfg //编写配置文件
[defaults]
inventory=inventory //指定被控制主机清单文件
[root@control ~]# vim /etc/ansible/ansible.cfg `//可以参照默认配置文件`
3,编写清单文件与测试
[root@control ansible]# vim inventory //编写刚刚在配置文件中指定的清单文件
node1 `写上要管理的主机,域名或则ip都可以`
[root@control ansible]# ansible node1 -m ping 查询node1主机是否可以被正常控制
[root@control ~]# vim /etc/ansible/hosts 可以参考主机清单配置模板
再次修改inventory文件
[test01] 创建组,名字是test01
node1 test01组中的成员
node2 test01组中的成员
[test02] 再创建组,名字是test02
node[3:4] test02组中的成员
[web:children] 创建嵌套组,组名是web,后面:children是关键字,表示该组可以包含其他组
test01 web组中包含的其他组
test02
[root@control ansible]# vim ansible.cfg 再次修改配置文件
[defaults]
inventory = inventory
remote_user = alice 被控端主机使用的账户,默认是root
[privilege_escalation] 添加提权配置,可以从默认配置文件复制
become=True 是否要提权,true是确定要提权
become_method=sudo 提权方式是sudo
become_user=root 提权目标用户是root
become_ask_pass=False 无需密码
如果使用了root以外的账号连接被控端主机,需要被控端主机做对应账号的提权操作
[root@node1 ~]# vi /etc/sudoers 这里可以进入node1主机的提权配置文件的101行看看alice账户,已经配置好了可以看懂即可
alice ALL=(ALL) NOPASSWD:ALL
这行是将alice账户做了提升权限的操作, ALL 是任意主机= (ALL 是任何用户) NOPASSWD是提权时无需输入密码 ALL是运行任何命令
利用ansible控制其他主机的方式
ansible ad-hoc
任务量比较少时使用ansible playbook
下达批量任务时使用
模块
[root@control ansible]# ansible-doc -l 查看所有模块
[root@control ansible]# ansible-doc -l | grep yum
[root@control ansible]# ansible-doc yum
使用ansible ad-hoc的方式操作被控主机
:
ansible 被控主机 -m 模块 -a 传递参数
[root@control ansible]# ansible test01 -m command -a 'touch /opt/test' //使用ansible对test01主机组下达指令,使用的是command模块,利用此模块可以传递大多数linux命令给远程主机
[root@control ansible]# ansible all -a 'touch /opt/test' //由于command模块是默认模块,也可以不写
[root@control ansible]# ansible node1 -m shell -a 'echo 123 > /opt/abc' //使用command模块时由于能力有限无法识别管道与重定向等特殊功能,可以换成shell模块
[root@control ansible]# ansible all --list //查看所有可用主机
[root@control ansible]# ansible node1,node3 -m shell -a 'hostname' //调用多台主机同时执行某任务
shell脚本,可以将一堆指令放入一个文档,之后让服务器执行该文档就可以批量运行脚本中的指令
[root@control ansible]# vim abc.sh 编写脚本
#!/bin/bash 声明解释器
mkdir /opt/xyz 执行指令,可以有很多
ip add show
[root@control ansible]# chmod +x abc.sh 给脚本赋予x(执行)权限
[root@control ansible]# ./abc.sh 使用相对路径执行脚本
使用script
模块,可以将写好的shell脚本传递到被控主机并运行
[root@control ansible]# ansible node1 -m script -a 'abc.sh' //使用`script`模块,可以将写好的shell脚本传递到被控主机并运行
使用yum_repository
模块配置远程主机的yum仓库
[root@control ansible]# ansible-doc yum_repository //如果忘记yum_repository 模块的使用方法,可以利用ansible-doc查询
/EXAMPLE
//搜索关键词可以找到例子
yum_repository常用参数含义:
- name: 仓库名称
- description: 仓库描述
- file: yum配置文件名称
- baseurl: yum源
- gpgcheck: no 检查软件合法性
- gpgkey: gpg检测文件地址
练习:
使用yum_repository模块为node1主机配置yum仓库,考试时是所有主机,将node1修改为all即可,另外仓库的描述、名称平时练习时随意,考试时必须要按照题目要求配置
第一个仓库
ansible node1 -m yum_repository -a 'name=abc description=abcabc file=test baseurl=http://study.lab0.example.com/rhel8/BaseOS gpgcheck=yes gpgkey=http://study.lab0.example.com/rhel8/RPM-GPG-KEY-redhat-release'
-------------------------------------------------------------
第二个仓库
ansible all -m yum_repository -a 'name=abc01 description="abc abc" file=test01 baseurl=http://study.lab0.example.com/rhel8/AppStream gpgcheck=yes gpgkey=http://study.lab0.example.com/rhel8/RPM-GPG-KEY-redhat-release'
-------------------------------------------
state 执行动作 present 安装 absent删除 latest 升级
yum
模块 可以安装各种软件
[root@control ansible]# ansible-doc yum 查看帮助文档
name 安装的软件包名
state 执行动作 present 安装 absent删除 latest 升级
[root@control ansible]# ansible node1 -m yum -a 'name=httpd' //在node1主机使用yum模块安装httpd,默认情况下,state不写就是安装
[root@control ansible]# ansible node1 -m yum -a 'name=httpd state=absent' //如果要删除,就添加absent
[root@node1 yum.repos.d]# yum grouplist //到node1主机查询包组的安装状态
[root@control ansible]# ansible node1 -m yum -a 'name="@RPM Development Tools"' //安装包组时包组前面加@即可,包组的名字要用引号包围
file
模块,可以创建文件,目录,连接文件
常用参数:
- path //定义创建文件的路径
- state //定义创建文件的类型,touch,directory,link,absent
- owner //设置属主
- group //设置属组
- mode //设置权限
- force //是否在文件已经存在时替换
示例:
ansible node1 -m file -a 'path=/opt/abc state=directory' //在node1主机创建目录名字叫abc
ansible node1 -m file -a 'path=/opt/abc state=directory mode=0777' //创建时设置权限
ansible node1 -m file -a 'path=/opt/abc04 state=link src=/dev/urandom' //创建连接文件abc04,源文件是urandom
ansible node1 -m file -a 'path=/opt/abc state=link src=/etc/host force=yes' //如果创建的连接文件不存在,也可以用强制
copy
模块,可以将控制主机的文件拷贝到被控主机
常用参数:
- dest //将文件拷贝到哪里的路径
- src //源文件路径
- owner //设置属主
- group //设置属组
- mode //设置权限
- force //是否在文件已经存在时替换
- backup=yes //备份文件
示例:
ansible node1 -m copy -a 'src=hosts dest=/opt/xyz01 owner=alice backup=yes' //从控制主机向被控主机传递hosts文件,并改名为xyz01,如果对方有同名文件,就先将对方的文件改名备份,然后再拷贝
ansible node1 -m copy -a 'src=/etc/passwd dest=/opt/passwd1 owner=alice mode=777 force=no' //从控制主机拷贝passwd文件到被控主机node1,如果对方有该文件则无需再拷贝并出现绿色幂等性提示信息
----------------------------------------------------
ansible node1 -m fetch -a 'src=/opt/666 dest=.' 可以从被控主机获取文件666到控制主机的当前目录
user
模块 可以管理账户
常用参数:
- uid //定义用户id号
- name //定义用户名
- password //定义密码
- group //定义基本组
- groups //定义附加组
- append //定义附加组时可以使用yes用来追加
- state //定义创建或者删除账户 present absent
- remove //是否要在删除用户时把家目录一起删除
- force //是否可以在用户登录时强制删除
示例:
ansible node1 -m user -a 'name=test01 shell=/sbin/nologin groups=bin,root,lp' //创建账户test01 修改解释器为nologin,并定义了多个附加组
ansible node1 -m user -a 'name=test01 state=absent remove=yes' //删除账户test01,并连家目录一起删除
ansible node1 -m user -a "name=test02 password={
{'123'|password_hash('sha512')}}" //创建账户test02,并配置密码123,必须是加密形式
group
模块 管理组
常用参数:
- name 定义组名
- gid 定义组号
- state present absent
示例:
ansible node1 -m group -a 'name=group01 gid=1500' 创建组名字叫group01 ,id号是1500
ansible node1 -m group -a 'name=group01 state=absent' 删除组
service
模块 管理系统服务
- name 定义服务名称
- state 定义开关服务, started ,stopped, restarted, reloaded
- enabled 定义是否开机自启
ansible node1 -m service -a 'name=httpd state=started' 开启httpd服务
ansible node1 -m service -a 'name=httpd state=stopped' 关闭httpd服务
ansible node1 -m service -a 'name=httpd enabled=yes' 设置httpd服务开机自启
firewalld
模块 可以配置防火墙
- state 启用或者禁用规则 enabled disabled
- zone 区域名称
- service 对什么服务开启或关闭
- port 定义端口/协议
- permanent 定义是否为永久配置
- immediate 立刻生效
ansible node1 -m firewalld -a 'service=http zone=public permanent=yes immediate=yes state=enabled' 使用防火墙模块在public区域中开启http协议
ansible node1 -m firewalld -a 'port=80/tcp zone=public permanent=yes immediate=yes state=enabled' 使用防火墙模块在public区域中开启tcp的80端口,目的同上
firewall-cmd --list-all-zone 直接使用shell命令查看防火墙区域
- block区域 阻止数据包通过
- drop区域 丢弃数据包
- public区域 会放行某一部分常用功能的数据,默认区域
- trusted 区域 会放行一切数据
parted
模块 可以管理磁盘
- device 指定硬盘设备路径 比如 /dev/vdb
- label 指定分区表类型 gpt mbr
- number 指定分区序号
- part_start 分区起始位置
- part_end 分区结束位置
- state 指定操作方式 present创建 absent删除 info查信息(默认)
ansible node2 -m parted -a 'device=/dev/vdb number=1 state=absent' //删除vdb硬盘的现有1号分区
ansible node2 -m parted -a 'device=/dev/vdb label=gpt number=1 part_end=200MB state=present' //在vdb创建1号新分区,分区表是gpt类型,大小是从头~200M
ansible node2 -m parted -a 'device=/dev/vdb label=gpt number=2 part_start=200MB part_end=600MB state=present' //在vdb硬盘创建第2个分区,大小是从200M的位置到600M,相当于400M的大小
ansible node2 -m shell -a 'lsblk | grep vdb2' 远程查看结果
filesystem模块
可以为硬盘格式化
- dev 要格式化的分区
- fstype 文件系统类型 比如 ext4 xfs
- force 强制格式化,如果以前分区中有数据
ansible node2 -m filesystem -a 'dev=/dev/vdb1 fstype=xfs force=yes' 给vdb1格式化,类型是xfs
ansible node2 -m filesystem -a 'dev=/dev/vdb2 fstype=ext4 force=yes' 给vdb2格式化,类型是ext4
ansible node2 -m shell -a 'mount /dev/vdb1 /mnt' 传递挂载命令测试效果
[root@node2 ~]# blkid /dev/vdb1 还可以直接在node2主机查看该分区的文件系统类型
pv 物理卷 vg 卷组 lv 逻辑卷
lvg模块
,可以创建卷组
- vg 卷组名称
- state // present创建(默认) 或者 absent删除
- force 可以在删除时使用
- pvs 指定物理卷
- pesize 设定pe大小
ansible node2 -m lvg -a 'vg=myvg state=present pvs=/dev/vdb1,/dev/vdb2' 创建卷组名字叫myvg,使用的物理卷是vdb1与vdb2
ansible node2 -m lvg -a 'vg=myvg state=absent' 删除名为myvg的卷组
ansible node2 -m lvg -a 'vg=vgtest pvs=/dev/vdb pesize=16' 创建名为vgtest的卷组,使用vdb磁盘所有空间,pe大小是16M
lvol模块
,创建删除逻辑卷
- lv 定义逻辑卷名称
- size 定义逻辑卷大小
- vg 逻辑卷的空间来自哪个vg
- state // present创建(默认) 或者 absent删除
- force 强制删除或者调整逻辑卷大小
ansible node2 -m lvol -a 'lv=mylv vg=/dev/myvg size=100M state=present' 利用myvg卷组创建逻辑卷 大小是100m,名字叫mylv
ansible node2 -m lvol -a 'lv=mylv vg=/dev/myvg size=100M state=absent force=yes' 删除mylv逻辑卷
playbook
剧本
YAML 是一种可读性较高的文本编写规范
使用要点:`
- 1,
使用yml 或者 yaml扩展名
- 2,
文档开头要使用 --- 结尾 ... 不是必须
- 3,
键值对使用
:后面要有空格
- 4,
不许使用tab键
- 5,
同层级要对齐,不同层级内容需要有至少2个以上缩进空格
- 6,
列表前需要加 - 后面要有空格
---
- 食品分类:
苹果
香蕉
- 家具分类:
桌子
柜子
---
- name: test1 第一个剧的名称
hosts: node1 在哪个主机跑该剧
tasks: 该剧的任务
- name: ping test 第一个任务的名字
ping: 第一个任务内容,通常是执行某模块
- name: install httpd 第二个任务的名字
yum: name=httpd 第二个任务的内容
...
[root@control ansible]# ansible-playbook test01.yml 执行剧本
[root@control ansible]# vim ~/.vimrc 配置vim编辑器的配置,优化yaml文件编辑过程
autocmd filetype yaml setlocal et ts=2 ai sw=6
lineinfile模块
可以在文档中替换或者增加行
- dest 或path 替换的目标文件
- regexp 查找要替换的内容
- line 要 替换/增加 的内容
- state
- insertbefore 在某行上增加一行
- insertafter 在某行下增加一行
案例
:编写playbook,对远程主机的test文件进行替换
- name: test01
hosts: node1
tasks:
- name: line
lineinfile: //利用模块删除有abc01的行
dest: /opt/test
regexp: abc01
state: absent
---
- name: test01
hosts: node1
tasks:
- name: line
lineinfile: //利用模块替换abc01的行为abc02
dest: /opt/test
regexp: abc01
line: abc02
---
- name: test01
hosts: node1
tasks:
- name: line
lineinfile: //利用模块在有abc01的行下添加xyz
dest: /opt/test
insertafter: abc01
line: xyz
replace模块
,可以替换文档中的某些字符串,找到匹配内容则全替换
- dest或path 目标文件
- regexp 找匹配的具体内容
- replace 替换成什么内容
- backup 是否要备份,如果是的话写backup=yes
案例
:
---
- name: test01
hosts: node1
tasks:
- name: line
replace: dest=/opt/test regexp=abc replace=opq //使用replace模块,找到文档中有abc的内容都替换成opq
编写playbook,对node1主机安装网站等工具,并开启web服务与定义默认页面内容
- name: web
hosts: node1
tasks:
- yum: name="httpd,net-tools" state=present
- service: name=httpd state=started enabled=yes
- copy:
content: > //此处可以定义什么文本内容,>可以让下列文本以单行显示,如果是 | ,以多行显示
abc xyz
abc qwe
dest: /var/www/html/index.html
setup模块 可以获取被控主机的各种变量信息
,比如主机名,系统版本,硬件资源大小
[root@control ansible]# ansible node1 -m setup | less
ansible_hostname 主机名称
ansible_fqdn 完整主机名
ansible_bios_version 查看bios版本信息
ansible_memfree_mb 内存空间剩余大小
ansible_devices.vda.partitions.vda1.size 查看vda1分区的大小
ansible_lvm 逻辑卷相关信息
ansible_lvm.lvs.root.size_g 查看名字是root的逻辑卷大小
ansible_kernel 查看内核版本
ansible_eth0.ipv4.address 查看eth0网卡的ip地址
debug 模块可以输出字符以及变量中的信息
---
- name: debug
hosts: node1
tasks:
- debug:
msg: fqdn={
{
ansible_fqdn}} //查看完整主机名
或者
tasks:
- debug: msg="fqdn={
{
ansible_fqdn}}"
通过默认执行的setup模块,收集与node1主机相关信息
---
- name: debug
hosts: node1
tasks:
- debug: msg="{
{
ansible_fqdn}}"
- debug: msg="{
{
ansible_devices.vda.partitions.vda1.size}}"
- debug: msg="{
{
ansible_lvm.lvs.root.size_g}}"
- debug: msg="{
{
ansible_eth0.ipv4.address}}"
- debug: var=ansible_fqdn
变量种类
:
1,主机清单变量,针对主机或者组生效
node1 myvar1="abc" myvar2="xyz" //在主机清单中针对node1主机定义的变量
[test01:vars] //针对test01组定义的变量
myvar3="opq" //具体变量
myvar4="zxc"
2,playbook中定义剧本变量,只针对该剧本生效
---
- name: debug
hosts: node2
vars: //定义变量的关键字
test01: aaa //具体变量
test02: bbb
tasks:
- debug: var=test01 调用变量,使用var可以直接调用变量
3,在文档中定义好变量,然后在playbook中调用
[root@control ansible]# cat var.yml 提前定义好的变量文件
---
abc: abcabc
xyz: xyzxyz
-------------
然后在playbook中使用vars_files调用该文件名
- name: debug
hosts: node2
vars_files: var.yml
tasks:
- debug: var=abc
4,在playbook中定义变量使用前的提示,可以临时根据需要定义不同内容作为变量的值
- name: debug
hosts: node2
vars_prompt: 开启功能的关键字
- name: var1 即将要使用的变量名
prompt: "hello" 向用户获取变量的值时提示什么语句
private: no 这里no是开启输入变量时的回显
tasks:
- debug: var=var1
5,系统变量,通过setup模块可以获取到的信息
- gather_facts: yes 默认情况下系统执行playbook自动开启
6,魔法变量,ansible内置的特殊变量,主要可以获取主机清单信息、变量,可以让某被控主机获取其他被控主机的变量信息
- inventory_hostname 可以显示主机清单中的名字
+hostvars 包含被控主机的所有变量 - hostvars.node1 只显示node1主机的变量
- hostvars.node1.group_names 显示node1所在的组名
- groups 所有主机以及组信息
- groups.all 所有主机名
- groups.test01 显示test01组的主机名
- group_names 当前运行任务的主机所在的组的名字
---
- name: test1
hosts: all
- name: test2 让node1主机显示node3主机的完整名称
hosts: node1
tasks:
- debug:
var=hostvars.node3.ansible_fqdn
jinja2模板
template模块 可以将文本拷贝到被控主机,功能类似copy,而且支持变量的调用
- src 拷贝什么文件
+dest 拷贝到那个路径
通过魔法变量与jinja2模板可以将text.j2文档用template模块收集不同主机信息并保存到某位置
[root@control ansible]# cat text.j2
{
{
hostvars.node1.ansible_hostname}} {
{
hostvars.node1.ansible_eth0.ipv4.address}}
{
{
hostvars.node2.ansible_hostname}} {
{
hostvars.node2.ansible_eth0.ipv4.address}}
{
{
hostvars.node3.ansible_hostname}} {
{
hostvars.node3.ansible_eth0.ipv4.address}}
还可以使用循环替换上述目的
{
% for i in groups.test01 %}
{
{
hostvars[i].ansible_hostname}} {
{
hostvars[i].ansible_eth0.ipv4.address}}
{
% endfor %}
---
- name: setup
hosts: node1 node2 node3
- name: template
hosts: node1
tasks:
- template:
src: text.j2
dest: /opt/