RHCE笔记
一.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 -R 要复制的递归目录 目的位置 递归复制目录到目的位置
cp -p 要复制的文件 源文件保持属性不变的复制
注:目的位置不存在,复制或剪切操作就变成复制+重命名
mv 内容路径 目的位置 剪切文件或文件夹到目的位置
4.打包压缩
tar -cvf 压缩文件名称 要压缩的文件(用相对路径) 创建压缩文件
tar -tvf 压缩文件名称 查看压缩文件
tar -xvf 压缩文件名称 -C 解压位置 解压压缩文件
带格式的压缩 -J xz
-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 文件路径 动态查看文件后半部分内容
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或不加c指的是 是否单个替
-
set nu 显示行号
-
sp 第二个文件的路径 分屏编辑文件
五.用户管理
用户: 操作并使用操作系统的角色
超级管理员用户: 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(环境变量)
用户组: 系统中某些特征相同或相似的用户组成的集合
默认情况下系统中创建一个用户会出现与之相同名称的用户组
主组:创建用户时默认的同名组 副组: 用户额外加入的分组
useradd 选项 用户名 创建用户
选项: -u 指定uid
-g 指定gid或主组
-c 注释信息
-d 家目录路径 指定用户家目录
-s 指定shell类型
usermod 选项 用户名 修改用户信息
选项: -G 用户组 将用户添加到组
usermod -G 用户组 -a 用户名 将用户添加到某个组(可加入多个副组)
userdel -rf 用户名 删除用户(-rf 才能完全删除用户及其痕迹)
id 用户名 查看用户简略信息
passwd 用户名 设置用户密码
groupadd 选项 用户组名 创建用户组
groupmod 选项 用户组名 修改用户组
groupdel 用户组名 删除用户组
sudo 命令 临时以root用户执行该命令
su - 用户名 切换用户 切换之后exit退出
单用户模式下修改root密码
重启,在系统开机选择系统时,默认第一个,按下e进入引导
在kernel为首的行尾,在行尾输入 rd.break ,按下ctrl+x,进入单用户模式
mount -o remount,rw /sysroot 将根目录重新挂载
chroot /sysroot/
passwd root
touch .autorelabel 更新selinux
exit
exit
作业:cat /etc/shells
usermod -s /sbin/nologin user
六.权限管理
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增加sbit权限 chmod g+s /tmp
例: 将passwd命令文件的suid权限去掉,然后使用普通用户修改自己密码,观察现象
3.权限访问控制 facl
针对单个用户或单个用户组
getfacl 目录 查看目录的facl
setfacl -m u:用户名:---(rwx) 路径 目录或文件设定单独用户权限(任意设定)
setfacl -m g:用户组名:rwx 路径 目录或文件设定单独用户组rwx权限
setfacl -x u:用户名 路径 删除特定的facl
setfacl -b 清空facl
mask 用于限制facl设定的权限大小,默认以facl最大权限为准
setfacl -m mask:权限 目录或文件路径 设定mask值限制权限
七.网络配置
基础命令
enp4s0f1
en: 以太网 p:总线 s:插槽
ip addr 查看网卡信息
ifconfig 查看网卡信息
route 查看路由信息
tracepath 网址 追踪路由
ip link show 查看本地链路
配置网卡
设置-图形化界面
控制面板配置: nm-connection-editor 打开图形化网卡配置
类图形化: nmtul
通过配置文件配置网卡信息:/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 网关
dnsi dns服务器
nmcli connection add type ethernet ifname ens160 con-ens ipv4.method manual connection.autoconnect yes ipv4.addresser 192.168.25.110 ipv4.gateway 192.168.25.2 ipv4.dns 192.168.20.2
新建网卡链接,创建一个Ethernet类型的链接在ens160网卡上面,链接名为ens,手动获取地址,地址为192.168.25.110/24 网关为192.168.25.2 dns地址为 192.168.25.2 切当网卡启动时自动启用该链接
nmcli connection up 链接名称 启用该链接
nmcli connection down 链接名称 不启用该链接
nmcli connection delete 链接名称或uuid 删除链接
nmcli connection modify 链接名 参数 修改此链接
修改网卡配置
ifconfig
cd /etc/sysconfig/network-scripts/
ll ifcfg-*
vim ifcfg-ensXXX
systemctl restart network
八.selinux 安全的linux
三大状态:开启状态,监听状态,关闭状态
/etc/selinux/config
enforcing : 开启状态,此状态下selinux处于启动状态,监听系统,拦截违法操作,并且告警管理员
permissive : 监听状态 此状态下selinux 不会拦截违法操作 ,但会告警
dissabled : 关闭状态
上下文 某个服务或应用的专属标签
上下文是文件,端口,进程的一种标签属性,selinux通过观察文件或端口的上下文是否与相关服务动作匹配,如果匹配,则允许操作,不一致则阻拦
ls- Zl 查看文件或目录的上下文
semanage port -l 查看所有端口上下文
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 目标态
用户设定默认目标态 : systemctl set-default 目标态
注 : init 2 命令行模式 init5 图形化界面
十.进程管理
进程之间关系 : 父与子
pstree 查看系统进程树
ps -aux 静态查看系统所有进程
top 动态查看 (P cpu 存储 排列 , M 内存排列 , T 运行时间排列)
ps -lax 以长列表查看
kill 信号 pid 杀死进程
信号 : -9 强制关闭 -15 正常关闭
kill -15 = kill
进程优先级 :
pr : 动态优先级 , 由cpu计算得出
ni : nice值,可以人为影响pr优先级 ( -20~19)
可以指定nice值运行进程
nice -n n 命令
可以对正在运行进程的nice值进行修改
renice -n n pid
作业管理
jobs 查看终端运行的作业
kill %作业号 关闭作业
ctrl + z 将作业放到后台暂停运行
fg %作业号 将后台运行的作业调度到前台运行
bg %作业号 将后台暂停的作业在后台恢复运行
命令 + & 在后台运行此命令
注 : 前台只允许运行一个进程
十一.计划任务
1.定时任务
at hh:mm yy-mm-dd 创建一个定时任务
sync 同步
ctrl + d 停止
atq 查看现有的定时任务
at -c 任务编号 查看任务内容
atrm 计划任务号 删除定时任务
2.周期性计划任务
在无人值守时,服务器自动周期性运行计划任务
crontab -e 创建周期性计划任务
crontab -r 删除当前用户周期性计划任务
crontab -l 查看当前用户周期性计划任务
crontab -e -u 用户名 只有root能指定其他用户的计划任务
分 时 日 月 周 任务
任意时间用*
x,y 不连续的两个时间点
x-y 连续的时间点
*/n n是间隔时间,每隔n个间隔
十二.软件安装
编译安装 --> rpm安装 --> yum安装
rpm软件安装主要用于单个软件安装包安装
yum用于多个安装包打包安装,yum可以解决软件依赖性关系和顺序问题,但需要提前设定好软件仓库
软件安装包来源 : 本地镜像,网络下载单个安装包,
yum安装需要编写yum源文件指向本地镜像或网络镜像,系统才能查询到安装包, yum源路径 /etc/yum.repos.d/name.repo
vim /etc/yum.repos.d/linux1.repo
本地镜像yum源文件
仓库名称
是否启用仓库
是否进行gbg检测 检测镜像完整性
镜像路径 (本地镜像 file://路径 网络镜像 http://路径)
查看本地镜像路径 df -hT sr0设备的挂载点
网络镜像源yum文件内容
两个文件源不能一致
yum clean all 清除缓存
yum list all 列出所有安装包
1
使用本地源下载以下两个软件,然后切换网络源下载新的这两个软件
bind vsftpd
模块流 : 进一步将某应用的所有支持软件及插件全部打包,按不同版本分不同流,每次系统安装只能安装一个版本的模块流
yum module list 列出当前镜像源中的所有模块
yum module enable mariadb 启用mairadb模块
yum module install mariadb 安装mariadb 模块中的软件安装包
yum module remove 模块名称 卸载模块中的安装包
yum module update 模块名称 更新模块中的安装包
yum module disable 模块名称 禁用模块流
十三.硬盘管理
linux 系统根据硬盘接口不同,命名不同
IDE : hd scls ,sata : sd 虚拟机硬盘 : vd
硬盘处理流程 : 分区 , 格式化 (制作文件系统) , 挂载(映射)
ntfs fat32
1.分区
分区方案 : MBR(主引导记录) , GPT
MBR分区信息表占64字节,一个分区占16字节
mbr分区方案中,分区有三种类型 : 主分区 (占用分区信息表) , 扩展分区(占用分区信息表) , 逻辑分区(不占分区信息表)
GBT远超MBR分区方案,理论分区数量可达128个
gdisk
MBR : fdisk 硬盘路径(/dev/sda) 使用fdisk命令进行分区
lsblk 查看系统中块设备信息
partprobe 硬盘路径 更新硬盘分区到系统
2.格式化
mkfs.文件系统格式 分区路径 格式化分区
blkid 查看系统中所有格式化后分区的文件系统格式
常见的文件系统 : ext2,3,4 , fat32 , xfs , iso9660 , ntfs
3.挂载
临时挂载 : mount 要挂载的分区路径 挂载点目录路径 (要挂载到哪个路径)
卸载挂载 : umount
永久挂载 : 手动配置 /etc/fstab 文件编写挂载信息
要挂载的分区路径 挂载点目录路径 文件系统格式 挂载选项 0 0
挂载选项默认defualts ,第一个0代表不进行文件系统完整性校验(1校验)
第二个0代表是否进行kdump备份,0不备份,1,2备份(不同优先级)
df -hT 查看系统中挂载信息
mount -a 重新读取stab文件
4.交换分区
又称虚拟内存,主要空间来源为硬盘空间,当物理内存不足时,系统调用交换分区空间充当内存,但交换分区速度远远不及物理内存,只应急使用
注 : 交换分区和普通分区的区别在格式化时文件系统类型不同
格式化 : mkswap 分区路径 将普通分区格式化为swap分区
挂载 : vim /etc/fstab
fstab 中挂载swap分区的书写格式
交换分区路径 swap swap defaults 0 0
swapon -a 启用系统中所有的交换分区
swapon 交换分区路径 指定启用某一交换分区
swapoff 交换分区路径 关闭某一交换分区
swapoff -a 关闭系统中所有交换分区
swapon 查看系统的交换分区
十四.逻辑卷管理
逻辑卷技术(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/卷组名/逻辑卷路径(扩容或者缩减)
pvdisplay 显示卷
文件系统大小调整
扩容:
xfs_growsfs 分区路径或逻辑卷路径 扩容分区或逻辑卷的文件系统到所有容量(xfs文件系统格式)
resize2fs 分区路径或逻辑卷路径 扩容分区或逻辑卷的文件系统到所有容量((ext4文件系统格式)
十五.高级存储技术
1.stratis 分层管理
yum install stratis-cli stratisd 安装stratisd服务
systemctl enable 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用于重复数据删除
创建vdo卷 : vdo create --name=vdo名称 --device=要创建vdo卷的设备 --vdoLogicalSize=大小
vdo status --name=vdo卷名 使用yml语法输出vdo信息
vdo list 列出vdo卷
vdo start 启动vdo卷功能
vdo stop 停止vdo卷功能
vdostats --human-readable 查看卷的初始统计信息以及状态
注: 使用vdo卷就像使用一个分区一样,创建后正常的格式化,挂载
三个实验
ssh vdo startis
rhce中级
shell脚本+了解各类服务
ansible自动化
linux操作系统的操作手段
命令式---在命令行中以交互的方式输入各类命令
批处理式---shell脚本
shell脚本的构成
1.脚本声明
用于声明该脚本运行时使用的shell,要求写在脚本的第一行
语法结构
!/bin/bash
2.注释声明
可以写在脚本的任意一行,用于解释说明脚本或脚本中部分代码行的功能,在脚本中不起实质性作用
语法结构
任意字符串
3.可执行语句
由linux的基础命令与逻辑语言构成,是脚本实际运行的部分,系统会按照这部分的命令由上至下依次运行命令
实例:
请在屏幕上打印输出文字HelloWord!
!/bin/bash
print helloword
echo Hello W
shell脚本的运行方式
1.在命令行中直接输入脚本的绝对路径
当脚本被存放于当前工作目录时,可以直接输入 ./脚本名
chmod a+x 脚本名
2.使用命令sh运行脚本
sh 脚本路径
3.使用命令source运行脚本
source 脚本路径
4.将脚本存放到系统环境变量PATH所指定的目录下,此时可直接输入脚本名来运行脚本
PATH变量决定了系统搜索命令的范围
查看path变量值
echo $PATH
修改方法:
临时修改 PATH=$PATH:新的路径
永久修改 将上述命令写到文件 /etc/bashrc(所有用户有效)或者 ~/.bashrc(仅指定用户有效)的末尾
编写shell脚本时常用的特殊符号
# 注释符
\ 反斜线,取消其后一位字符的特殊含义
' ' 单引号,取消其内全部字符的特殊含义
" " 双引号,取消其内全部字符的特殊含义,但不取消$ ``(反引号)的作用
`` 反引号,用于将其内部的字符串强行当作命令事先运行
$() 命令替换,用于将其字符串替换为内部命令运行的结果
$[] 算数扩展,用于进行整数型计算 $[11**2] =121 常用+-*/%(命令bc可以完成小数计算)
= 赋值符,用于定义变量以及变量的值.结构: 变量名=值 注意为了于命令区分,变量要求大写
$变量名 用于调用变量值
for循环语句
用于重复的多次运行一个或一组命令
语法结构:
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 "$@"
do
echo $A
done
echo ----------------------------------------------
for B in "$*"
do
echo $B
done
read 交互赋值法
read -p '字符串 ' 变量
if条件语句
语法结构1
if [条件] ; then
命令列表
fi
语法结构2
if [条件] ; then
命令列表1
else
命令列表2
fi
语法结构3
if [条件1] ; then
命令列表1
elif[条件2] ; then
命令列表2
else
命令列表N
fi
条件
1.数值比较
语法结构 : [ 数字 符号 数字 ]
常用符号: -eq -gt -ge -lt -le
2.字符比较
语法结构: [ "字符串" 符号 "字符串" ]
常用符号: = == (都是等于) !=
语法结构: [ 符号 "字符串" ]
常用符号: -z 其后字符串的长度为0则条件成立
-n 其后字符串长度不为0则条件成立
3.文件比较
语法结构: [ 符号 路径]
常用符号: -f 存在且是一个文件则成立
-d 存在且是一个目录则成立
-e 存在则成立
-s 存在且大小为0则成立 用于判断文件是否为空
-b 存在且是一个块设备文件则成立
-r 存在且有读权限成立
-w 存在且有写权限则成立
-x 存在且有执行权限则成立
4.逻辑比较
与判断 [ 条件 ] && [ 条件 ]
或判断 [ 条件 ] ||[ 条件 ]
非判断 ![ 条件 ] 取反
case判断语句
网络服务
1.存储类服务 重点
nfs---网络文件系统
cifs---通用因特网文件系统,windows默认,在linux被叫做samba
iscsi---因特网小型计算机系统接口(共享硬盘)
2.应用类服务
http---超文本传输协议(aphace,nginx,IIS) 重点
https---基于SSL的超文本传输协议
database---数据库(mariadb,mysql,oracle,sqlserver)
ftp---文件传输协议
mail---邮件服务(postfix,sendmail)
3.网络类服务
DNS---域名系统
DHCP---动态主机配置协议
Ansible架构
1.管理主机:需要安装ansible程序、编写ansible代码、管理其他主机
受管主机:被ansbile管理的计算机,支持python即可,多数情况这类主机就是企业中的业务主机
2.由于采用SSH进行通讯,多数情况下需要配置管理主机到受管主机的SSH公钥认证(免密认证)
3.一般情况下为了系统安全,ssh不会直接连接受管主机的root用户,而是连接至一个普通用户,然后通过sudo进行提权
4.在管理主机上,ansible至少拥有三类文件:1.配置文件ansible.cfg 2.清单文件 3.playbook(剧本)
Ansible部署的准备工作
第一步:准备一台管理主机和若干的受控主机,并调整相应的主机名以及IP地址
第二步:配置域名解析,此处可以是的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仓库
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=0
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.yutianze.com
serverb.yutianze.com
[db]
serverc.yutianze.com
serverd.yutianze.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 清单文件路径 ]
所谓的模组其实是在系统中事先编写好一个python程序,这些python程序是被存放在控制主机上,当在控制主机上运行ansible命令时,系统会通过预设的方法(默认ssh)将这些python程序传输到受控主机上,并运行。
示例:测试受控主机的网络联通性
ansible all -m ping
ansible常用模组
文件模块:
file 用于在受控主机创建文件或者目录,也可以用于修改权限
copy 用于将控制主机上的文件拷贝到受控主机
lineinfile 用于修改受控主机上某个文件中的某行数据
blockinfile 用于以段落的方式修改受控主机上的文件
软件包模块
yum 用于yum安装软件的
yum_repository 用于配置yum软件仓库的
atp 用于atp安装软件的
系统模块
firewalld 用于控制调整防火墙
reboot 用于控制主机重新启动
service 用于控制服务的启动与关闭
user 用于创建或者删除用户
group 用于创建或者删除用户组
Net tools 模块
get_url 用于下载的模块
nmcli 用于管理网络
命令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 '命令的绝对路径'
ansible playbook的编写和使用方法
采用yaml格式的语言
文件以三个破折号开始 --- 以三个点结束 ... (多数情况不写结束)
ansible all -m user -a 'name=tom uid=1050 group=ansible'
转换为playbook:
vim example.yml
---
- name: example yaml 第一个play
hosts: all
tasks:
- name: create user 第一个task
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.yutianze.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.yutianze.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 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
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
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'] }}.
关闭事实变量 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来对相应文件进行加密处理.加密后的文件修改查看,使用都需要输入密码才能操作
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.如何使用被加密的文件
ansible-playbook --ask-vault-pass example.yml
ansible-vault encrypt --vault-passwd-file=密码文件路径
循环任务
loop关键字完成了对于任务的循环操作,该关键字是设置在tasks中的。使用item变量来调用循环的值
示例: 单个循环
---
- name: loop example
hosts: serverb.yutianze.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的值,来选择执行任务与否
条件设定详见教材的 148页
多条件设置
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
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
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: put shell file
copy:
src: ./test.sh
dest: /tmp/test.sh
mode: '0755'
- name: shell
shell: /tmp/test.sh
register: result
failed_when: '"error" in result.stdout'
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模块: 在受控主机创建文件目录及修改属性 (所属,所属组,时间戳(touch),安全上下文)
lineinfile模块: 在文件中定位某行数据然后利用正则表达式去替换,主要用于修改某行数据时使用.也可以用于向文件末尾写入一行新数据
blockinfile模块: 向文件中写入,修改,删除多行数据,
copy模块: 将控制主机上的文件拷贝到受控主机上,类似file模块,拷贝同时可以修改文件属性
fetch模块: 将受控主机上的文件拷贝到控制主机上,在控制节点上将根据受控主机的主机名建立的目录来存放文件
stat模块: 查看文件或目录的状态(属性) ,类似linux的stat命令
安装未知路径软件
whereis 软件名
rpm -qf 路径
永久修改上下文的模块示例:
---
- name: file mode
hosts: servera.fan.com
tasks:
- name: touch file /tmp/test.txt
file:
path: /tmp/test.txt #被管理文件的路径
setype: var_t #设置文件安全上下文属性
state: touch
- name: restorecon
file:
command: restorecon -RFv /tmp/test.txt
使用jinja2模板来构建自定义文件
在实际的部署文件中,经常需要部署一整个文件,此时无论是通过lineinfile还是通过blockinfile或者使用copy等模块进行上传都不方便. 这是可以使用jinja2模板来构建自定义文件,其中允许包含来自playbook中的自定义变量及事实变量,甚至可以包含for循环和if条件(通过template关键字)
jinja2模板的文件可以任何名字,一般用 .j2 作扩展名
除去普通的文本内容外,jianja2模板还可以包含一些特殊结构,例如:
(% 表达式 %) 常用于部署 for 循环, if 条件等逻辑语言
(# 注释信息 #) 常用于标记注释,不会出现在playbook运行后生成文件中的内容
{{ 变量名 }} 调用playbook 中设置的变量或事实变量
示例:
模板文件:
cat sysinfo.j2
This file will show the template
{# xxxxxxxxxxxxxxxxxxxxxxx #}
The system hostname is {{ ansible_facts.hostname }}
The system distribution is {{ ansible_facts.distributi.on }}
The system kernel is {{ ansible_facts.kernel }}
playbook:
cat temp.yml
---
- name: used j2
hosts: all
tasks:
- name: template mode
template:
src: ./sysinfo.j2
dest: /tmp/sysinfo.txt
运行后生成的文件:
以servera为例:
cat /tmp/sysinfo.txt
This file will show the template
The system hostname is servera
The system distribution is RedHat
The system kernel is 4.18.0-80.el8.x86_64
jinja2模板中的for循环语句
(% for A in AA %)
{{ A }}
{% endfor %}
上例中,A和AA都是变量,AA需要在playbook中事先定义,在for运行时会将AA变量的值依次赋予给A变量,然后再后续的结构中可以使用{{A}}的方式调用A的值
实例:
jinja2 for循环文件内容:
cat for.j2
{% for user in users %}
the user is {{ user }}
{% endfor %}
playbook中的内容
cat forj2.yml
---
- name: jinja2 for
hosts: all
vars:
users:
- tom
- jack
- natasha
tasks:
- name: template mode
template:
src: for.j2
dest: /tmp/for.txt
运行的结果:
cat /tmp/for.txt
the user is tom
the user is jack
the user is natasha
for循环运行结合if来完成对变量值的筛选
{% for user in users if not user == "jack" %}
the user is {{ user }}
{% endfor %}
jinja2模板中的if条件语句
示例1:
{% if A %}
文本内容
{% endif %}
上例中A是一个变量,定义在playbook等位置,如果变量的值为true则文本内容将写入实际生成的文件
示例2:
{% if 变量A 符号 "值" %}
文本内容
{% endif %}
if条件判断为真,则文本被写入文件
常用符号: == != > < >= <= in
实例:
jinja2模板文件内容
cat if.j2
this is a template file
{% if ansible_facts.hostname == "servera" %}
this is servera
{% endif %}
playbook中的内容
cat ifj2.yml
---
- name: jinja2 if
hosts: all
tasks:
- name: template mode
template:
src: if.j2
dest: /tmp/if.txt
在servera上生成的文件
cat /tmp/if.txt
this is a template file
this is servera
在其他主机上生成的文件
cat /tmp/if.txt
this is a template file
主机清单的选择
1.hosts: 主机名
2.hosts:主机组名
3.hosts: IP地址 需要在清单文件中写入ip地址
4.hosts: 主机1,主机2,主机3(也可以是主机组)
或
hosts:
- 主机1
- 主机2
- 主机3
5.hosts: server[a-d] 调用servera到serverd
hosts: server*
6.hosts: * 或 all
7.使用符号&
hosts: 主机组A,&主机组B 调用同时属于A,B主机组的主机
使用符号!
8.hosts: 主机组A ! 主机组B 调用属于主机组A但是不属于主机组B的主机
并行任务处理
在ansible的配置文件中关键字forks决定了同时连接的主机数量,默认值为5,在大型项目中,同时连接5台主机效率很低,一般根据实际情况调整该值
设置该值的方法:
1.在ansible的配置文件ansible.cfg中[defults]节中设置
forks = 5
2.在运行ansible或者ansible-playbook命令时,使用选项-f 来覆盖配置文件
-f 5
3.也可通过编写playbook时设置,写在task上面
forks: 5
在playbook中编写serial的值,该值决定同时在多少台主机上运行该playbook
值得注意的是, forks和serial实现的效果类似,但是实现的方式不同,forks决定的是每次连接的主机数量,而serial决定每次多少台主机运行playbook,因此serial的值大于forks时,serial的值是无效的.
导入playbook
使用关键字import_playbook可以将playbook中的内容导入另一个playbook
playbook中任务的运行将根据导入的顺序依次运行
---
- name: playbook1
import_playbook: temp.yml
- name: playbook2
import_playbook: ifj2.yml
为了让playbook看起来更简洁,可以通过import_tasks和include_tasks关键字,来实现任务的导入操作,将不同tasks放置在不同的yml文件中,然后根据项目需求编写playbook来导入他们.
import_tasks和include_tasks的区别
1.都用于导入任务,import_tasks为静态导入,include_tasks为动态导入
2.最大区别是导入顺序
import_tasks运行时,先运行playbook中的变量值再运行tasks中的变量,意味着变量值以task的值为主
include_tasks运行时,系统先运行导入的tasks中的变量,然后再运行playbook中的变量值,task的变量值会被playbook的同名变量值替换
示例:
[ansible@workstation test_project]$ cat tasks/1.yml
- name: task1
vars:
ansible_distribution: Fedora
debug:
msg: this system is {{ ansible_distribution }}
[ansible@workstation test_project]$ cat c.yml
---
- name: test import and include
hosts: servera.fan.com
tasks:
- import_tasks: tasks/1.yml
vars:
ansible_distribution: RedHat
- include_tasks: tasks/1.yml
vars:
ansible_distribution: RedHat
运行的结果:
......
TASK [task1] ***********************************************************************
ok: [servera.fan.com] => {
"msg": "this system is Fedora"
}
TASK [include_tasks] ***************************************************************
included: /home/ansible/test_project/tasks/1.yml for servera.yutianze.com
TASK [task1] ***********************************************************************
ok: [servera.fan.com] => {
"msg": "this system is RedHat"
}
......
1.进行报错的处理
创建名为failsamba.yml的playbook:
在serverd上尝试安装并启动samba服务
如果软件包安装或服务启动失败, playbook获取任务信息并显示
即使一个任务执行失败,其它所有任务也必须被执行
如果安装任务失败,为了便于排错,需要显示debug信息:Install failed
如果启动任务失败,需要显示服务启动失败的debug信息:Starting failed
如果所有任务失败,需要显示信息:playbook was not successful
---
- name: q1
hosts: servera
tasks:
- name: install samba
yum:
name: samba
state: latest
ignore_errors: yes
register: install_return
- name: debug install samba
debug:
msg: "Installation failed"
when: install_return.rc !=0
- name: start samba
service:
name: smb
state: started
ignore_errors: yes
register: start_return
- name: debug start samba
debug:
msg: "Starting failed"
when: start_return is failed
- name: debug all
debug:
msg: "playbook was not succeddful"
when: install_result.rc !=0 or start_result is failed
2.处理无法访问的报错:
创建名为inaccess.yml的playbook完成以下任务:
在所有受管主机上运行文件./access.html文件拷贝到/var/www/html/inaccess html
如果拷贝失败将文字I did not have access to the url以debug的msg进行显示
---
- name: q2
hosts: nodes
tasks:
- block:
- name: copy file
copy:
src: inaccess.html
dest: /var/www/html/inaccess.html
rescue:
- name: debug msg
debug:
msg: "I did not have access to url"
Ansible roles
角色: 是一种更轻松使用ansible的功能,可以通过网络等手段获取已经开发成熟的项目来自己的服务器上进行部署
1.自定义角色
2.由红帽公司在RHEL操作系统上提供的角色
3.ansible galaxy
自定义角色
生成方法:
1.通过linux命令创建角色目录结构
2.使用命令ansible-galaxy init 命令进行自动创建
命令: ansible-galaxy init 角色名
[ansible@www roles]$ tree
.
└── new_role
├── defaults
│ └── main.yml
用于存放变量值的yml文件,该文件中的变量被用做默认变量,能被任何一种其他变量进行覆盖
├── files 用于存放角色使用各类静态文件
├── handlers 用于存放处理被定义的处理程序
│ └── main.yml
├── meta 用于存放与角色相关的一些信息,例如角色的作者,许可证,引用的依赖角色
│ └── main.yml
├── README.md 给角色使用者进行阅读,了解角色的使用方法
├── tasks 存放角色的主要任务
│ └── main.yml
├── templates 用于存放角色使用各类静态文件( jinja2模板 )
├── tests
│ ├── inventory 用于角色测试的清单文件
│ └── test.yml 用于角色测试的playbook文件
└── vars
└── main.yml
用于存放变量值的yml文件,该文件中的变量有能力覆盖defaults中的变量,这里变量的优先级较高,能覆盖一般的play变量
软件包 rhel-system-roles
安装系统角色 yum install rhel-system-roles
安装好的系统角色默认位置 /usr/share/ansible/roles/
RHEL8.0的系统角色:
rhel-system-roles.network
rhel-system-roles.postfix
rhel-system-roles.selinux
rhel-system-roles.storage
rhel-system-roles.timesync
ansible-galaxy -h 帮助文档
由galaxy
通过命令安装ansible-galaxy角色
ansible--galaxy install 角色名 -p 安装路径
通过yml文件安装ansible galaxy 角色
创建yml文件:
vim ./roles/galaxy.yml
cat galax.yml
- src: acandid.nginx(查找到的角色名)
安装命令:
ansible-galaxy install -r yml文件路径 -p 安装位置
时间: 2020.8.1 10:30演示
角色在playbook中的使用
通过关键字roles来调用角色,被调用的角色会运行tasks/main.yml中的所有playbook
示例: 安装ntp服务
在使用角色时,变量的定义是值得注意的.
1.defaults/main.cf 中定义的变量具有最低的优先级,可以被其他所有类型的变量进行覆盖
2.在playbook中通过vars和vars_files定义的变量会覆盖defaults/main.cf变量,但是不覆盖vars/main.cf变量(上例)
3.在playbook中的roles关键字下方来定义的变量会同时覆盖defaults/main.cf变量和vars/main.cf变量(不建议使用)
pre_tasks 和 post_tasks 这两个是用于运行任务的tasks关键字, 这两个关键字是调用了角色之后使用的tasks关键字.
pre_tasks要求写在roles关键字上面,指的是该部分优先于角色任务运行
posts_tasks要求写在roles关键字下面,指的是该部分将在roles任务运行完成之后才会运行
系统调用角色的路径
默认情况下调用的角色
/usr/share/ansible/roles/
/etc/ansible/roles/
~/.ansible/roles/
修改默认路径
实验: 自定义一个名为web_roles文件,要求该角色能安装并启动httpd服务,可以通过静态文件的方式来生成index.html页面文件,通过动态文件的方式来生成httpd的虚拟主机配置文件。
时间:10:57
第一步,生成角色目录
cd ~/test_project/roles/
ansible-galaxy init web_roles
第二步,编辑tasks/main.yml文件来配置主palybook程序
vim web_roles/tasks/main.yml
---
# tasks file for web_roles
- name: intall httpd
yum:
name: httpd
state: present
- name: start and enable httpd
service:
name: httpd
state: started
enabled: yes
- name: config http vhost
template:
src: vhost.j2
dest: /etc/httpd/conf.d/vhost.conf
group: root
owner: root
mode: '0644'
notify: restart httpd
第三步,配置handlers任务
vim web_roles/handlers/main.yml
---
# handlers file for web_roles
- name: restart httpd
service:
name: httpd
state: restarted
第四步,准备jinja2模板
vim web_roles/templates/vhost.j2
<VirtualHost {{ ansible_default_ipv4.address }}:80>
ServerName {{ ansible_fqdn }}
DocumentRoot {{ documentroot_dir }}
</VirtualHost>
第五步,定义默认变量0
vim web_roles/defaults/main.yml
---
# defaults file for web_roles
documentroot_dir: /var/www/html/
第六步,准备静态文件
vim web_roles/files/index.html
Hello World!
第七步,编写测试playbook
cd ~/test_project
vim use_web_roles.yml
---
- name: use web roles
hosts: servera.fan.com
pre_tasks:
- name: start tasks
debug:
msg: start config httpd
roles:
- web_roles
post_tasks:
- name: copy mode
copy:
src: roles/web_roles/files/index.html
dest: /var/www/html/index.html
- name: ending tasks
debug:
msg: web server is config
执行linux自动化任务
1.yum模块
用于在受控主机上进行yum软件包管理
常见关键字:
name: 设置需要安装的软件名称
state: 决定软件包在受控主机上的状态, present: 安装软件 ; absent: 卸载软件 ; latest: 更新,或下载最新版
2.yum_repository
在受控主机上配置或删除软件仓库
常用关键字:
name: 设置软件仓库的名称, 即repo id ,例如[BaseOS]
description: 设置软件仓库的描述,即repo name,对应配置文件name
baseurl: 设置软件仓库路径
enable: 设置软件仓库状态
gpgcheck: 设置软件是否需要进行校验
file: 设置软件仓库在/etc/yum.repos.d/目录中的名称,即文件名称,
state: 决定软件仓库文件在受控主机上的状态, present:配置或更新文件;absent用于删除文件
示例:
- name: repolist1
yum_repository:
file: cdrom
name: BaseOS
description: Red Hat Enterprise Linux 8.0 BaseOs iso
enabled: yes
gpgcheck: no
baseurl: file:///media/cdrom/BaseOS
3.user模块
用于在受控主机上创建,修改,删除用户
常用关键字
name 用户名
uid 用户编号
group 主组
groups 副组
append 值为yes,表示为用户添加新的副组 ; 值为no, 那么会覆盖用户的原有副组
shell 指定用户shell
create_home 是否为用户创建家目录(yes/no)
comment 用户注释信息
state 用户在受控主机上的状态,present表示创建或更新用户 ; absent 表示删除用户
4.group模块
用于在受控主机上创建,修改,删除用户组
常用关键字
name 指定用户组名称
gid 指定用户组编号
state 该用户组在受控主机上的状态,present表示创建或更新用户组 ; absent 表示删除用户组
5.at模块
设置一次性计划任务
常用关键字
command 设置要运行的命令
script_file 设置要运行的脚本
units 设置单位, minutes hours days weeks
count 计数,指的是多少个units之后
unique 如果任务已经运行,则不用重复设置
state present设置 ; absent删除
示例:
---
- name: at mode
hosts: servera.fan.com
tasks:
- name: poweroff system at 18:00
at:
command: poweroff
units: hours
count: 3
unique: yes
警告,需要在受控主机上安装并启动atd功能
6.crontab模块
设置周期性计划任务
常用关键字
name 设置任务名称
job 设置任务内容
minute 分
hour 时
day 日
month 月
week 周
state present设置 ; absent删除
示例:
---
- name: crontab mode
hosts: all
tasks:
- name: crontab config
cron:
name: "test cron"
job: "cat /etc/passwd >> /tmp/passwd.old"
minute: 0
hour: 18
user: ansible
7.parted模块
用于在受控主机上进行磁盘分区的模块
常用关键字
device 指定被分区的设备
number 指定分区编号
part_start 指定分区起点,默认值为0%
part_end 指定分区终点,默认值100%
part_type 分区类型
state 分区状态,present,absent,info
示例:
---
- name: parted
hosts: servera
tasks:
- name: create part2
parted:
name: GPT
device: /dev/sdb
number: 2
part_start: 2GB
part_end: 4GB
state: present
ansible-doc parted 查看关键字的doc
8.lvg模块
在受控机上创建物理卷和卷组
常用关键字
pvs 指定物理卷
vg 设置卷组名称
pesize 设置物理扩展单元大小
satae present 创建 , absent 删除
示例: 创建卷组
---
- name: create vg
hosts: servera.fan.com
tasks:
- name: create vg vg1
lvg:
pvs:
- /dev/sdb1
- /dev/sdb2
- /dev/sdb3
vg: vg1
pesize: 8MiB
state: present
示例: 扩展卷组
---
- name: create vg
hosts: servera.fan.com
tasks:
- name: create vg vg1
lvg:
pvs:
- /dev/sdb1
- /dev/sdb2
- /dev/sdb3
- /dev/sdb4
vg: vg1
9.lvol模块
用于创建逻辑卷的模块
常用关键字
vg 设置卷组
lv 为逻辑卷起名
size 设置逻辑卷大小
rsizefs 调整逻辑卷文件系统的大小 (yes/no)
state present 创建 , absent 删除
示例:
- name: create lv lvm1
lvol:
vg: vg1
lv: lvm1
size: 3g
10.filesystem模块
用于创建文件系统的模块
常用关键字
dev 指定要设置文件系统的分区
fstype 设置文件系统类型
示例:
- name: create lvm1 xfs
filesystem:
dev: /dev/vg1/lvm1
fstype: xfs
11.mount模块
用于挂载文件系统的模块
常用关键字
path 挂载点的路径
src 挂载的分区路径
fstype 文件系统类型
opts 挂载参数
state present 挂载 mounted 永久挂载 absent卸载
示例:
- name: mount /dev/vg1/lvm1
mount:
path: /mnt/disk1
src: /dev/vg1/lvm1
fstype: xfs
opts: defaults,ro
state: mounted

浙公网安备 33010602011771号