零、 准备环境

新建一台虚拟机

文件--新建虚拟机--自定义--稍后安装操作系统--Linux(Red Hat Enterprise Linux 8 64位)--虚拟机名称47_rhce8.2--位置D:\47_rhce8.2--每个处理器内核数量2--内存2GB--使用仅主机网络模式--虚拟磁盘类型SCSI--其它步骤默认不改变

为虚拟机安装操作系统

  1. CD/DVD--选择RHEL8.2的ISO镜像文件
  2. 开启虚拟机
  3. 选择安装操作系统
  4. Time & Date:修改时区为中国
  5. Software Selection:Minimal Install
  6. 黄色感叹号:点进去直接Done
  7. KDUMP:取消Enable kdump前面的√
  8. 然后点击begin installtion
  9. Root Password:设置root的密码为redhat
  10. User Creation:创建student用户
  11. 等待安装
  12. 完成安装:Reboot
  13. 等待虚拟机启动后,测试登录:成功登录后关机,拍快照

初始化配置虚拟机

  1. 配置IP地址/子网掩码、网关、DNS

[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 172.25.0.11/24 ipv4.gateway 172.25.0.254 ipv4.dns 172.25.254.254 connection.autoconnect yes

[root@localhost ~]# nmcli connection up ens160

[root@localhost ~]# ping classroom.example.com

2. 配置YUM源

[root@localhost ~]# dnf config-manager --add http://classroom.example.com/dvd/AppStream
[root@localhost ~]# dnf config-manager --add http://classroom.example.com/dvd/BaseOS
[root@localhost ~]# vi /etc/yum.conf 
gpgcheck=1
改成
gpgcheck=0

3. 安装常用必要的软件包

[root@localhost ~]# yum -y install net-tools vim bash-completion bzip2 tree chrony
# bash-completion:命令补全服务

一、 Shell

定义

将一些命令有序地写到一个文件,添加可执行的权限,以实现某种功能

语法规范

[root@localhost ~]# vim   *.sh
#!/bin/bash
#作者信息(昵称、邮箱)
#注释文本
可执行代码(命令、循环、判断等)

执行脚本

方法1:

使用系统里面的解释器程序执行脚本

[root@localhost ~]# source hello.sh 
或
[root@localhost ~]# bash hello.sh 
或
[root@localhost ~]# sh hello.sh 

方法2:

赋予脚本文件执行权限 (一般使用这种)

[root@localhost ~]# chmod +x *.sh
使用绝对路径或相对路径执行脚本
[root@localhost ~]# /root/hello.sh 
或
[root@localhost ~]# ./hello.sh 

常用工具

  1. 管道
  2. 输出重定向
  3. 整数运算(除法的运算结果向下取整) $[ 运算的算式 ]:支持+ - * / %
  4. 转义:取消所有字符的特殊意义:'字符串' 或 \字符
  5. 将命令的输出作为参数参与其它命令的执行:命令 或 $(命令)
  6. 黑洞设备/dev/null:不需要的输出结果可以重定向到黑洞设备
  7. 从标准输入获取变量的值:read -p '提示信息字符串' 变量名
  8. &&:&&符号前面的表达式判断成功或命令执行成功,才会执行&&符号后面的命令
  9. ||:||符号前面的表达式判断失败或命令执行失败,才会执行||符号后面的命令
  10. 造数工具

    • seq N:输出1-N的整数:支持变量
    • echo {N..M}:输出N-M的整数:支持任意起点到终点的范围
  11. 将输出变成错误输出:>&2
  12. 改变退出后的状态值:exit 返回值

变量

定义:以不变的变量名来存储可以发生变化的变量值
定义变量并赋值:变量名=变量值
引用变量:${变量名}
查看变量:echo ${变量名}

变量名:由字母、下划线、数字组成,区分大小写,不能包含特殊字符,不能以数字开头

四大类变量

前三个都属于系统内部定义并赋值,用户直接使用

1.环境变量:

$USER 当前用户的用户名
$SHELL 当前用户登录的shell
$HOME 当前用户的家目录
$PATH 命令的搜索路径
$RANDOM 一个5位数以内的随机正整数

2.位置变量:

代表脚本执行程序后面的参数,如:$1代表第一个参数
$1,$2,$3...,${10},${11}...

例子:bash test.sh 参数1 参数2
$1就是参数1,$2就是参数2

注意:两位以上要用中括号括起来

3.预定义变量:

$? 程序退出后的状态值,一般0代表正常,非0代表异常
$# 列出已加载的位置变量的个数

4.自定义变量:用户自行定义,并完成赋值的变量

条件判断表达式

[ 条件判断表达式 ](中括号中的表达式的每一部分,前后都要用空格间隔开)

①数值比较

-eq 等于
-ne 不等于
-lt 小于
-le 小于或等于
-gt 大于
-ge 大于或等于

脚本控制结构

if条件判断

语法结构:
①单分支结构

if [ 条件判断表达式1 ];then
  命令序列1
fi

②双分支结构

if [ 条件判断表达式1 ];then
  命令序列1
else
  命令序列2
fi

③多分支结构

if [ 条件判断表达式1 ];then
  命令序列1
elif [ 条件判断表达式2 ];then
  命令序列2
elif [ 条件判断表达式3 ];then
  命令序列3
...
else
  命令序列n
fi

for循环

语法结构:
①单循环

for 变量名1 in 列表值1
do
    命令序列1
done

②嵌套双循环

for 变量名1 in 列表值1
do
    命令序列1
    for 变量名2 in 列表值2
    do
        命令序列2
    done
done

正则表达式

基本正则

正则符号描述
^匹配行首
$匹配行末
.匹配任意单个字符
*匹配前一个字符任意次数(包含0次)
()保留,看作一个整体(调用保留的内容,\n)
[]集合,匹配集合中的任意单个字符(连续的元素可以用-来连接,如a-c)
[^]对集合取反(1不包含a-c即匹配)
{n}匹配前一个字符n次
{n,m}匹配前一个字符n到m次
{n,}匹配前一个字符n次以上

扩展正则

正则符号描述
{n}匹配前一个字符n次
{n,m}匹配前一个字符n到m次
{n,}匹配前一个字符n次以上
()保留,看作一个整体(调用保留的内容,\n)
\ 或者,与()一起使用
+匹配前一个字符至少一次
匹配前一个字符最多一次(0次或1次,可有可无)

替换文本内容:sed -r 's/正则匹配原内容/正则匹配新内容/g' 文本
按照正则表达式匹配文本内容:sed -nr 's/正则表达式/p'

shell脚本样例

①helloworld脚本

[root@localhost ~]# vim hello.sh
#!/bin/bash
echo 'hello world'

[root@localhost ~]# chmod +x hello.sh 
[root@localhost ~]# ./hello.sh 
hello world

②创建用户脚本

(1)创建tom用户并设置密码
[root@localhost ~]# vim usercreate.sh
#!/bin/bash
#创建tom用户并设置密码
useradd tom
echo 123 | passwd --stdin tom

[root@localhost ~]# chmod +x usercreate.sh 
[root@localhost ~]# ./usercreate.sh 
(2)交互式自定义指定用户名和密码
[root@localhost ~]# vim usercreate1.sh
#交互式自定义指定用户名和密码
echo '######usercreate######'
read -p '请输入用户名:' un
read -p '请输入密码:' pw

useradd $un
echo $pw | passwd --stdin $un

[root@localhost ~]# ./usercreate1.sh 
######usercreate######
请输入用户名:tim
请输入密码:redhat
(3)非交互式自定义创建用户和设置密码
#非交互式自定义创建用户和设置密码
[root@localhost ~]# vim usercreate2.sh
echo '######usercreate######'
## $1为第一个参数,$2为第二个参数
useradd $1
echo $2 | passwd --stdin $1

[root@localhost ~]# ./usercreate.sh jack  jack123
(4)非交互式创建用户自定义输出结果
[root@localhost ~]# vim usercreate3.sh
echo '######usercreate######'
## 写入参数小于两个的时候返回信息停止脚本
[ $# -ne 2 ] && echo '使用说明:usercreate 用户名 密码' && exit
id $1  &> /dev/null
[ $? -eq 0 ] && echo "用户$1已存在" && exit
useradd $1 &> /dev/null
[ $? -eq 0 ] && echo "创建成功"
echo $2 | passwd --stdin $1 &> /dev/null

[root@localhost ~]# ./usercreate3.sh aa 123
######usercreate######
用户aa已存在
[root@localhost ~]# ./usercreate4.sh aa
######usercreate######
使用说明:usercreate 用户名 密码
(5)让系统能够识别报错信息;报错时返回值非0
[root@localhost ~]# vim usercreate4.sh
echo '######usercreate######'
## >&2 使echo的信息归类为错误的信息,系统默认是认为这不是一个报错
## exit 返回码;修改退出程序时的状态码
[ $# -ne 2 ] && echo '使用说明:usercreate 用户名  密码' >&2 && exit 4
id $1  &> /dev/null
[ $? -eq 0 ] && echo "用户$1已存在" >&2 && exit 5
useradd $1 &> /dev/null
[ $? -eq 0 ] && echo "创建成功"
echo $2 | passwd --stdin $1 &> /dev/null

## 脚本状态码
[root@localhost ~]# ./usercreate4.sh aa 123
######usercreate######
用户aa已存在
[root@localhost ~]# echo $?
5
[root@localhost ~]# ./usercreate4.sh aa
######usercreate######
使用说明:usercreate 用户名 密码
[root@localhost ~]# echo $?
4
[root@localhost ~]# ./usercreate4.sh aaa 123
######usercreate######
创建成功
[root@localhost ~]# echo $?
0

## 将输出变成错误输出
[root@localhost ~]# ./usercreate3.sh aaa 2> /dev/null 
######usercreate######
(6)使用if判断
[root@localhost ~]# vim usercreate.sh
先注释原来的内容【:34,40 s/\(.*\)/#\1/g】
echo '######usercreate######'
if [ $# -ne 2 ];then
    echo '使用说明:usercreate 用户名 密码' >&2
    exit 4
fi
id $1  &> /dev/null
if [ $? -eq 0 ];then
    echo "用户$1已存在" >&2
    exit 5
fi
useradd $1 &> /dev/null
if [ $? -eq 0 ];then
    echo "创建成功"
else
    echo "创建出错" >&2
    exit 6
fi
echo $2 | passwd --stdin $1 &> /dev/null

③猜数字

(1)基本猜数游戏
[root@localhost ~]# vim guestnum.sh
#!/bin/bash
echo '###    猜数字    ###'
echo '规则:猜一个1-10的数字'
## 因为$RANDOM生成的数是1-6位,所以需要限制到1-10,根据余数比除数小,所以余数可以为11,但是11的话可能会导致为0,所以要+1,但是如果为余数为10的时候再加1就变成11了,所以应当设置为10
ran=$[$RANDOM%10+1]
echo $ran ## 作弊用
read -p "输入一个数字:" num
if [ $ran -eq $num ];then
    echo "猜中了!"
else
    echo "猜错了!"
fi

## 验证
[root@localhost ~]# ./guestnum.sh  
###    猜数字    ###
规则:猜一个1-10的数字
5
输入一个数字:1
猜错了!
[root@localhost ~]# ./guestnum.sh
###    猜数字    ###
规则:猜一个1-10的数字
5
输入一个数字:5
猜中了!
(2)加入循环,猜10次
[root@localhost ~]# cat guestnum.sh 
#!/bin/bash
echo '###    猜数字    ###'
echo '规则:猜一个1-10的数字'
ran=$[$RANDOM%10+1]
for i in {1..10}
do
   echo "第$i次,剩下$[10-i]次"
   read -p "输入一个数字:" num
   if [ $ran -eq $num ];then
       echo "猜中了!"
       exit
   else
       echo "猜错了!"
   fi
done

④ 乘法表

效果

image-20210807175955624

思路

随手写的思路

从效果图看,就是一行一行的输入,需要使用到多循环,外循环一次代表着每一行;内循环一次就是一条公式的输出;

首先从整体可以看到,是一行一行进行输入的,所以内循环也只执行了一次,第二行的时候执行执行了两次,也就是说内循环循环几次取决于现在在第几行,所以他的条件是外循环的变量

接着找规律,
1.是9行,所以外循环执行了9次,1-9都执行了一次,所以是seq 9
2.乘法的第一个数字都是1,所以可以确定第一个数字用的是内循环的变量
3.乘法的第二个数字都是第几行,都是不变的,所以可以确定第二个乘数是外循环的变量

得出

#!/bin/bash
for i in `seq 9` ## 外循环,9行数据,循环9次
do
  for j in `seq $i` ## 内循环,因为第二个数字不可能超出所在行数,所以乘到了$i就该停了
  do
    ## 默认echo是换行的,-n输出不换行
    echo -n "${j}x${i}=$[i*j]"
  done
  echo ## 当一行结束后,回车一下开始输入下一行
done
代码

两个方法区别在于排版时候的操作方法不一样

#!/bin/bash
for i in `seq 9`
do
  for j in `seq $i`
  do
    echo -n "${j}x${i}=$[i*j]"
    ## -le小于或等于,个位数的时候输入两个空格,其他情况一个空格
    if [ $[i*j] -le 9 ];then
       echo -n '  '
    else
       echo -n ' '
    fi
  done
  echo
done

或者

#!/bin/bash
for i in `seq 9`
do
  for j in `seq $i`
  do
      ## n:不换行;e:开启扩展 \t:使用tab建
    echo -ne "${j}x${i}=$[i*j]\t"
  done
  echo
done
table键,是制表键,所以可以自动把排版排好

⑤创建一个添加用的脚本

要求:
创建脚本/root/usercreate_f.sh
脚本通过包含用户名的文件(/root/userlist)来创建
此脚本要求提供一个参数,这个参数是用于指定包含用户名的文件
如果没有这个参数,则给出提示信息:Usage:usercreate_f.sh ,然后退出返回值44
如果提供一个不存在的文件名,则给出提示信息:file not found,然后退出返回值23
创建的用户登录shell为/bin/false,不需要为用户设置密码
1. 创建第一个用户
## 
[root@workstaion ~]# vim /root/userlist
zhongqiu
guoqing
duanwu
chunjie
yuanxiao
2. 开始编辑脚本

第一种写法

[root@workstaion ~]# vim usercreate_f.sh
if [ $# -ne 1 ];then
  echo 'Usage:usercreate_f.sh  <userfile>'
  exit 44
fi

if [ ! -f $1 ];then
  echo 'file not found'
  exit 23
fi

for un in `cat $1`
do
  useradd -s /bin/false $un
done

第二种写法

#!/bin/bash
if [ $# -ne 1 ];then
  echo 'Usage:usercreate_f.sh  <userfile>'
  exit 44
elif [ ! -f $1 ];then
  echo 'file not found'
  exit 23
else
  for un in `cat $1`
  do
   useradd -s /bin/false $un
  done
fi
3. 测试
[root@workstaion ~]# chmod +x usercreate_f.sh
[root@workstaion ~]# ./usercreate_f.sh  userlist

⑥创建一个脚本输出信息

要求:
创建脚本/root/foo.sh
当运行/root/foo.sh redhat,输出为fedora
当运行/root/foo.sh fedora,输出为redhat
当没有任何参数或参数不是redhat或fedora时,输出报错信息:
/root/foo.sh redhat | fedora
[root@workstaion ~]# vim /root/foo.sh
#!/bin/bash
if [ $# -ne 1 ];then
  echo '/root/foo.sh  redhat | fedora' >&2
  exit
elif [ $1 == redhat ];then
  echo fedora
elif [ $1 == fedora ];then
  echo redhat
else
  echo '/root/foo.sh  redhat | fedora' >&2
  exit
fi

⑦国际象棋棋盘

[root@workstaion ~]# vim chess.sh 
for i in {1..8}
do
  for j in {1..8}
  do
  s=$[i+j]
  if [ $[s%2] -eq 0 ];then
    echo -ne "  "
  else
    echo -ne "\033[47m  \033[0m"
  fi
  done
  echo
done

二、 网站服务

HTTP服务通信过程

img

img

部署

三、 数据库

1. 安装

①安装
[root@localhost ~]# yum -y install mariadb mariadb-server
②查看数据库目录
[root@localhost ~]# ls /var/lib/mysql/
③自启
## 启动服务并设置服务开机自启
[root@localhost ~]# systemctl restart mariadb
[root@localhost ~]# systemctl enable mariadb
④查看数据库目录
启动后会出现默认的文件
[root@localhost ~]# ls /var/lib/mysql/
aria_log.00000001  ibdata1      multi-master.info   performance_schema
aria_log_control   ib_logfile0  mysql               tc.log
ib_logfile1  mysql.sock          ib_buffer_pool     ibtmp1
mysql_upgrade_info

2. 管理

1. 空密码连接数据库

## 刚安装完的时候
[root@localhost ~]# mysql
MariaDB [(none)]> exit;

2. 初始化数据库

[root@localhost ~]# mysql_secure_installation 
Enter current password for root (enter for none): 【回车】
Set root password? [Y/n] 【回车】
New password: 【redhat】
Re-enter new password: 【redhat】
Remove anonymous users? [Y/n] 【回车】
Disallow root login remotely? [Y/n] 【回车】
Remove test database and access to it? [Y/n] 【回车】
Reload privilege tables now? [Y/n] 【回车】

## 翻译
Enter current password for root (enter for none):<–初次运行直接回车
Set root password? [Y/n] <– 是否设置root用户密码,输入y并回车或直接回车
New password: <– 设置root用户的密码
Re-enter new password: <– 再输入一次你设置的密码
Remove anonymous users? [Y/n] <– 是否删除匿名用户,生产环境建议删除,所以直接回车
Disallow root login remotely? [Y/n] <–是否禁止root远程登录,根据自己的需求选择Y/n并回车,建议禁止
Remove test database and access to it? [Y/n] <– 是否删除test数据库,直接回车
Reload privilege tables now? [Y/n] <– 是否重新加载权限表,直接回车

3. 连接数据库

命令格式:mysql  [-h 主机 -P 端口号]  -u用户名  -p密码

①非交互式连接(脚本连接数据库)
[root@localhost ~]# mysql -h localhost -P 3306 -uroot -predhat
MariaDB [(none)]> exit;                                    ###退出数据库
[root@localhost ~]# mysql -uroot -predhat
MariaDB [(none)]> quit;    

②交互式连接(生产环境连接数据库)
[root@localhost ~]# mysql -uroot -p
Enter password: 【redhat】

4. 修改数据库密码

## 格式 mysqladmin -u用户名 -p旧密码 password 
[root@localhost ~]# mysqladmin -uroot -predhat password 
New password: 【123】
Confirm new password: 【123】

5. 导出导入

测试数据库:[下载]:https://pan.o4g.cn/d/Home/%E4%B8%B4%E6%97%B6%E5%85%B1%E4%BA%AB/users.sql
需要先创建数据库,然后再导入

### 数据导出
mysqldump  -u 用户名  -p [密码] [选项] [数据库名] [表名] > /备份路径/备份文件名
[root@localhost ~]# mysqldump -u root -p student > 备份文件
[root@localhost ~]# mysqldump -u root -p student good > 备份文件

### 数据导入
mysql -u root -p [数据库名] < /备份路径/备份文件名
[root@localhost ~]# mysql -u root -p zhyx < users.sql

3. 基本管理

1. 数据库

# 查看全部数据
show databases;

# 选择数据库
use 数据库名

# 创建数据库
create database 数据库名;

# 删除数据库
drop database 数据库名;

2. 数据库表

# 在当前数据库添加表
create table 表名 (
id int(8) primary key,
name varchar(64)
)

# 查看当前数据库有哪些表
show tables;

# 查看表结构信息
desc 数据表名;

# 删除指定表
drop table 数据表名;

# 查看表中的内容
语法格式:select  表字段   from   库名称.表名称;
MariaDB [zhyx]> select * from base;            ###表字段为*,通配符查看所有表字段
MariaDB [zhyx]> select id from base;            ###查看一个表字段
MariaDB [zhyx]> select id,name from base;        ###查看多个表字段,使用","分隔
MariaDB [zhyx]> select name,id from base;        ###表字段命令中的顺序决定输出结果顺序

# 联表查询
语法格式:select * from 表名1,表名2 where 表名1.表字段1='值1' and 表名2.表字段2='值2' 表1.id=表2.id;

案例1:查询出名字为Barbara且居住在Paris的人的密码是多少?
MariaDB [zhyx]> select base.password from base,location where base.name="Barbara" and base.id=location.id and location.city="Paris";

案例2:查询出居住在Sunnyvale,且密码为solicitous的人的数量有多少?
MariaDB [zhyx]> select count(*) from base,location where location.city="Sunnyvale" and location.id=base.id and base.password="solicitous";

3. 用户授权

# 语法格式:grant 权限列表 on 数据库名.表名 to 用户名@客户机地址 identified by '密码';
# 权限列表:insert  delete  update  select  all

# 案例1:除了root用户外,zhyx数据库还能被lisi用户在本地查询,通过密码123进行验证
MariaDB [zhyx]> grant select on zhyx.* to lisi@localhost identified by '123';
## 命令解析:授权   读(权限)  在   zhyx库.所有表  给   lisi用户 在 本地 验证 通过 123(这个密码)

# 检查测试
MariaDB [zhyx]> select user,host from mysql.user;

# 新开终端测试连接
[root@localhost ~]# mysql -ulisi -p123
MariaDB [(none)]> show databases;

# 如果命令敲错,可以取消授权,重新配置
MariaDB [zhyx]> revoke select on zhyx.* from lisi@localhost;

四、 Ansible

①简介

ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。
  ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远
程主机通讯的。

应用场景:自动化运维,批量管理架构内的主机

1. 特点

  1. 无客户端:不需要在客户端上安装和配置软件,随便一台主机都可以是客户端
  2. 无代理:不需要专门的代理软件(Ansible通过ssh协议实现远程批量管理的)
  3. 跨平台支持:支持Linux、Windows、网络设备
  4. 配置简单,容易理解
  5. 基于python开发(方便二次开发),RHEL原生支持的环境,丰富的内置模块
  6. 可以通过playbook完成复杂的功能
  7. 幂等性:如果一个任务已经执行成功后,就不会重复地执行,避免被管理的主机出错

注意:管理节点(控制节点),必须是Linux或Unix

2. 节点分类

管理节点(控制节点):安装了Ansible软件,负责管理其它机器的节点

托管节点(受控节点):被Ansible管理、控制的节点

3. 服务框架

image-20210815152104273

Ansible组件:
  • inventory:用于指定托管节点的清单、分组
  • modules:Ansible的内置模块,实现Ansible的主要功能
  • API:应用接口
  • plugins:插件
Ansible使用者:
  • user:用户,可以直接通过命令行ad-hoc进行管理
  • playbook:用户可以间接通过playbook剧本进行批量管理
Ansible作用对象:
  • hosts:主机、服务器
  • network:网络,可以是物理网络或虚拟网络
Ansible的工作流程(原理):

加载ansible配置文件-->查找和加载inventory清单-->加载模块-->通过ansible将模块的指令生成临时文件*.py(python)-->将这些python文件传输到托管节点上-->托管节点接受python文件并赋予执行权限-->执行py程序,并返回结果-->管理节点接收结果并删除临时文件

②实验环境准备

物理机配置

控制面板\网络和Internet\网络连接

VMnet1--属性--Internet协议版本4--属性--使用下面的IP地址--IP地址172.25.250.44,子网掩码255.255.255.0

image-20210815153021377

环境节点介绍

管理节点

workstation.example.com 172.25.250.9/24

托管节点

至少需要2台
node1.example.com 172.25.250.10/24 gateway:172.25.250.254
node2.example.com 172.25.250.11/24 gateway:172.25.250.254

虚拟机模板初始化配置

## 保证这台服务器是全新没操作过东西的
##  配置yum源 -》 安装必备软件包
[root@localhost ~]# mount /dev/cdrom /mnt/
[root@localhost ~]# dnf config-manager --add file:///mnt/AppStream
[root@localhost ~]# dnf config-manager --add file:///mnt/BaseOS
[root@localhost ~]# echo gpgcheck=0 >> /etc/yum.repos.d/mnt_AppStream.repo 
[root@localhost ~]# echo gpgcheck=0 >> /etc/yum.repos.d/mnt_BaseOS.repo 
[root@localhost ~]# yum clean all
[root@localhost ~]# yum repolist
## 托管节点必须有python
[root@localhost ~]# yum -y install net-tools vim bash-completion bzip2 tree chrony bind-utils policycoreutils-python-utils python38
[root@localhost ~]# rm -rf /etc/yum.repos.d/*
[root@localhost ~]# poweroff  -f

克隆虚拟机

虚拟机的当前状态--创建链接克隆--命名与选择存放路径
克隆两台虚拟机出来

配置workstation

①配置yum源
[root@localhost ~]# mkdir /dvd
[root@localhost ~]# vim /etc/fstab 
/dev/cdrom  /dvd  iso9660  defaults 0 0

[root@localhost ~]# mount -a
[root@localhost ~]# dnf config-manager --add file:///dvd/AppStream
[root@localhost ~]# dnf config-manager --add file:///dvd/BaseOS
[root@localhost ~]# echo gpgcheck=0 >> /etc/yum.repos.d/dvd_AppStream.repo 
[root@localhost ~]# echo gpgcheck=0 >> /etc/yum.repos.d/dvd_BaseOS.repo 
[root@localhost ~]# yum -y install wget
## 软件包可自行上传,这边是通过通个局域网的服务器进行传输的
[root@localhost ~]# wget http://172.25.0.254/ansible_2.8.tar.gz
[root@localhost ~]# ls ansible_2.8.tar.gz 
[root@localhost ~]# mkdir /ansible2.8
[root@localhost ~]# tar -xf ansible_2.8.tar.gz -C /ansible2.8/
[root@workstation ~]# ls -la /ansible2.8/var/www/html/ansible_2.8/
总用量 4
drwxr-xr-x. 4 root root   38 7月  27 03:06 .
drwxr-xr-x. 3 root root   25 8月  15 07:34 ..
drwxr-xr-x. 4 root root   24 7月  27 03:06 Packages
drwxr-xr-x. 2 root root 4096 7月  27 03:06 repodata
## 这个压缩包解压出来的是仓库的目录,所以创建一个新的仓库
[root@localhost ~]# dnf config-manager --add file:///ansible2.8/var/www/html/ansible_2.8/
[root@localhost ~]# echo gpgcheck=0 >> /etc/yum.repos.d/ansible2.8_var_www_html_ansible_2.8_.repo 
[root@localhost ~]# yum clean all 
[root@localhost ~]# yum repolist 
[root@workstation ~]# yum repolist 
仓库标识                                                                仓库名称
ansible2.8_var_www_html_ansible_2.8_                                    created by dnf config-manager from file:///ansible2.8/var/www/html/ansible_2.8/
②配置IP地址、主机名、hosts文件解析
[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 172.25.250.9/24 connection.autoconnect yes
[root@localhost ~]# nmcli connection up ens160 
[root@localhost ~]# hostnamectl set-hostname workstation.example.com
[root@workstation ~]# vim /etc/hosts 
###添加以下3行配置
172.25.250.9 workstation.example.com workstation
## 以下一个IP写了三个主机名是为了后续做实验方便测试一些东西
172.25.250.10 node1.example.com node1 node3.example.com node3 node5.example.com node5
172.25.250.11 node2.example.com node2 node4.example.com node4

配置node1

[root@localhost ~]# hostnamectl set-hostname node1.example.com
[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 172.25.250.10/24 ipv4.gateway 172.25.250.254 connection.autoconnect yes
[root@localhost ~]# nmcli connection up ens160 

配置node2

[root@localhost ~]# hostnamectl set-hostname node2.example.com
[root@localhost ~]# nmcli connection modify ens160 ipv4.method manual ipv4.addresses 172.25.250.11/24 ipv4.gateway 172.25.250.254 connection.autoconnect yes
[root@localhost ~]# nmcli connection up ens160 

配置workstation免密登录node1和node2

理由:因为Ansible是通过ssh将py脚本放托管节点上运行的,所以管理节点最好可以直接免密登录托管节点
[root@workstation ~]# su - student
[student@workstation ~]$ ssh-keygen 
【一直回车】
[student@workstation ~]$ ssh-copy-id student@node1
【根据提示输入node1节点的student用户密码student】
[student@workstation ~]$ ssh student@node1
[student@workstation ~]$ ssh-copy-id student@node2
【根据提示输入node2节点的student用户密码student】
[student@workstation ~]$ ssh student@node2

③部署Ansible

1. 安装服务

[root@workstation ~]# yum -y install ansible
[root@workstation ~]# su - student
[student@workstation ~]$ ansible --version
[root@workstation ~]# ansible --version
ansible 2.8.0
  configured module search path = ['/root/.ansible/plugins/modules', '/usr/share/ansible/plugins/modules']
  ansible python module location = /usr/lib/python3.6/site-packages/ansible
  executable location = /usr/bin/ansible
  python version = 3.6.8 (default, Dec  5 2019, 15:45:45) [GCC 8.3.1 20191121 (Red Hat 8.3.1-5)]

2. 配置Ansible清单

1、创建清单文件
# 创建项目目录
## 按照正常情况下每个项目都有一个独立目录,这样方便管理归纳
[student@workstation ~]$ mkdir ansible
# 切换到项目目录
[student@workstation ~]$ cd ansible/
# 创建inventory清单文件
[student@workstation ansible]$ vim inventory
[servers]    ## 分组名字
## 主机信息可以为IP 主机名 域名
172.25.250.10
172.25.250.11
node3
node4
node5.example.com

[db]
172.25.250.10
172.25.250.11

[web]
node3
node4

[storage]
node5.example.com
## :children代表这是一个大组,用来将多个组的信息包含进来,下面写的信息是组名
[lamp:children]
db
web
2、测试
## all列出这个配置文件里面的全部主机信息,重复的不会列出
[student@workstation ansible]$ ansible -i inventory all --list-hosts
## all列出这个配置文件里面的servers组内的主机信息
[student@workstation ansible]$ ansible -i inventory servers --list-hosts
[student@workstation ansible]$ ansible -i inventory db --list-hosts
[student@workstation ansible]$ ansible -i inventory web --list-hosts
[student@workstation ansible]$ ansible -i inventory storage --list-hosts
[student@workstation ansible]$ ansible -i inventory lamp --list-hosts
  hosts (4):
    172.25.250.10
    172.25.250.11
    node3
    node4

3. 创建Ansible配置文件

Ansible的配置文件不是固定的:按照优先级排序决定当前生效的配置文件是哪一个
优先级从高到低,按如下顺序排列:

  1. 环境变量
  2. 所在目录的./ansible.cfg
  3. 当前用户的家目录中~/ansible.cfg
  4. 服务主配置文件/etc/ansible/ansible.cfg
①通过给环境变量ANSIBLE_CONFIG赋值来指定配置文件的存放路径
export ANSIBLE_CONFIG='/路径/ansible.cfg'                ###临时配置,重启失效
[student@workstation ansible]$ export ANSIBLE_CONFIG='/tmp/ansible.cfg'
[student@workstation ansible]$ touch /tmp/ansible.cfg
[student@workstation ansible]$ ansible --version
  config file = /tmp/ansible.cfg
[student@workstation ansible]$ export ANSIBLE_CONFIG=''  ## 取消环境变量
②当前所在目录的./ansible.cfg(最常用)
### 一般是在项目的目录中创建配置文件ansible.cfg,当要管理这个项目时就切换到对应目录使得这个配置文件生效
[student@workstation ansible]$ touch ./ansible.cfg
[student@workstation ansible]$ ansible --version
  config file = /home/student/ansible/ansible.cfg
③当前用户的家目录中~/ansible.cfg(不常用)
[student@workstation ansible]$ cd ..
[student@workstation ~]$ pwd
/home/student
[student@workstation ~]$ touch ./ansible.cfg
[student@workstation ~]$ ansible --version
ansible 2.8.0
  config file = /home/student/ansible.cfg
④安装软件包后会自动生成一个配置文件/etc/ansible/ansible.cfg(一般不用)
[student@workstation ~]$ vim /etc/ansible/ansible.cfg
## 一般用户查询代码,不需要修改
## 以下是常用的代码
[defaults]
#inventory      = /etc/ansible/hosts     指定清单文件的位置
#remote_tmp     = ~/.ansible/tmp         指定托管主机存放临时文件的路径
#local_tmp      = ~/.ansible/tmp         指定本地存放临时文件的路径
#forks          = 5                      指定并发量
#remote_port    = 22                     远程登录的端口号

[privilege_escalation]                   
#become=True                             使用ansible时要不要提权
#become_method=sudo                      指定提权的方式
#become_ask_pass=False                   提权时是否需要密码

通过第二种办法来创建我们的项目配置文件

[student@workstation ~ ]$ cd ansible
[student@workstation ansible]$ vim ansible.cfg 
[defaults]
inventory=inventory

[privilege_escalation]
become=True
become_method=sudo
become_ask_pass=False

## 测试配置文件是否生效
[student@workstation ansible]$ ansible all --list-hosts
  hosts (5):
    172.25.250.10
    172.25.250.11
    node3
    node4
    node5.example.com

4. 设置免密sudo提权

## node1上操作
[root@node1 ~]# vim /etc/sudoers.d/student
student ALL=(ALL)       NOPASSWD: ALL

## node2上操作
[root@node2 ~]# vim /etc/sudoers.d/student
student ALL=(ALL)       NOPASSWD: ALL

5. 测试环境部署是否正常

# 使用ping模块测试Ansible管理节点和托管节点是否可用
# 此ping模块不是icmp ping ,是测试托管节点上的python是不是正常
## 执行的时候有点卡顿属于正常
[student@workstation ansible]$ ansible all -m ping 
【第一次打这条命令会卡住,此时多次输入yes回车,直到命令结束即可】
【然后再次执行这条命令,查看结果判断环境部署是否正常】


Snipaste_2021-08-15_15-07-43

image-20210816001018863

④通过ad-hoc管理Ansible

ad-hoc命令格式

ansible   [-i  inventory清单位置]   主机或主机组   选项   参数
常用的选项和参数:
-m  模块        用于指定这一次命令任务使用的模块
-a   参数        用于指定模块的参数
-K            如果sudo没有设置免密,则通过-K让Ansible询问sudo的密码
-k            如果ssh没有设置免密,则通过-k让Ansible询问ssh的密码
-f            指定并发数
-b            如果配置文件中没有开启提权,则可以通过-b指定本次任务使用提权
-v            在执行ansible的命令时,当前使用的一些配置

Ansible模块

1. 查询模块
## 查看Ansible所有可用的模块
[student@workstation ansible]$ ansible-doc -l

## 关键词过滤
[student@workstation ansible]$ ansible-doc -l | grep 关键词
[student@workstation ansible]$ ansible-doc -l | grep ping

## 查看模块的详细介绍帮助
[student@workstation ansible]$ ansible-doc ping

## 查看官网官方文档:
https://docs.ansible.com/ansible/2.9/index.html
2.常用模块
①ping:用于检查托管节点能否运行基于python的模块
[student@workstation ansible]$ ansible db -m ping
[student@workstation ansible]$ ansible web -m ping
[student@workstation ansible]$ ansible storage -m ping
②指令模块
  • command:用于在托管节点上执行Linux命令,不经过托管节点的shell
  • shell:用于在托管节点上执行Linux命令,支持shell环境变量、重定向、管道等操作
  • raw:用于在托管节点上执行Linux命令,不需要安装python就可以执行

(这三个模块都不具有幂等性)

[student@workstation ansible]$ ansible servers -m command -a hostname
## 不指定模块默认是commmand
[student@workstation ansible]$ ansible servers -a hostname    
[student@workstation ansible]$ ansible servers -m shell -a 'ls /etc/fstab'
[student@workstation ansible]$ ansible db -m raw -a 'rpm -q python38'
③file:用于管理远程托管节点上的文档(创建、删除、属性设置)
参数说明
group组名设置文档的所属组
mode权限设置文档的权限
owner用户名设置文档的所有者
path路径管理文档的路径
recurse(yes\no)[no]递归
state(file\directory\touch\absent)[file]模块状态
[student@workstation ansible]$ ansible web -m file -a 'path=/home/student/file1 state=touch'
[student@workstation ansible]$ ansible web -m file -a 'path=/home/student/dir1 state=directory'
[student@workstation ansible]$ ansible web -m command -a 'ls -l /home/student'
[student@workstation ansible]$ ansible web -m file -a 'path=/home/student/file1 owner=student group=student mode=0744'
[student@workstation ansible]$ ansible web -m file -a 'path=/home/student/dir1 state=absent'
④copy:用于将管理节点(本地)的文档复制到远程托管节点
参数说明
backup(yes\no)[no]重名时是否备份文档
content内容不是复制本地文档,而是编写内容
src源文档路径本地文档路径(目录默认递归)
dest目标路径托管节点存放文档的路径
force(yes\no)[yes]重名时是否覆盖
group组名设置文档的所属组
mode权限设置文档的权限
owner用户名设置文档的所有者
[student@workstation ansible]$ ansible db -m copy -a 'content="zhyx\nredhat" dest=/home/student/file2'
[student@workstation ansible]$ ansible db -a 'cat /home/student/file2'
[student@workstation ansible]$ ansible db -m copy -a 'src=/etc/yum.conf dest=/mnt'
[student@workstation ansible]$ ansible db -a 'ls /mnt/yum.conf'
[student@workstation ansible]$ ansible db -m copy -a 'content="zhyx" dest=/mnt/yum.conf backup=yes group=root owner=student mode=0644'
[student@workstation ansible]$ ansible db -m shell -a 'ls -l /mnt/yum.conf*'
[student@workstation ansible]$ ansible db -m shell -a 'cat /mnt/yum.conf'

  1. a-c
Last modification:August 16th, 2021 at 12:18 am