Linux
特点:开源,安全,稳定
发行版本:
Fedora deepin 个人办公 Debian 系统开发
Ubuntu 软件开发 redhat Centos 服务器
应用:服务器,云计算,大数据,软件开发
涉及岗位:售前,售后:测试,实施,运维,
相关证书:rhce红帽认证工程师
rhel8
一.终端命令行
语法: 主命令 选项 参数
快捷键: ctrl + l =clear
ctrl+shift + 放大终端字体
ctrl - 减小终端字体
alt . 调用上一条命令的参数
[root@localhost ~]# :
root为当前终端用户 localhost为域名 ~为路径
history !数字 :查看当前用户使用过的命令并调用
hostname 查看主机名
hostnamectl set-hostname name 更改主机名
二.文件系统结构
linux系统是由文件组成的
linux系统中最大的目录为根目录
绝对路径: 从根目录开始 /
相对路径:相对当前位置描述目的位置
pwd 查看当前终端路径位置(绝对路径)
cd 目录路径 切换目录
cd ~ 切换到当前用户家目录
cd / 切换到根
cd … 切换上级目录
cd . 切换到当前位置(刷新)
cd - 切换到上一次位置
特殊目录
bin 普通用户命令 sbin超级管理员命令 boot 引导 dev 驱动
lib lib64 函数库 media run/media u盘访问位置 run 进程信息
mnt 挂载(映射) opt软件安装位置 proc 进程 srv var 素材文件
sys 系统驱动 tmp 缓存文件 usr 可执行的文件
etc存放系统及软件配置文件 home存放用户家目录,其本身不是家目录
文件系统结构:19个固定功能的目录组成
三.文件目录管理
1.创建
mkdir 目录路径 创建目录
mkdir -p 递归创建
touch 文件目录 创建文件
2.删除
rm -rf 路径 强制删除内容不提示
3.复制与剪切,重命名
cp 要复制的源 目的位置 把内容复制到目的位置
cp -a :相当于 -pdr 的意思bai(参数pdr分别为:保留权限,复制du软链接本身,递归复制);
cp -R 要复制的递归目录 目的位置 递归复制目录到目的位置
cp -p 要复制的文件 源文件保持属性不变的复制
注:目的位置不存在,复制或剪切操作就变成复制+重命名
mv 内容路径 目的位置 剪切文件或文件夹到目的位置
4.打包压缩
tar -cvf 压缩文件名称(多个可以间隔) 要压缩的文件(用相对路径) 创建压缩文件
tar -tvf 压缩文件名称 查看压缩文件
tar -xvf 压缩文件名称 -C 解压位置 解压压缩文件
带格式的压缩 -J xzip
-j bzip2
-z gzip2
file 文件路径 查看文件格式
5.查看文件或目录
ls 选项 参数
ls -al /路径 查看所有文件,包括隐藏内容( . 开头的文件)
ls -dl /路径 查看目录本身的详细信息
ls -hl /路径 查看目录内容下详细信息,大于1k的显示单位
ls -i 查看inode编号
dr-xr-x—. 17 root root 4096 Jul 21 07:37 root
d:文件类型 -普通文件 l链接文件 b块设备 c字符设备
root root 所属 所属组
cat 文件路径 输出文件内容到终端
tac 文件路径 倒序输出
head/ tail -n 数字 查看文件(前/后n行)
tail -f 文件路径 动态查看文件后半部分内容
例子: ping 127.0.0.1 > 123
tail -f 123
more / less 文件路径 以阅读模式查看文件
ln 选项 源文件/源目录 目标路径 为目录或文件创建链接(软或硬)
数据 = 数据本身 + 元数据(数据的描述信息)
inode 编号 : linux系统用于读取查找文件的依据信息
软链接: 为文件创建快捷方式,两个文件两个inode,但数据内容一致
硬链接: 为文件创建备份,inode一致(修改链接文件不会改变源文件)
ln -d 源目录路径 目标路径 为目录创建硬链接
ln -s 源文件或目录路径 目标路径 为文件或目录创建软链接 (源文件或目录用绝对路径)
6.查询文件/筛选文本
find 范围 搜索条件(-name) 查找某个文件 (范围越小越好)
查询条件: -name 名称 -iname 名称(不区分大小写)
-size 大小 (+1M 大于1M , -1M 小于1M)
-user 用户名 按用户名称查找
find 范围 搜索条件 -exec cp {} 目的位置 ;
注: -exec 参数可以将 find查到的内容进行复制移动或删除,但是尽量不要用-name
grep 选项 关键字 文件路径 搜索文件中关键字,以行的形式显示在终端
管道符 | 左边的输出变成右边的输入
例: cat file1 | grep a 搜索file1中包含a的内容
重定向 > 正确输出 ( < 输入 )
2> 错误输出 (报错信息)
>> 正确输出重定向,不覆盖(追加) 2>> 错误输出,不覆盖
正则表达式
*任意字符任意长度
.或? 单字符任意匹配
关键字$ 以关键字结尾
^关键字 以关键字开头
(x…y) 连续匹配
(x,y) 不连续匹配
四.vim编辑器
命令模式
nyy 复制光标所在下n行
p 粘贴到光标下一行
ndd 多行剪切
编辑模式
i 从当前光标位置进入编辑模式 a 当前光标的后一位 o当前光标的下一行
以上可测试大小写
底行模式
: 或 /关键字 查询关键字
-
:wq!
-
行数1,行数2s /关键字1/关键字2/gc 内容替换(加c,单个替)
-
set nu 显示行号
-
sp 第二个文件的路径 分屏编辑文件(ctrl+ww 切换)
五.用户管理
用户: 操作并使用操作系统的角色
超级管理员用户: root uid为0
系统用户:系统服务及软件所使用的角色 uid为1~999
普通用户: 手动创建的角色 uid为1000~
用户配置文件: /etc/passwd
root❌0:0:root:/root:/bin/bash
username : password : UID : GID : GECOS(注释) : /home/dir(家目录) : shell类型(命令解释器)
用户组: 系统中某些特征相同或相似的用户组成的集合
默认情况下系统中创建一个用户会出现与之相同名称的用户组
主组:创建用户时默认的同名组 副组: 用户额外加入的分组
用户密码配置文件: /etc/shadow
id 用户名 查看用户简略信息
passwd 用户名 设置用户密码
useradd 选项 用户名 创建用户
usermod 选项 用户名 修改用户信息
选项: -u 指定uid
-g 指定gid或主组
-c 注释信息
-h 家目录路径 指定用户家目录
-s 指定shell类型
userdel -rf 用户名 删除用户(-rf 才能完全删除用户及其痕迹)
usermod -G 组名1,组名2 -a 用户名 添加一个用户到指定的组,但是以前添加的组就会清空掉。
用户组管理
gpasswd 选项 用户名 组名
想要添加一个用户到一个组,同时保留以前添加的组时,请使用 gpasswd 这个命令来添加操作用户:gpasswd -a user_name group_name
可选项参数:
- -a:添加用户到组;
- -d:从组删除用户;
- -A:指定管理员;
- -M:指定组成员和-A的用途差不多;
- -r:删除密码;
- -R:限制用户登入组,只有组中的成员才可以用newgrp加入该组。
groupadd 选项 组名 创建组
groupmod 选项 组名 修改组
groupdel -rf 组名 删除组
groups 用户名 显示用户所属的组
sudo 命令 临时以root用户执行该命令
默认情况下只有wheel分组的用户才能使用,该设定的配置在/etc/sudoers 文件中
su - 用户名 切换用户 切换之后exit退出
单用户模式下修改root密码
-
重启,在系统开机选择系统时,默认第一个,按下e进入引导
-
在kernel为首的行尾,在行尾输入 rd.break ,按下ctrl+x,进入单用户模式
-
#mount -o remount,rw /sysroot 将根目录重新挂载
#chroot /sysroot/
#passwd root
#touch .autorelabel 更新selinux
#exit
#exit
usermod -s /sbin/nologin user 修改用户shell类型
六.权限管理
1.基本权限
r=4 w=2 x=1
drwx r-x r-x. 所属用户 所属组(组内的用户) 其他用户
文件 目录
r 是否读取文件内容 读取目录下内容的详细信息
w 修改 管理目录下的内容
x 执行二进制命令文件 是否能切换进目录
命令语法
chown 所属人:所属组 文件路径 修改文件所属
chown -r 所属人:所属组 目录路径 修改目录及子目录所属
chown 数字(777,740,等等) 文件目录或路径 按数字修改权限
给所有人/tmp最高权限: chown -r 777 /tmp
chmod 角色动作权限 文件目录路径
角色: u(user) g(group) o(other) a(all) 动作:+ -
2.特殊权限
suid(u+s) sgid(g+s) sbit(o+t)
suid,sgid ----> 可执行文件
sgid,sbit —> 目录
-
suid: 对可执行文件,如果该文件有此权限,任何可以执行此文件的用户都将以该文件所属人的身份执行,例如修改密码的操作,是借用root身份完成的
-
sgid: 针对此目录,如果该目录有权限,此目录下创建的子目录将继承sgid权限以及其父目录的所属组,但子文件只会继承所属组权限
-
sbit: 针对于共享目录,如果此共享目录有此权限,那么除root以及共享目录所属人之外的其他用户在此目录下只能管理属于自己的内容
suid 用s标示到所属人x位,若无x权限,那么s大写,对应数字4
sgid 用s标示到所属组x位,若无x权限,那么s大写,对应数字2
sbit 用s标示到其他用户x位,若无x权限,那么x大写,对应数字1
例,给tmp增加sbit权限 chmod 1777 /tmp
给tmp增加sgid权限 chmod g+s /tmp
例: 将passwd命令文件的suid权限去掉,然后使用普通用户修改自己密码,观察现象
3.权限访问控制 facl
针对单个用户或单个用户组
getfacl 目录 查看目录的facl
setfacl -m u:用户名:—(rwx) 路径 给目录或文件设定单独用户权限(任意设定)
setfacl -m u:zhangsan:— /
setfacl -m g:用户组名:—(rwx) 路径 给目录或文件设定单独用户组权限
setfacl -x u:用户名 路径 删除特定的 facl
setfacl -x u:zhangsan /
setfacl -b 清空 facl
mask 用于限制facl设定的权限大小,默认以facl最大权限(rwx)为准 注:限制的是文件所属人和所属组的权限
setfacl -m mask:权限 目录或文件路径 设定mask值限制权限
setfacl -m mask:r-- /etc
如果先设置mask值,再设置与用户的特殊权限,则前面的操作会被重置
4.umask值修改
umask 值决定了创建目录或文件的默认权限,文件与777取反,目录与666取反
vim /etc/bashrc
此文件是shell脚本,运行时需要用source方式,修改目录,在当前终端立即生效
七.网络配置
基础命令
enp4s0f1
en: 以太网 p:总线 s:插槽
ip addr 查看网卡信息
ifconfig 查看网卡信息
route 查看路由信息
tracepath 网址 追踪路由
ip link show 查看本地链路
配置网卡
-
设置-图形化界面
-
控制面板配置: nm-connection-editor 打开图形化网卡配置
-
类图形化: nmtui
-
通过配置文件配置网卡信息:/etc/sysconfig/network-scripts/ifcfg-网卡名称
TYPE=“Ethernet” 链接类型
BOOTPROTO=“dhcp” 地址获取方式DEFROUTE=“yes” 默认路由是否开启
NAME=“ens160” 链接名称
UUID=“d3058275-0219-49ce-8a0b-778a5b4cab9a” 设备唯一识别号
DEVICE=“ens160” 链接启用在那个网卡上
ONBOOT=“yes” 网卡服务启动时默认启动哪个链接ipaddr 配置网卡ipv4地址
prefix 掩码
gateway 网关
dns1 dns服务器
nmcli device
nmcli connection show
nmcli connection up 链接名称 启用该链接
nmcli connection down 链接名称 不启用该链接
nmcli connection delete 链接名称或uuid 删除链接
nmcli connection modify 链接名 参数 修改此链接
nmcli connection add type ethernet ifname ens160 con-name ens ipv4.method manual ipv4.address 192.168.25.110/24 ipv4.gateway 192.168.25.2 ipv4.dns 192.168.25.2 connection.autoconnect yes
新建网卡链接,创建一个Ethernet类型的链接在ens160网卡上面,链接名为ens,手动获取地址,地址为192.168.25.110/24 网关为192.168.25.2 dns地址为 192.168.25.2 切当网卡启动时自动启用该链接
修改网卡配置
ifconfig
cd /etc/sysconfig/network-scripts/
ll ifcfg-*
vim ifcfg-ensXXX
systemctl restart network
验证网络链接
查看本地链路 ip link show
显示性能统计信息 ip -s link show ens160
- 显示内容包括:收到(RX)和传出(TX)的数据包数,数据包错误数,丢弃的数据包数
查看网卡 ip addr show ens160
追踪路由 traceroute access.redhat.com (tracepath)
端口和服务故障排除
ss 显示套接字统计信息
- ss -ta
八.selinux 安全的linux
三大状态:开启状态,监听状态,关闭状态
/etc/selinux/config
-
enforcing : 开启状态,此状态下selinux处于启动状态,监听系统,拦截违法操作,并且告警管理员
-
permissive : 监听状态 此状态下selinux 不会拦截违法操作 ,但会告警
-
dissabled : 关闭状态
selinux状态判断依据:
上下文 某个服务或应用的专属标签
上下文是文件,端口,进程的一种标签属性,selinux通过观察文件或端口的上下文是否与相关服务动作匹配,如果匹配,则允许操作,不一致则阻拦
ls- Zl 查看文件或目录的上下文
semanage port -l 查看所有端口上下文
netstat -anp | grep 端口号 查看端口使用情况
-a 显示所有socket,包括正在监听的。 -n 以网络IP地址代替名称,显示出网络连接情形。 -p 显示指定协议信息。
semanage fcontext -a -t admin_home_t ‘/tmp/123(/.*)?’ 修改 /tmp/123 文件的上下文为 admin_home_t
restorecon -RFv 文件或目录路径 更新上下文
semanage port -a -t http_port_t -p tcp 8089 修改 tcp端口 8089的上下文为 http_port_t
布尔值 : 系统和服务程序功能开关
getsebool -a 查看布尔值
setsebool -P 布尔值 on/off 设置布尔值开关
九.守护进程
1.系统启动过程
加电自检 —> 加载BIOS系统固件 —> 读取bios系统设置找到引导 (引导方式) —> 引导完成后按配置加载对应系统
内核态 , 用户态
systemd 为系统内核加载启动的第一个进程 pid 为1,之后由此进程启动其他开机启动项,(根据 /etc/systemd/system/ 目录下设定好的启动服务进行启动),所以systemd为所有进程的父进程,也称守护进程.
2.rhel8的四个目标态
- graphical.target 多用户,支持文本,图形化状态
- multi-user.target 多用户,支持文本,命令行状态
- rescue.target sulogin登录提示,系统基本初始化完成
- emergency.target sulogin 登录提示,系统以只读方式挂载到 /
-
用户切换目标态 : systemctl isolate 目标态(上面的1~4)
-
用户设定默认目标态 : systemctl set-default 目标态
-
查看系统目标态: systemctl get-default
注 : init 2 命令行模式 init5 图形化界面
十.进程管理
进程之间关系 : 父与子
pstree 查看系统进程树
ps -aux 静态查看系统所有进程
top 动态查看 系统所有进程
- 按下: P–cpu 存储 排列 ; M–内存排列 ; T–运行时间排列
ps -lax 以长列表查看
kill 信号 pid
- 查看信号 man 7 singal
kill pid 杀死进程(默认参数为-15)
kill -9 pid 强制关闭进程
进程优先级 :
pr : 动态优先级 , 由cpu计算得出
ni : nice值,可以人为影响pr优先级 ( n = -20~19)
指定nice值运行进程 nice -n n 命令
对正在运行进程的nice值进行修改 renice -n n pid
作业管理
jobs 查看终端运行的作业
kill %作业号 关闭作业
ctrl + z 将作业放到后台暂停运行
fg %作业号 将后台运行的作业调度到前台运行
bg %作业号 将后台暂停的作业在后台恢复运行
命令 + & 在后台运行此命令
注 : 前台只允许运行一个进程
十一.计划任务
1.定时任务
at hh:mm yy-mm-dd 创建一个定时任务
echo XXX > /root/atjobs
sync 同步
ctrl + d 停止
atq 查看现有的定时任务号
at -c 任务号 查看任务内容
atrm 任务号 删除定时任务
2.周期性计划任务
在无人值守时,服务器自动周期性运行计划任务
crontab -e 创建周期性计划任务
crontab -r 删除当前用户周期性计划任务
crontab -l 查看当前用户周期性计划任务
crontab -e -u 用户名 只有root能指定其他用户的计划任务
分 时 日 月 周 任务
#每周一早上8点执行一次
* 8 * * 1 echo XXX
#每周末凌晨1点到3点,每隔30分钟执行一次
0 1,1.5,2,2.5,3 * * 7 echo 123
任意时间用*
x,y 不连续的两个时间点
x-y 连续的时间点
*/n n是间隔时间,每隔n个间隔
十二.软件安装
编译安装 --> rpm安装 --> yum安装
rpm软件安装主要用于单个软件安装包安装
yum用于多个安装包打包安装,yum可以解决软件依赖性关系和顺序问题,但需要提前设定好软件仓库
软件安装包来源 : 本地镜像,网络下载单个安装包,
https://mirrors.tuna.tsinghua.edu.cn/centos/8/isos/x86_64/CentOS-8.2.2004-x86_64-dvd1.iso
yum安装需要编写yum源文件指向本地镜像或网络镜像,系统才能查询到安装包, yum源路径 /etc/yum.repos.d/name.repo
vim /etc/yum.repos.d/linux1.repo
本地镜像yum源文件
仓库名称
是否启用仓库
是否进行gbg检测 检测镜像完整性
镜像路径 (本地镜像 file://路径 网络镜像 http://路径)
查看本地镜像路径 df -hT sr0设备的挂载点
网络镜像源yum文件内容
https://mirrors.tuna.tsinghua.edu.cn/centos/8/AppStream/x86_64/os/
https://mirrors.tuna.tsinghua.edu.cn/centos/8/BaseOS/x86_64/os/
两个文件源不能一致
yum clean all 清除缓存
任务 | 命令 |
---|---|
按名称列出以安装和可用的软件包 | yum list [NAME-PATTERN] |
列出以安装和可用的组 | yum group list |
按关键字搜索软件包 | yum search KEYWORD |
显示软件包的详细信息 | yum info PACKAGENAME |
安装软件包 | yum install PACKAGENAME |
安装软件包组 | yum group install GROUPNAME |
更新所有软件包 | yum update |
删除软件包 | yum remove PACKAGENAME |
显示事务历史记录 | yum history |
模块流
模块流 : 进一步将某应用的所有支持软件及插件全部打包,按不同版本分不同流,每次系统安装只能安装一个版本的
yum module info --profile 软件包名 列出模块内置包信息
yum module list 列出当前镜像源中的所有模块
yum moudule 使用举例:
- yum module enable mariadb 启用mairadb模块
- yum module install mariadb 安装mariadb 模块中的软件安装包
- yum module update 模块名称 更新模块中的安装包
- yum module disable 模块名称 禁用模块流
- yum module remove 模块名称 卸载模块中的安装包
十三.硬盘管理
linux 系统根据硬盘接口不同,命名不同
IDE : hd scls ,sata : sd 虚拟机硬盘 : vd
硬盘处理流程 : 分区 ----格式化 (制作文件系统) ----挂载(映射)
ntfs fat32
第一步:分区
分区方案 : MBR(主引导记录) , GPT
MBR分区信息表占64字节,一个分区占16字节,GBT远超MBR分区方案,理论分区数量可达128个,命令为gdisk
mbr分区方案中,分区有三种类型 :
主分区 (占用分区信息表) , 扩展分区(占用分区信息表) , 逻辑分区(不占分区信息表)
MBR 命令: fdisk 硬盘路径(/dev/sda) 使用fdisk命令进行分区
partprobe 硬盘路径 更新硬盘分区到系统
lsblk 查看系统中块设备信息
第二步:格式化
mkfs.xfs(任意文件系统格式) sda1(任意分区路径) 格式化分区
blkid /dev/sda1(sdb1…) 查看系统中所有格式化后分区的文件系统格式
常见的文件系统格式 : ext2,3,4 , fat32 , xfs , iso9660 , ntfs
第三步:挂载
临时挂载 : mount 要挂载的分区路径 挂载点目录路径 (要挂载到哪个路径)
卸载挂载 : umount
永久挂载 : 手动配置 /etc/fstab 文件编写挂载信息
要挂载的分区路径 挂载点目录路径 文件系统格式 挂载选项 0 0
/dev/sda1 /mnt1 xfs defaults(默认挂载选项) 0(不进行文件系统完整性校验) 0(不进行kdump备份)
df -hT 查看系统中挂载信息
mount -a 重新读取fstab文件
第四步:交换分区
交换分区又称虚拟内存,主要空间来源为硬盘空间,当物理内存不足时,系统调用交换分区空间充当内存,但交换分区速度远远不及物理内存,只应急使用
格式化 : mkswap 分区路径 将普通分区格式化为swap分区
挂载 : vim /etc/fstab
书写格式 : 交换分区路径 swap swap defaults 0 0
相关命令:
swapon 查看系统的交换分区
swapon -a 启用系统中所有的交换分区
swapon 交换分区路径 指定启用某一交换分区
swapoff 交换分区路径 关闭某一交换分区
swapoff -a 关闭系统中所有交换分区
十四.逻辑卷管理
逻辑卷技术(lvm)
解决了传统硬盘分区无法进行分区大小灵活调整的问题
pp : 物理分区(可以是主分区,也可以是逻辑分区)
pv : 物理卷(由物理分区创建,一个分区一个卷)
vg : 卷组(由多个或单个分区组成)
lv : 逻辑卷(从卷组中创建,可灵活调整)
le , pe : 逻辑卷物理单元,默认单个4M ,大小可调,但必须是4的倍数
-
创建:
pvcreate 分区路径 (例如/dev/sda1)
vgcreate 卷组名 要添加到卷组的物理卷路径
lvcreate -n 逻辑卷名 -L 空间大小 卷组名
lvcreate -n 逻辑卷名 -l pe个数 卷组名
-
删除:
pvremove 物理卷 删除物理卷
vgremove /dev/卷组名 删除卷组
lvremove /dev/卷组名/逻辑卷名 删除逻辑卷
-
扩容:
vgextend 卷组名 物理卷路径
lvextend -L +大小 /dev/卷组名/逻辑卷路径
lvextend -l +pe个数 /dev/卷组名/逻辑卷路径
-
缩减:
vgreduce 卷组名 物理卷路径
lvreduce -L -大小 /dev/卷组名/逻辑卷路径
lvreduce -L -pe个数 /dev/卷组名/逻辑卷路径
-
调整:lvresize -L 大小 /dev/卷组名/逻辑卷路径(扩容或者缩减)
【lvm管理过程】
(1)挂载物理磁盘;
(2)将物理磁盘初始化为物理卷PV;
(3)将一个或多个物理卷PV转变为一个卷组VG;
(4)从VG中创建逻辑卷.
(5)根据实际需要将逻辑卷挂载使用.
(6)根据需要对磁盘or逻辑卷进行扩展和缩减.
#LVM
#创建逻辑卷
#1.准备物理设备,使用parted,fdisk创建分区,如有必要,使用partprobe向内核注册新分区
parted -s /dev/sda mkpart primary 1MiB 769MiB
parted -s /dev/sda mkpart primary 770MiB 1026MiB
parted -s /dev/sda set 1 lvm on
parted -s /dev/sda set 2 lvm on
#2.创建物理卷(创建好的pv用于创建或者扩展vg)
pvcreate /dev/sda2 /dev/sda1
#3.创建卷组(vg大小为pv之和,以pe数计算)
vgcreate vg01 /dev/sda1 /dev/sda2
#4.创建逻辑卷
lvcreate -n lv01 -L 700M vg01
#lv的大小从vg中获取,如果vg不够,命令失败,如果大小不完全匹配,将四舍五入到物理块大小的倍数
#lv创建示例:
lvcreate -L 128M #大小正好为128M
lvcreate -l 128 #128个区块
#5.添加文件系统
mkfs -t xfs /dev/vg01/lv01 #在lv上创建xfs文件系统
mkdir /mnt/data #创建挂载点
echo '/dev/vg01/lv01 /mnt/data xfs defaults 1 2' >> /etc/fstab #
mount /mnt/data #挂载文件系统
#删除逻辑卷
#1.准备文件系统 先将保留的数据备份到另一个文件系统,并删除fstab相关条目
umount /mnt/data
#2.删除逻辑卷
lvremove /dev/vg01/lv01
#3.删除卷组
vgremove vg01
#4.删除物理卷
pvremove /dev/sda1 /dev/sda2
#扩展卷组
parted -s /dev/sda mkpart primary 1027MiB 1539MiB
parted -s /dev/sda set 3 lvm on #新建分区
pvcreate /dev/sda3 #准备物理卷
vgextend vg01 /dev/sda3 #对vg01进行扩展
vgdisplay vg01 #验证Free PE / Size项不为零
#缩减卷组
pvremove /dev/sda3 #使用之前要先备份lv上的数据
vgreduce vg01 /dev/sda3
#扩展逻辑卷
vgdisplay vg01 #查看可用物理区块数,PE数不足则需要先扩展卷组
lvextend -L +300M /dev/vg01/lv01 #将lv01增加300MiB
#扩展lv示例
lvextend -l 128 #调整为128区块
lvextend -l +128 #添加128区块
lvextend -L 128M #调整为128MiB
lvextend -L +128M #添加128MiB
lvextend -l +50%FREE #向LV添加VG中当前可用空间的50%
#扩展文件系统(xfs)
xfs_growfs /mnt/data/ #data为挂载点
df -h /mnt/data #验证已挂载的文件系统大小
#扩展逻辑卷和文件系统(ext4)
vgdisplay VGNAME #验证可用空间(PE数)
lvextend -l +128M /dev/vgname/lvname #为LV扩展128MiB
resize2fs /dev/vg01/lv01 #-p可监控操作进度
#以上两种区别为参数不同,xfs采用挂载点,ext4采用逻辑卷名称
#扩展逻辑卷和交换空间
#同样先查看空闲物理区块
swapoff -v /dev/vgname/lvname #停用逻辑卷上的交换空间
lvextend -l +128M /dev/vgname/lvname #扩展LV
mkswap /dev/vgname/lvname #将LV格式化为交换空间
swapon -va /dev/vgname/lvname #激活
文件系统大小调整
扩容:
xfs_growsfs 分区路径或逻辑卷路径 扩容分区或逻辑卷的文件系统到所有容量(xfs文件系统格式)
resize2fs 分区路径或逻辑卷路径 扩容分区或逻辑卷的文件系统到所有容量(ext4文件系统格式)
十五.高级存储技术
1.stratis 分层管理
yum install stratis-cli stratisd 安装stratisd服务
systemctl enable stratisd 设置该服务开机自启
systemctl enable --now stratisd 激活stratisd服务
stratis pool create poolname 要添加进池的硬盘路径 创建存储池
stratis pool add-data poolname 要添加进池的硬盘路径 为存储池添加新硬盘
stratis filesystem create poolname 文件系统名 为存储池添加新文件系统
stratis filesstem snapshot poolname 文件系统名 快照名 为文件系统创建快照
stratis blockdev list 池名称 查看此存储池中的硬盘设备
2.压缩存储 VDO
vdo属于红帽系统中设备映射驱动器,主要减少块设备上的磁盘空间使用,最大限度减少数据重复,从而节省磁盘空间.
vdo由 kvdo模块和uds组成,kvdo用于透明方式控制数据压缩,uds用于重复数据删除
#1.安装软件
yum install vdo kmod-kvdo
#2.创建vdo卷
vdo create --name=vdo卷名 --device=作为vdo卷的磁盘路径 --vdoLogicalSize=大小
#(若省略逻辑大小,则生成的VDO卷将与其物理设备的大小相同。并且由于vdo的去重和压缩特性,逻辑大小的设置完全可以大于实际磁盘的物理空间。)
#3.格式化
首先查看vdo卷的路径 vdostats
然后进行格式化 mkfs -t ext4 vdo卷的路径
#4.挂载(临时挂载)
mount vdo卷的路径 挂载点
#5.查看vdo卷的存储情况
vdostats --human -readable
#注意点:vdo永久挂载
uuid(或路径) /mnt/vdo1 ext4 defaults,x-system.requires=vdo.service 0 0
#分析vdo卷
vdo status --name=vdo卷名 使用yml语法输出vdo信息
vdo list --name=vdo卷名 列出vdo卷
vdo start --name=vdo卷名 启动vdo卷功能
vdo stop --name=vdo卷名 停止vdo卷功能
vdostats --human-readable 查看卷的初始统计信息以及状态
注: 使用vdo卷就像使用一个分区一样,创建后正常的格式化,挂载
如果出现报错;vdo卷冲突,那么很有可能就是之前的操作可能有数据残留。可以使用vdo remove–name=卷名 来清空vdo卷的残留配置。
rhce中级
shell脚本+了解各类服务
ansible自动化
linux操作系统的操作手段
- 命令式—在命令行中以交互的方式输入各类命令
- 批处理式—shell脚本
shell脚本的构成
-
脚本声明
用于声明该脚本运行时使用的shell,要求写在脚本的第一行
语法结构
#!/bin/bash
-
注释声明
可以写在脚本的任意一行,用于解释说明脚本或脚本中部分代码行的功能,在脚本中不起实质性作用
语法结构
#任意字符串
-
可执行语句
由linux的基础命令与逻辑语言构成,是脚本实际运行的部分,系统会按照这部分的命令由上至下依次运行命令
实例:
请在屏幕上打印输出文字HelloWord!
#!/bin/bash
#print helloword
echo Hello W
shell脚本的运行方式
1.在命令行中直接输入脚本的绝对路径
当脚本被存放于当前工作目录时,可以直接输入 ./脚本名
chmod a+x 脚本名
2.使用命令sh运行脚本
sh 脚本路径
3.使用命令source运行脚本
source 脚本路径 修改当前终端设定时需要用此方式运行脚本
4.自建命令
将脚本存放到系统环境变量PATH所指定的目录下,此时可直接输入脚本名来运行脚本
PATH变量决定了系统搜索命令的范围
echo $PATH 查看path变量值
cp 1.sh /usr/bin/aaa
chmod a+x aaa
aaa
临时修改 PATH=$PATH:新的路径(例如: /root)
永久修改 将上述命令写到文件 /etc/bashrc(所有用户有效)或者 ~/.bashrc(仅指定用户有效)的末尾
编写shell脚本时常用的特殊符号
符号 | 含义 |
---|---|
# | 注释符 |
\ | 反斜线,取消其后一位字符的特殊含义 |
‘’ | 单引号,取消其内全部字符的特殊含义 |
“” | 双引号,取消其内全部字符的特殊含义,但不取消$ ``(反引号)的作用 |
`` | 反引号,用于将其内部的字符串强行当作命令事先运行 |
$() | 命令替换,用于将其字符串替换为内部命令运行的结果 |
$[] | 算数扩展,用于进行整数型计算 $[11**2] =121 常用±*/%(命令bc可以完成小数计算) |
= | 赋值符,用于定义变量以及变量的值.结构: 变量名=值 注意为了于命令区分,变量要求大写 |
$变量名 | 用于调用变量值 |
for循环语句
用于重复的多次运行一个或一组命令
语法结构1:
for 字符串(变量) in 字符串1 字符串2 字符串3 字符串N
do
命令列表
done
语法结构2:
for STR in {1…N} #STR=1,STR=2…STR=N
do
命令列表
done
语法结构3:
for ((I=1;I<5;I++))
do
命令列表
done
例:将当前目录输出到/tmp目录下并改为原名.old
#!/bin/bash
for AA in $(ls)
do
cp -r $AA /tmp/$AA.old
done
参数赋值法
$1 | 表示脚本运行时跟随在脚本后面的第一个字符串 |
---|---|
$2 | 表示脚本运行时跟随在脚本后面的二个字符串 |
${10} | 表示脚本运行时跟随在脚本后面的第十个字符串 |
$# | 表示脚本后跟随的字符串个数,这是一个数字 |
$@ | 表示脚本后跟随的所有字符串,每个字符串仍视为一个个体(一次只取其中一个) |
$* | 表示脚本后跟随的所有字符串,所有的字符串视为一个 |
用于验证 @ 和 @和 @和*区别的脚本
#!/bin/bash
echo $#
echo ----------------------------------------------
for A in "$@" #for A in "1",for A in "2" ...
do
echo $A
done
echo ----------------------------------------------
for B in "$*" #for A in "1 2 3..."
do
echo $B
done
read 交互赋值法
read -p '字符串 ’ 变量
#!/bin/bash
read -p 'Please input a number: ' NUM
echo $[$NUM**3]
if条件语句
语法结构1
if [条件] ; then
命令列表
fi
语法结构2
if [条件] ; then
命令列表1
else
命令列表2
fi
语法结构3
if [条件1] ; then
命令列表1
elif[条件2] ; then
命令列表2
else
命令列表N
fi
case判断语句
case 字符串 in
字符串1)
命令1
;;
字符串2)
命令2
;;
字符串3)
命令3
;;
esac
条件
1.数值比较
语法结构 : [ 数字 符号 数字 ]
常用符号: -eq= -gt> -ge>= -lt< -le<=
2.字符比较
语法结构: [ “字符串” 符号 “字符串” ]
常用符号: = == (都是等于) !=
语法结构: [ 符号 “字符串” ]
常用符号: -z 其后字符串的长度为0则条件成立
-n 其后字符串长度不为0则条件成立
3.文件比较
语法结构: [ 符号 路径]
常用符号: -f 存在且是一个文件则成立
-d 存在且是一个目录则成立
-e 存在则成立
-s 存在且大小为0则成立 用于判断文件是否为空
-b 存在且是一个块设备文件则成立
-r 存在且有读权限成立
-w 存在且有写权限则成立
-x 存在且有执行权限则成立
4.逻辑比较
与判断 [ 条件1 ] && [ 条件2 ] 1不成立,跳过2 ; 1成立,继续判断2
或判断 [ 条件1 ] ||[ 条件2 ] 1成立,则跳过2 ; 1不成立,继续判断2
非判断 ![ 条件 ] 取反
shell练习
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-hJ9NNv2s-1606014847788)(E:\study\note\shell练习题.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ly1tGoX6-1606014847791)(E:\study\note\答案1.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5pb0Hp4Q-1606014847794)(E:\study\note\答案2.png)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-EeTnaKdQ-1606014847798)(E:\study\note\答案3.png)]
网络服务
1.存储类服务 重点
nfs—网络文件系统(共享文件夹)
cifs—通用因特网文件系统,windows默认 (在linux被叫做samba:基于smb协议完成共享目录的软件)
iscsi—因特网小型计算机系统接口(共享硬盘)
实验:nfs
#服务器部分(192.168.199.101)
[root@fanssi ~]# mkdir /srv/nfs
[root@fanssi ~]# chmod 777 /srv/nfs/
[root@fanssi ~]# vim /etc/exports
[root@fanssi ~]# cat /etc/exports
/srv/nfs/ 49.234.224.0/24(rw)
[root@fanssi ~]# systemctl restart nfs-server
[root@fanssi ~]# systemctl enable nfs-server
Created symlink /etc/systemd/system/multi-user.target.wants/nfs-server.service → /usr/lib/systemd/system/nfs-server.service.
[root@fanssi ~]# firewall-cmd --permanent --add-service=nfs
#允许nfs的流量通过服务器
success
[root@fanssi ~]# firewall-cmd --reload
success
[root@fanssi ~]# mkdir ...
#客户端部分( 49.234.224.0)
[root@ ~]# mkdir /mnt/dir1
[root@ ~]# mount 192.168.199.101:/srv/nfs /mnt/dir1
[root@ ~]# df -hT
[root@ ~]# cd /mnt/dir1
[root@ ~]# mkdir ...
实验iscsi:
#服务端
yum install targetcli
systemctl enable target
systemctl start target
targetcli #运行
cd /backstores/block #将硬盘接入
create dev=/dev/sdb name=disk1 #让软件识别此硬盘
cd /iscsi
create iqn.2020-11.com.fanssi:disk1 #全局唯一辨识名,用于给iscsi进行身份识别
cd iqn.XXXXX:disk1/tpg1/
cd acls #允许访问者名单(客户端的iqn)
create iqn.1994-05.com.redhat:2cd5c221a76f #客户端的iqn
cd luns
create /backstores/block/disk1 #将硬盘加入到此目录下
#是为了将sdb与iqn绑定
cd portals
create 本机ip #监听,数据流从此网卡进出
cd /
saveconfig
exit
iscsi端口号3260
firewall-cmd --permanet --add-port=3260/tcp
firewall-cmd --reload
#客户端
[root@fanssi Downloads]# cat /etc/iscsi/initiatorname.iscsi
InitiatorName=iqn.1994-05.com.redhat:2cd5c221a76f
#如果是windows,在控制面板搜索iscsi
yum list installd | grep iscsi #客户端软件
iscsiadm
man iscsiadm
/EXEMPLE
#Discover 复制第一步,修改服务器ip地址
#Login 第二步
fdisk
mkfs.ext4 /dev/sdb1
mkdir /mnt/disk2
vim /etc/fstab
/dev/sdb1 mnt/disk2 ext4 defaults,_netdev 0 0 #注意,必须加_netdev否则系统无法开机
mount -a
实验http:
#服务端
yum install httpd
systemctl enable httpd
systemctl start httpd
firewall-cmd --permanent --add-service=http
firewall-cmd --reload
#浏览器输入服务器地址
cd /var/www/html/
vim index.html #(主页)
2.应用类服务
http—超文本传输协议(aphace,nginx,IIS) 重点
https—基于SSL的超文本传输协议
database—数据库(mariadb,mysql,oracle,sqlserver)
ftp—文件传输协议
mail—邮件服务(postfix,sendmail)
3.网络类服务
DNS—域名系统
DHCP—动态主机配置协议
Ansible自动化
- 无代理式
- 通过ssh或者winr进行数据传输
- 支持linux,windows,unix,cissco,华为,华三等操作系统和网络设备
- 是一款devops工具(开发运维)
Ansible架构
- 管理主机:需要安装ansible程序、编写ansible代码、管理其他主机
受管主机:被ansbile管理的计算机,支持python即可,多数情况这类主机就是企业中的业务主机 - 由于采用SSH进行通讯,多数情况下需要配置管理主机到受管主机的SSH公钥认证(免密认证)
- 一般情况下为了系统安全,ssh不会直接连接受管主机的root用户,而是连接至一个普通用户,然后通过sudo进行提权
- 在管理主机上,ansible至少拥有三类文件:1.配置文件ansible.cfg 2.清单文件 3.playbook(剧本)
Ansible部署的准备工作
第一步:准备一台管理主机和若干的受控主机,并调整相应的主机名以及IP地址
主机名 | ip |
---|---|
fanssi.com | 192.168.199.101 |
servera.fan.com | 192.168.199.10 |
serverb.fan.com | 192.168.199.20 |
serverc.fan.com | 192.168.199.30 |
serverd.fan.com | 192.168.199.40 |
第二步:配置域名解析,此处可以是
的DNS服务,也可以配置hosts文件
在所有主机上执行
vi /etc/hosts
末尾追加:
192.168.15.200 workstation.fan.com workstation
192.168.15.10 servera.fan.com servera
192.168.15.20 serverb.fan.com serverb
192.168.15.30 serverc.fan.com serverc
192.168.15.40 serverd.fan.com serverd
第三步:创建ansible实验专用用户
在所有主机上执行
useradd ansible
echo “1” | passwd --stdin ansible
第四步:配置管理主机的ansible用户到受控主机的ansible用户的ssh公钥认证
在控制主机上
ssh-keygen 在本地生成公钥
ssh-copy-id ansible@servera 将公钥发给主机上的对应用户
第五步:配置受控主机上的ansible用户允许执行sudo,并不需要密码
在受控主机上
visudo
最后一行加入
ansible ALL=(ALL) NOPASSWD: ALL
第六步:配置管理主机的本地yum仓库
cat /etc/fstab
/dev/sr0 /media/cdrom1 iso9660 defaults,ro,noauto 0 0
vim /etc/yum.repos.d/iso.repo
[BaseOS]
name=Red Hat Enterprise Linux 8.0 BaseOs iso
enabled=1
gpgcheck=0
baseurl=file:///media/cdrom1/BaseOS
[AppStream]
name=Red Hat Enterprise Linux 8.0 AppStream iso
enabled=1
gpgcheck=0
baseurl=file:///media/cdrom1/AppStream
安装ansible的临时仓库
vim /etc/yum.repos.d/a.repo
[ansible]
name=1
gpgcheck=0
enabled=1
baseurl=file:///media/cdrom2/ansible-2.8-for-rhel-8-x86_64-rpms
yum install ansible
ansible的清单文件
用于决定控制主机管理的主机清单列表
该文件采用的ini文件格式
清单文件示例1:
servera.yutianze.com
serverb.yutianze.com
serverc.yutianze.com
serverd.yutianze.com
清单文件示例2:
[web]
servera.yutianze.com
serverb.yutianze.com
[db]
serverc.yutianze.com
serverd.yutianze.com
清单文件示例3:
[server]
server[a:d].yutianze.com
清单文件示例4:
[web]
servera.fan.com
serverb.fan.com
[db]
serverc.fan.com
serverd.fan.com
[testserver:children]
web
db
默认文件清单文件为:/etc/ansible/hosts文件
但是多数情况下不会使用该文件作为清单文件,而且在配置文件中指定清单文件的位置,或者是在运行命令ansible和命令ansible-playbook时使用选项 -i 路径 的方式进行指定清单文件。
三种清单文件的优先级:命令-i > 配置文件指定 > 默认清单
ansible的配置文件
用于决定ansible命令运行时使用的各类相关配置,例如:清单文件是谁,远程受控主机哪一个用户等等
- 默认配置文件的路径为:/etc/ansible/ansible.cfg文件
- 但是多数情况下也不会使用该文件作为配置文件使用,而是会创建一个ansible专用的工作目录,然后在该工作目录下创建一个名为ansible.cfg的文件作为配置文件使用。
常用配置文件示例:
[defaults]
inventory=./hosts #清单文件位置
remote_user=ansible #远程受控主机的用户名
ask_pass=False #ssh连接时不提示输入密码
[privilege_escalation] #特权升级
become=True #是否在远程后成为另外一个用户
become_method=sudo #成为用户的方式,sudo 和 su
become_user=root #成为哪一个用户
become_ask_pass=False #成为该用户时不提示输入密码
- 除了以上配置文件的路径外,有时还会在用户的家目录下生成一个隐藏的配置文件: ~/.ansible.cfg
三种配置文件的优先级
./ansible.cfg > ~/.ansible.cfg > /etc/ansible/ansible.cfg
查看当前使用的配置文件 ansible --version
命令ansible的使用方法
用于在控制主机上使用命令的方式直接对受控主机进行操作
这种用法被称为ansible临时命令,又名ad-hoc命令
语法结构:
ansible 主机列表 -m 模组名 [ -a '模组专用语法' ] [ -i 清单文件路径 ]
#示例:测试受控主机的网络联通性
ansible all -m ping
ansible常用模组
所谓的模组其实是在系统中事先编写好一个python程序,这些python程序是被存放在控制主机上,当在控制主机上运行ansible命令时,系统会通过预设的方法(默认ssh)将这些python程序传输到受控主机上,并运行。
-
文件模块:
file 用于在受控主机创建文件或者目录,也可以用于修改权限
copy 用于将控制主机上的文件拷贝到受控主机
lineinfile 用于修改受控主机上某个文件中的某行数据
blockinfile 用于以段落的方式修改受控主机上的文件 -
软件包模块
yum 用于yum安装软件
yum_repository 用于配置yum软件仓库
atp 用于atp安装软件 -
系统模块
firewalld 用于控制调整防火墙
reboot 用于控制主机重新启动
service 用于控制服务的启动与关闭
user 用于创建或者删除用户
group 用于创建或者删除组 -
Net tools 模块
命令ansible-doc用于查看各个模块的帮助
-
用法一:列出当前已经支持的所有ansible模块
ansible-doc --list ansible-doc --list | grep 关键字
-
用法二:列出某个模块的用法
ansible-doc 模块名
以user模块为例,展示ansible-doc和ansible命令的使用
查看user模块的用法 ansible-doc user
#在所有受控主机上创建一个名为johnd, uid为1040, 主组为ansible的用户
ansible all -m user -a 'name=johnd uid=1040 group=ansible'
#练习:写一个ad-hoc命令,实现在servera上创建一个名为/tmp/ansible.txt的文件(模块file)
ansible servera.fan.com -m file -a 'path=/tmp/ansible.txt state=touch'
利用ansible命令直接向对应主机运行linux的命令
ansible 主机列表 -m command -a '命令的绝对路径'
ansible 主机列表 -m shell -a '命令的绝对路径'
#查看命令的完整路径
whereis 命令
ansible playbook的编写和使用方法
采用yaml格式的语言(xxx.yml)
文件以三个破折号开始 — 以三个点结束 … (多数情况不写结束)
ansible all -m user -a ‘name=tom uid=1050 group=ansible’
转换为playbook:
---
- name: example
hosts: all
tasks:
- name: create user
user:
name: tom
uid: 1050
group: ansible
注意事项:1.首行以—开始 2.各个位置使用空格对其 3.冒号后面有一个空格
#检测yaml文件的语法结构是否错误
ansible-playbook --syntax-check 脚本路径
#在受控主机上实施空运行(模拟运行playbook)
ansible-playbook -C 脚本路径
#在受控主机上实际运行
ansible-playbook 脚本路径
练习:写一个playbook,实现在servera上创建一个名为/tmp/ansible.txt的文件(模块file)
ansible servera.fan.com -m file -a 'path=/tmp/ansible.txt state=touch'
改为playbook:
---
- name: lianxi
hosts: servera.yutianze.com
tasks:
- name: create file /tmp/ansible.TXT
file:
path: /tmp/ansible.TXT
state: touch
ansible变量
1.变量名
不能以数字开头,变量名仅由英文字母,数字,以及下划线组成
2.变量的分类
全局变量: 定义在ansible的配置文件或者命令行中的变量值
主机变量: 定义在某台主机或者主机组
play变量: 定义在playbook中
3.play变量
-
使用vars关键字定义变量
示例:
--- - name: example yaml hosts: servera.fan.com vars: web_server: httpd tasks:
-
使用vars_files关键字定义变量,此时变量存在于文件中
示例:
---
- name: example yaml
hosts: servera.fan.com
vars_files:
- ./vars_files.yml
tasks:
# vim ./vars_files.yml
# web_server: httpd#
4.在playbook中使用变量
语法结构: {{ 变量名 }}
注意: 当关键字的值以变量开头,括号两端加单引号 ‘{{变量名}}’
示例:
tasks:
- name: yum install {{ web_server }}
yum:
name: '{{ web_server }}'
state: present
5.主机变量
方法1: 定义在清单文件中
- 定义在某个主机上
[web]
servera.fan.com web_server=httpd
- 定义在某个主机组上
[web:vars]
web_server=httpd
方法2:定义在指定目录中
在ansible的工作目录下创建两个目录: host_vars和group_vars
然后在这两个目录下创建 与主机或者主机组同名的文件 以 yaml格式 来存储变量
示例:
cat ./host_vars/serverb
web_werver: samba
cat ./group_vars/db
web_server: vsftpd
最方便进行变量管理的方式:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mBqdXCVD-1606014847801)(C:\Users\12935\AppData\Roaming\Typora\typora-user-images\1605183461389.png)]
在主机名文件下创建变量文件
6.使用命令行定义变量
在ansible或者ansilble-playbook命令时使用选项 -e 定义变量
示例:
ansible-playbook -e 'web_server=httpd' example
7.变量优先级
命令行变量 -e > vars_files > vars > host_vars > group_vars
其他格式
8.数组变量
示例:
user_name: tom
user_uid: 1100
user_home: /users/tom
user_name: jack
user_uid: 1200
user_home: /users/jack
转换为数组的格式:
users:
- name: tom
uid: 1100
home: /users/tom
- name: jack
uid: 1200
home: /users/jack
数组变量的调用:
users.name 或者 users[‘name’]
9.注册变量
使用关键字register实现将task运行时产生的输出注册为一个变量,然后通过degub模块来调用其中的值,这种功能一般用于playbook的维护操作
示例:
---
- name: register vars
hosts: servera.fan.com
tasks:
- name: shell
shell: id
register: result
- name: deubg mode
debug:
var: result.rc #获取rc的值
10.事实变量
用于获取受控主机的一些实际配置、设定、状态,例如:主机名、磁盘使用状态、内核版本、cpu型号核心数、内存使用情况、主机的接口地址等等
事实变量是通过运行setup模块实现的,在运行playbook时,系统会自动事先运行setup模块,这个task在所有其他task之前运行
使用playbook查看事实变量的值:
---
- name: facts vars
hosts: servera.fan.com
tasks:
- name: deubg mode
debug:
var: ansible_facts
使用ansible命令来查看事实变量的值
ansible 主机名 -m setup >> severa.facts
在playbook中使用事实变量案例:
---
- name: facts vars
hosts: servera.fan.com
tasks:
- name: debug mode
debug:
msg: This system name {{ ansible_facts['fqdn'] }}, the ipv4 address {{ ansible_facts['default_ipv4']['address'] }}.
Ansible事实的实例
事实 | 变量 |
---|---|
短主机名 | ansible_facts[‘hostname’] |
完全限定的域名 | ansible_facts[‘fqdn’] |
主要IPV4地址 | ansible_facts[‘default_ipv4’][‘address’] |
所有网络接口的名称列表 | ansible_facts[‘interfaces’] |
/dev/vda1磁盘分区的大小 | ansible_facts[‘devices’][‘vda’][‘partitions’][‘vda1’][‘size’] |
DNS服务器列表 | ansible_facts[‘dns’][‘nameservers’] |
当前运行的内核版本 | ansible_facts[‘kernel’] |
关闭事实变量(playbook中写在hosts下面) gather_facts: no
练习题:
1.在合适的位置定义以下变量:
变量名 | 值 |
---|---|
web_server | httpd |
db_server | mariadb-server |
db_client | mariadb |
fw_server | firewalld |
line_file | HelloWorld |
编写playbook以使用以上变量完成如下任务:
在servera上安装并启动httpd、在serverb上安装并启动mariadb-server和mariadb(yum模块、service模块)
在servera和serverb上关闭firewalld(service模块)
在servera的/var/www/html目录中生成一个名为index.html的文件,文件的内容为line_file变量的值(lineinfile模块)
---
- name: install httpd servera
hosts: servera.fan.com
vars_files:
- ./vars.yml
tasks:
- name: install {{ web_server }}
yum:
name: "{{ web_server }}"
state: present
- name: start and enable {{ web_server }}
service:
name: "{{ web_server }}"
enabled: yes
state: started
- name: create index.html
lineinfile:
path: /var/www/html/index.html
line: "{{ line_file }}"
create: yes
- name: intall db serverb
hosts: serverb.fan.com
vars_files:
- ./vars.yml
tasks:
- name: install {{ db_server }}
yum:
name: "{{ db_server }}"
state: present
- name: install {{ db_client }}
yum:
name: "{{ db_client }}"
state: present
- name: enable and start mariadb
service:
name: "{{ db_client }}"
enabled: yes
state: started
- name: stop firewalld web
hosts: web
vars_files:
- ./vars.yml
tasks:
- name: stop {{ fw_server }}
service:
name: "{{ fw_server }}"
enabled: no
state: stopped
ansible-vault 加密文件
为了保护playbook或者变量文件中的敏感数据,可以使用命令ansible-vault来对相应文件进行加密处理.加密后的文件修改查看,使用都需要输入密码才能操作
查看帮助文档: ansible-vault --help
1.生成新的加密文件
ansible-vault create 文件路径
ansible-vault create --vault-password-file=存放密码的文件路径 要加密的文件路
2.查看加密文件的内容
ansible-vault view 文件路径
ansible-vault view --vault-password-file=存放密码的文件路径 要加密的文件路径
3.修改加密文件的内容
ansible-vault edit 文件路径
ansible-vault edit --vault-password-file=存放密码的文件路径 要加密的文件路径
4.对现有文件进行加密
ansible-vault encrypt 文件路径
ansible-vault encrypt --vault-password-file=存放密码的文件路径 要加密的文件路径
5.对现有文件解密
ansible-vault decrypt 文件路径
6.修改现有加密文件的密码
ansible-vault rekey 文件路径
7.如何使用被加密的文件
#被加密的可以是playbook,也可以是varsfiles
ansible-playbook --ask-vault-pass example.yml
ansible-playbook --vault-passwd-file=密码文件路径 example.yml
循环任务
loop关键字完成了对于任务的循环操作,该关键字是设置在tasks中的。使用item变量来调用循环的值
示例: 单个循环
---
- name: loop example
hosts: serverb.fan.com
tasks:
- name: install
yum:
name: "{{ item }}"
state: present
loop:
- httpd
- vsftpd
示例: 数组循环
---
- name: loop example
hosts: serverd.yutianze.com
tasks:
- name: create dir
file:
path: /user
state: directory
- name: create user
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
home: "{{ item.home }}"
loop:
- name: tom2
uid: 2000
home: /user/tom2
- name: jack2
uid: 3000
home: /user/jack2
示例: 变量与loop的结合
---
- name: loop example
hosts: servera.fan.com
vars:
user:
- tom
- jack
tasks:
- name: create user
user:
name: "{{ item }}"
loop: "{{ user }}"
示例:与数组变量的结合
---
- name: loop example
hosts: serverb.fan.com
vars:
user:
- name: tom2
uid: 2000
- name: jack2
uid: 3000
tasks:
- name: create user
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
with_items: "{{ user }}"
示例: 变量与register结合1
---
- name: loop example
hosts: servera.fan.com
tasks:
- name: shell mode
shell: 'echo this is item : {{ item }}'
loop:
- AAAA
- BBBB
register: result
- name: debug mode
debug:
var: result
示例: 变量与register结合2
---
- name: loop example
hosts: servera.fan.com
gather_facts: no
tasks:
- name: shell mode
shell: 'echo this is item : {{ item }}'
loop:
- AAAA
- BBBB
register: echo_results
- name: debug mode
debug:
msg: " {{ item.stdout }}"
loop: "{{ echo_results['results'] }}"
有条件的运行任务
条件: p148
使用when关键字可以通过变量的值决定是否运行任务
示例:
---
- name: when exmaple
hosts: servera.fan.com
vars:
- var1: False
tasks:
- name: install bind
yum:
name: bind
state: absent
when: var1
上例结构中,系统会判断变量var1的值,来选择执行任务与否
示例条件:
操作 | 示例 |
---|---|
等于(值为字符串) | ansible_machine == “x86_64” |
等于(值为数字) | max_memory == 512 |
小于 | mine_memory < 128 |
大于 | mine_memory > 256 |
小于等于 | mine_memory <= 256 |
大于等于 | mine_memory >= 512 |
不等于 | mine_memory != 512 |
变量存在 | mine_memory is defined |
变量不存在 | mine_memory is not defined |
布尔变量是true. 1,True或yes的求值为true | memory_availabled |
布尔变量是false. 0,False或no的求值为false | not memory_available |
第一个变量的值存在,作为第二个变量列表中的值 | ansible_distribution in supported_distros |
多条件设置
when: ansible_processor_cores == 1 and ansible_processor_count == 1
when: ansible_processor_cores == 1 or ansible_processor_count == 1
when: >
ansible_processor_cores == 1
or
ansible_processor_count == 1
when:
- ansible_processor_cores == 1
- ansible_processor_count == 1 #相当于and
when: >
( ansible_processor_cores == 1 and ansible_processor_count == 1 )
or
ansible_distribution == "Redhat"
练习题
写一个playbook,完成下面任务
1.该playbook运行在所有受控主机上
2.该playbook将对内存超过512M的主机上安装httpd任务(yum)
3.该playbook将对内存剩余量少于200M的主机上创建一下用户(service)
tom uid=2000 ; jack uid=3000
4.该playbook将对系统架构为ReadHat并且内核版本为4.18.0-80.el8.x86_64的主机上创建一个名为/tmp/sysinfo文件,该文件内容应该为: 主机名,系统架构,内核版本 ,例如: servera, redhat, 4.18-80.el8.x86_64(lineinfo)
答案:
---
- name: loop and when test playbook
hosts: all
vars:
users:
- name: tom
uid: 5000
- name: jack
uid: 6000
tasks:
- name: install httpd
yum:
name: httpd
state: present
when: ansible_memtotal_mb > 512
- name: create user
user:
name: "{{ item.name }}"
uid: "{{ item.uid }}"
with_items: "{{ users }}"
when: ansible_memfree_mb < 200
- name: create sysinfo
lineinfile:
path: /tmp/sysinfo
line: >
"{{ ansible_facts.hostname }}"
"{{ ansible_facts.distribution }}"
"{{ ansible_facts.kernel }}"
create: yes
when: ansible_distribution == "RedHat" and ansible_kernel == "4.18.0-80.el8.x86_64"
notify 和 handlers
实现对于多任务的控制,当一个任务执行成功之后才会执行另外一个任务
---
- name: notify and handlers
hosts: servera.fan.com
tasks:
- name: edit httpd config
blockinfile:
path: /etc/httpd/conf.d/test.conf #httpd的配置文件
block: |
<VirtualHost 192.168.199.10:80>
ServerName servera.fan.com
DocumentRoot /var/www/html
</VirtuanlHost>
create: yes
notify: restart httpd
handlers:
- name: restart httpd
service:
name: httpd
state: restarted
描述:当blockinfile模块运行状态为changed的时候,系统会在handlers关键字中调用notify中指定的任务名对应的任务去运行。
忽略任务的失败: ignore_errors
关键字:ignore_errors: yes
一般情况下,当tasks中的任务在某台主机上执行失败后,该tasks中剩余任务不会在该主机上运行。可以通过设置关键字 ignore_errors: yes 来忽略对应任务的失败。
示例:
---
- name: ignore errors
hosts: servera.fan.com
tasks:
- name: install aaaa
yum:
name: aaaa
state: present
ignore_errors: yes
- name: debug mode
debug:
msg: xxxxxxxxxxxxxxxxx
force_handlers
通常情况下,当设置的notify & handlers 关键字时,如果运行过程中有任务执行失败,那么handlers内部的程序不会被调用,此时可以通过设置force_handlers: yes 来运行handlers程序
---
- name: force handlers
hosts: servera.fan.com
force_handlers: yes
tasks:
- name: file
file:
path: /tmp/aaaaissssaaa
state: touch
notify: httpd
- name: install aaaa
yum:
name: aaaa
state: present
handlers:
- name: httpd
service:
name: httpd
state: restarted
failed_when
用于设置当满足条件时无论任务运行成功还是失败,在ansible输出的状态均显示失败,例如,在使用ansible运行脚本时,有时需要让运行成功的脚本以错误的状态输出
---
- name: test failed when
hosts: web
tasks:
- name: push shell file
copy:
src: ./test.sh
dest: /tmp/test.sh
mode: '0755'
- name: shell
shell: /tmp/test.sh #脚本内容: echo error
register: result
failed_when: '"error" in result.stdout' #当error出现在stdout中时判定play运行失败
ignore_errors: yes
- name: debug
debug:
var: result
changed_when
changed_when: false 此关键字属于when的扩展,可以使用when的语法结构
当tasks中的任务被运行时,只要该任务满足changed_when的条件,那么将输出为changed,反之输出为ok或者false
---
- name: changed
hosts: servera.fan.com
tasks:
- name: service mode
service:
name: httpd
state: restarted
changed_when: false
block关键字
搭配when,设置多个任务满足一个when时运行
---
- name: bolck
hosts: servera.fan.com
vars:
- var_1: true
tasks:
- name: test block
block:
- name: debug mode
debug:
msg: xxxxxxxxxxxxxxxxxx
- name: restart httpd
service:
name: httpd
state: restarted
when: var_1
搭配rescue和always使用: block失败,运行rescue,总是运行always
---
- name: block rescue always
hosts: servera.fan.com
tasks:
- name: block mode
block:
- name: install aaaa
yum:
name: httpd
state: absent
rescue:
- name: debug1
debug:
msg: xxxxxxxxxxxxxxxxxxxxxxx
always:
- name: debug2
debug:
msg: bbbbbbbbbbbbbbbbbbbbbbb
处理文件,目录与字符串
- file模块: 在受控主机创建文件目录及修改属性 (mode(如’0755’),owner,group,时间戳(touch),安全上下文(setype))
- lineinfile模块: 在文件中定位某行数据然后利用***正则表达式*** 去替换(如regexp: ‘^A’ 替换以A开头的行),主要用于修改某行数据时使用.也可以向文件末尾写入一行新数据等
- blockinfile模块: 向文件中写入,修改,删除多行数据(先输入 | 在分行依次输入)
- copy模块: 将控制主机上的文件拷贝到受控主机上,类似file模块,拷贝同时可以修改文件属性
- fetch模块**