49.运维6-ansible
58.SSH远程连接:
0.回顾
1) 实时同步服务原理
a 部署好rsync守护进程 传输数据
b 部署好inotify软件 监控数据变化
c 部署安装sersync软件 将rsync+inotify软件结合
2) 相关软件部署安装
3) sersync的配置过程
rsync命令掌握sersync服务配置方法
1.远程管理服务概念介绍
SSH 安全的远程连接 数据信息是加密的 22 SSH服务默认可以root用户远程连接 系统远程连接
TELNET 不安全的远程连接 数据信息是明文的 23 telnet服务默认不可以让root用户远程连接 网络设备远程连接
补充: 什么是shell
1. 每连接登录到一个linux系统中,就是一个shell
2. 可以一个linux系统有多个会话连接,每一个会话都是一个shell
3. 系统中用户可以实现相互转换,每转换一个用户就是一个shell
shell特点说明:
1. 一般命令行临时配置的信息,只会影响当前shell
2. 命令配置的信息如果想生效,需要切换shell eg: 修改主机名称
2.SSH服务连接工作原理(数据加密)
[root@backup ~]# ssh 192.168.31.31
[root@nfs01 ~/.ssh]# ls
# known_hosts文件代表着你可以操控哪些主机,authorized_keys文件代表着哪些主机可以通过秘钥连接你的服务器
authorized_keys known_hosts
补充:加入AB两台服务器,B是服务端,A是客户端,a客户端想要通过秘钥形式连接b服务器,需要客户端将他的公钥发送给b服务端.
私钥: 钥匙
公钥: 锁头
第一个步骤: 客户端 执行远程连接命令
第二个步骤: 客户端 服务端 建立三次握手过程
第三个步骤: 服务端 让客户端进行确认是否接收服务端公钥信息
第四个步骤: 客户端 进行公钥确认,接收到公钥信息
第五个步骤: 服务端 让客户端确认登录用户密码信息
第六个步骤: 客户端 进行密码信息确认
第七个步骤: 客户端 服务端 远程连接建立成功
私钥和公钥作用:
01. 利用私钥和公钥对数据信息进行加密处理
02. 利用公钥和私钥进行用户身份认证
基于密码的方式进行远程连接: 公钥和私钥只能完成数据加密过程
基于秘钥的方式进行远程连接: 公钥和私钥可以完成身份认证工作
3.SSH远程连接的方式
a 基于口令的方式进行远程连接 连接比较麻烦 连接不太安全
b 基于秘钥的方式进行远程连接 连接方便 连接比较安全
基于秘钥方式连接过程(原理)
1. 客户端(管理端) 执行命令创建秘钥对
2. 客户端(管理端) 建立远程连接(口令),发送公钥信息
3. 客户端(管理端) 再次建立远程连接
4. 服务端(被管理端) 发送公钥质询信息(你要是能打开我的锁头吗)
5. 客户端(管理端) 处理公钥质询信息(钥匙将锁头打开),将质询结果返回给服务端
6. 服务端(被管理端) 接收到质询结果,建立好远程连接
4.SSH实现基于秘钥连接的部署步骤
准备工作:
准备好一台管理服务器
第一个历程: 管理端创建秘钥对信息
[root@m01 ~]# ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/root/.ssh/id_dsa):
Created directory '/root/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_dsa.
Your public key has been saved in /root/.ssh/id_dsa.pub.
第二个历程: 管理端需要将公钥进行分发
ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31
第三个历程: 进行远程连接测试
ssh 172.16.1.41 --- 不用输入密码信息可以直接连接
问题:
01. 如何实现批量管理多台主机
如何编写脚本进行批量分发公钥???
编写脚本最简单方式: 堆命令
#!/bin/bash
for ip in 31 7 41
do
ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.$ip
done
问题: 有交互过程
01. 需要有确认yes或no
02. 需要输入密码信息 OK
03. 服务端端口号变化了,如何分发公钥
如何不用交互输入密码信息,进行远程连接分发公钥:
第一步骤: 下载安装软件
yum install -y sshpass
第二步骤: 执行免交互方式分发公钥命令
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41
如何不要输入连接yes或no的确认信息
ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 "-o StrictHostKeyChecking=no"
服务端口号发生变化,如何进行批量分发公钥
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.41 -p 52113 "-o StrictHostKeyChecking=no"
分发公钥脚本:
[root@m01 scripts]# vim fenfa_pub_key.sh
#!/bin/bash
for ip in {1..100}
do
echo "==================== host 172.16.1.$ip pub-key start fenfa ==================== "
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.$ip "-o StrictHostKeyChecking=no" &>/dev/null
echo -e "host 172.16.1.$ip fenfa success."
echo "==================== host 172.16.1.$ip fenfa end ==================== "
echo ""
done
分发公钥检查脚本(批量管理脚本) --- 串型批量管理
[root@m01 scripts]# cat check_pub_key.sh
#!/bin/bash
CMD=$1
for ip in {7,31,41}
do
echo "==================== host 172.16.1.$ip check ==================== "
ssh 172.16.1.$ip $CMD
echo ""
done
5. SSH服务配置文件
/etc/ssh/sshd_config
Port 22 --- 修改服务端口信息
ListenAddress 0.0.0.0 --- 监听地址 指定一块网卡能够接受远程访问请求 *****
PS: 指定监听地址只能是本地网卡上有的地址
PermitEmptyPasswords no --- 是否允许远程用户使用空密码登录,默认不允许
PermitRootLogin yes --- 是否禁止root用户远程连接主机 建议改为no
GSSAPIAuthentication no --- 是否开启GSSAPI认证功能 不用的时候关闭
UseDNS no --- 是否开启反向DNS解析功能 建议进行关闭
6. SSH远程服务防范入侵的案例 http://phenixikki.blog.51cto.com/7572938/1546669
1. 用密钥登录,不用密码登陆
2、牤牛阵法:解决SSH安全问题
a.防火墙封闭SSH,指定源IP限制(局域网、信任公网)
b.开启SSH只监听本地内网IP(ListenAddress 172.16.1.61)。
3、尽量不给服务器外网IP
4、最小化(软件安装-授权) # 777这种权限不要给,
一台服务器劲量安装较少的服务,可以使得暴露的端口比较少
5、给系统的重要文件或命令做一个指纹
/etc/passwd md5sum 11110000aaaabbbb 监控
inotify /bin 监控
6、给他锁上 chattr +i
7. SSH相关的命令总结
ssh-keygen
ssh-copy-id
sshpass 解决交互式密码输入问题
ssh
scp
sftp 172.16.1.41
ls 查看远程ftp服务器信息
cd --- 查看远程ftp服务器信息
lls 查看本地ftp客户端信息
lcd --- 查看本地ftp客户端信息
get --- 下载信息
put --- 上传信息
help --- 查看命令帮助
bye --- 退出ftp连接
问题:
1.如何实现xshell也是基于秘钥方式连接主机
https://www.zhiniaoyun.net/help/article/84.html
59.SSH远程连接回顾:
1.回顾
1. 远程管理服务介绍
ssh 数据加密 22
telnet 数据明文 23
2. SSH远程管理服务工作原理
私钥 公钥
用途1: 对数据进行加密处理
用途2: 对用户访问进行认证
3. SSH远程连接的方式
a 基于口令的方式进行连接
b 基于秘钥的方式进行连接
基于秘钥连接的工作原理
4. 基于秘钥的连接部署方式
第一个历程: 创建秘钥对(管理端服务器)
ssh-keygen -t 秘钥的类型(dsa|rsa)
第二个历程: 将公钥进行分发(被管理端服务器)
ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31
如何批量分发公钥:
01. 需要输入连接确认信息 yes/no
ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no"
02. 需要第一次连接输入密码
yum install -y sshpass
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 "-o StrictHostKeyChecking=no"
03. 远程服务器SSH服务端口号改动了
sshpass -p123456 ssh-copy-id -i /root/.ssh/id_dsa.pub root@172.16.1.31 -p 52113 "-o StrictHostKeyChecking=no"
基于秘钥连接排错思路:
01. 利用命令进行连接测试
02. 检查公钥在被管理主机上是否存在,并且与管理端公钥信息是否相同
03. 利用公钥分发命令重新分发公钥
04. 检查脚本的编写
05. 调试脚本功能 sh -x
5. SSH远程服务防范入侵案例
6. SSH服务的配置文件编写
监听地址???
7. SSH服务的相关命令总结
60.批量管理:
0.课程介绍部分
1. ansible批量管理服务概念
2. ansible批量管理服务特点
3. ansible批量管理服务部署
4. ansible批量管理服务应用---模块应用
ansible模块命令语法
ansible常用模块
1.ansible批量管理服务介绍
ansible批量管理服务意义
01. 提高工作的效率
02. 提高工作准确度
03. 减少维护的成本
04. 减少重复性工作
ansible批量管理服务功能
01. 可以实现批量系统操作配置
02. 可以实现批量软件服务部署
03. 可以实现批量文件数据分发
04. 可以实现批量系统信息收集
2.ansible批量管理服务部署
管理端服务器
第一个历程: 安装部署软件
yum install -y ansible --- 需要依赖epel的yum源
/etc/ansible/ansible.cfg --- ansible服务配置文件
/etc/ansible/hosts --- 主机清单文件 定义可以管理的主机信息
/etc/ansible/roles --- 角色目录???
第二个历程: 需要编写主机清单文件
vim /etc/ansible/hosts
第三个历程: 测试是否可以管理多个主机
脚本 hostname
ansible all -a "hostname"
[root@m01 scripts]# ansible all -a "hostname"
172.16.1.41 | CHANGED | rc=0 >>
backup
172.16.1.7 | CHANGED | rc=0 >>
web01
172.16.1.31 | CHANGED | rc=0 >>
nfs01
3.ansible服务架构信息
1) 主机清单配置
2) 软件模块信息 OK
3) 基于秘钥连接主机 OK
4) 主机需要关闭selinux OK
5) 软件剧本功能
4.ansible软件模块应用
ansible官方网站: https://docs.ansible.com/
模块的应用语法格式:
ansible 主机名称/主机组名称/主机地址信息/all -m(指定应用的模块信息) 模块名称 -a(指定动作信息) "执行什么动作"
5.ansible特点说明
1) ansible服务概念介绍
a 批量管理多台主机
b 提高运维工作效率
c 降低运维工作难度
2) ansible服务特点说明
01. 管理端不需要启动服务程序(no server)
02. 管理端不需要编写配置文件(/etc/ansible/ansible.cfg)
03. 受控端不需要安装软件程序(libselinux-python)
被管理端selinux服务没有关闭 --- 影响ansible软件的管理
libselinux-python让selinux开启的状态也可以使用ansible程序
04. 受控端不需要启动服务程序(no agent)
05. 服务程序管理操作模块众多(module)
06. 利用剧本编写来实现自动化(playbook)
3) ansible服务部署安装
a 安装服务软件
b 编写主机清单
c 进行管理测试
补充: 远程主机无法管理问题分析
1. 管理端没有分发好主机的公钥
2. 被管理端远程服务出现问题
3. 被管理端进程出现僵死情况
/usr/sbin/sshd -D --- 负责建立远程连接
sshd: root@pts/0 --- 用于维护远程连接(windows--linux)
sshd: root@notty --- 用于维护远程连接(ansible--被管理端)
4) ansible服务模块应用
command (默认模块)
shell (万能模块)
script (脚本模块)
copy (批量分发文件) 管理端 ---> 多个被管理
fetch (批量拉取数据) 管理端 <--- 多个被管理
dest
src
ansible 172.16.1.31 -m fetch -a "src=/tmp/oldboy.txt dest=/tmp"
file
补充: ansible学习帮助手册如何查看
ansible-doc -l --- 列出模块使用简介
ansible-doc -s fetch --- 指定一个模块详细说明
ansible-doc fetch --- 查询模块在剧本中应用方法
61.ansible模块:
1.command
1.命令类型模块:
掌握第一个模块: command (默认模块)
command – Executes a command on a remote node
在一个远程主机上执行一个命令
简单用法:
[root@m01 scripts]# ansible 172.16.1.31 -m command -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
2.参数:
1) chdir Change into this directory before running the command.
在执行命令之前对目录进行切换
ansible 172.16.1.31 -m command -a "chdir=/tmp touch oldboy.txt"
2) creates If it already exists, this step won't be run.
如果文件存在了,不执行命令操作
ansible 172.16.1.31 -m command -a "creates=/tmp/hosts chdir=/backup touch oldboy.txt"
3) removes If it already exists, this step will be run.
如果文件存在了, 这个步骤将执行
ansible 172.16.1.31 -m command -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
4) free_form(required)
The command module takes a free form command to run.
There is no parameter actually named 'free form'. See the examples!
使用command模块的时候,-a参数后面必须写上一个合法linux命令信息
注意事项:
有些符号信息无法识别: <", ">", "|", ";" and "&"
2.shell:
1.命令类型模块:
掌握第一个模块: command (默认模块)
command – Executes a command on a remote node
在一个远程主机上执行一个命令
简单用法:
[root@m01 scripts]# ansible 172.16.1.31 -m shell -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
2.参数:
1) chdir Change into this directory before running the command.
在执行命令之前对目录进行切换
ansible 172.16.1.31 -m shell -a "chdir=/tmp touch oldboy.txt"
2) creates If it already exists, this step won't be run.
如果文件存在了,不执行命令操作
ansible 172.16.1.31 -m shell -a "creates=/tmp/hosts chdir=/backup touch oldboy.txt"
3) removes If it already exists, this step will be run.
如果文件存在了, 这个步骤将执行
ansible 172.16.1.31 -m shell -a "removes=/tmp/hosts chdir=/tmp touch oldboy.txt"
4) free_form(required)
The command module takes a free form command to run.
There is no parameter actually named 'free form'. See the examples!
使用command模块的时候,-a参数后面必须写上一个合法linux命令信息
注意事项:
有些符号信息无法识别: <", ">", "|", ";" and "&"
实践应用: 利用shell执行脚本
第一个步骤: 编写一个脚本
第二个步骤: 将脚本发送到远程主机
第三个步骤: 将脚本权限进行修改(添加执行权限)
第四个步骤: 运行ansible命令执行脚本
3.script:
rpm -e htop -nodeps # 删除应用
scirpt 执行管控机文件
ansible web -m script -a "/root/m.sh" # 执行管控机文件
ansible web -a "ls /"
ansible web -m script -a "removes=/root/m.sh /root/m.sh" # 用来判断被管控机上是不是存在文件,如果存在就执行,不存在就跳过
ansible web -m script -a "creates=/root/m.sh /root/m.sh" # 用来判断被管控机上是不是存在文件,如果不存在就执行,存在就跳过(删除)
4.copy:
基本用法:
ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/etc/"
172.16.1.31 | CHANGED => { --- 对哪台主机进行操作
"changed": true, --- 是否对主机信息进行改变
"checksum": "6ed7f68a1d6b4b36c1418338b2001e421eeba270", --- 生成一个文件校验码==MD5数值
"dest": "/etc/hosts", --- 显示目标路径信息
"gid": 0, --- 显示复制后文件gid信息
"group": "root", --- 显示复制后文件属组信息
"md5sum": "7afd7b74854f0aaab646b3e932f427c0", --- 生成一个文件校验码==MD5数值
"mode": "0644", --- 显示复制后文件权限信息
"owner": "root", --- 显示复制后文件属主信息
"size": 401, --- 显示文件的大小信息
"src": "/root/.ansible/tmp/ansible-tmp-1557804498.23-26487341925325/source",
"state": "file", --- 显示文件的类型信息
"uid": 0 --- 显示复制后文件uid信息
}
补充说明: ansible软件输出颜色说明:
01. 绿色信息: 查看主机信息/对主机未做改动
02. 黄色信息: 对主机数据信息做了修改
03. 红色信息: 命令执行出错了
04. 粉色信息: 忠告信息
05. 蓝色信息: 显示ansible命令执行的过程???
扩展用法:
01. 在传输文件时修改文件的属主和属组信息
ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ owner=oldboy group=oldboy"
02. 在传输文件时修改文件的权限信息
ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ mode=1777"
03. 在传输数据文件信息时对远程主机源文件进行备份
ansible 172.16.1.31 -m copy -a "src=/etc/ansible/file/rsync/rsync.password dest=/etc/ backup=yes"
04. 创建一个文件并直接编辑文件的信息
ansible 172.16.1.31 -m copy -a "content='oldboy123' dest=/etc/rsync.password"
05.将管控机的文件复制到远程记得dest目录下
ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/backup/hosts remote_src=no"
06.将远程机的文件复制到远程机dest的目录下
ansible 172.16.1.31 -m copy -a "src=/etc/hosts dest=/backup/hosts remote_src=yes"
自行研究: remote_src directory_mode local_follow
If no, it will search for src at originating/master machine.
src参数指定文件信息,会在本地管理端服务进行查找
If yes it will go to the remote/target machine for the src. Default is no.
src参数指定文件信息,会从远程主机上进行查找
PS: ansible软件copy模块复制目录信息
ansible 172.16.1.31 -m copy -a "src=/oldboy dest=/oldboy"
src后面目录没有/: 将目录本身以及目录下面的内容都进行远程传输复制
ansible 172.16.1.31 -m copy -a "src=/oldboy/ dest=/oldboy"
src后面目录有/: 只将目录下面的内容都进行远程传输复制
5.file:
基本用法:
ansible 172.16.1.31 -m file -a "dest=/etc/hosts owner=oldboy group=oldboy mode=666"
扩展用法:
1. 可以利用模块创建数据信息 (文件 目录 链接文件)
state 参数
=absent --- 缺席/删除数据信息
=directory --- 创建一个目录信息
=file --- 检查创建的数据信息是否存在 绿色存在 红色不存在
=hard --- 创建一个硬链接文件
=link --- 创建一个软链接文件
=touch --- 创建一个文件信息
创建目录信息:
ansible 172.16.1.31 -m file -a "dest=/oldboy/ state=directory"
ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy01/oldboy02/ state=directory"
创建文件信息:
ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=touch"
创建链接文件信息:
ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_hard.txt state=hard"
ansible 172.16.1.31 -m file -a "src=/oldboy/oldboy.txt dest=/oldboy/oldboy_link.txt state=link"
2. 可以利用模块删除数据信息
ansible 172.16.1.31 -m file -a "dest=/oldboy/oldboy.txt state=absent"
ansible 172.16.1.31 -m file -a "dest=/oldboy/ state=absent"
ansible 172.16.1.31 -m file -a "dest=/backup/n1 owner=xiaoming mode=755 recurse=yes" # 递归改变
自行研究: recurse
6.fetch:
fetch (批量拉取数据) 管理端 <--- 多个被管理
dest 保存到当前主机路径
src 源文件路径
flat 是否使用管控机主机名创建目录,放入dest的保存目录默:no(使用) yes(不使用)
ansible 172.16.1.31 -m fetch -a "src=/tmp/oldboy.txt dest=/tmp"
7.yum:
ansible 172.16.1.31 -m yum -a "name=iotop state=installed"
name --- 指定安装软件名称
state --- 指定是否安装软件
installed --- 安装软件
present ---和installed类型
latest ---更新软件包
absent --- 卸载软件
removed --- 卸载软件
8.service:
ervice模块: 管理服务器的运行状态 停止 开启 重启
name: --- 指定管理的服务名称
state: --- 指定服务状态
started 启动
restarted 重启
stopped 停止
reloaded 重新加载
enabled --- 指定服务是否开机自启动
ansible 172.16.1.31 -m service -a "name=nfs state=started enabled=yes"
9.cron:
cron模块: 批量设置多个主机的定时任务信息
crontab -e
* * * * * 定时任务动作
分 时 日 月 周
minute: # Minute when the job should run ( 0-59, *, */2, etc )
设置分钟信息
hour: # Hour when the job should run ( 0-23, *, */2, etc )
设置小时信息
day: # Day of the month the job should run ( 1-31, *, */2, etc )
设置日期信息
month: # Month of the year the job should run ( 1-12, *, */2, etc )
设置月份信息
weekday: # Day of the week that the job should run ( 0-6 for Sunday-Saturday, *, etc )
设置周信息
name 设置定时任务名称
job 用于定义定时任务需要干的事情
disable=yes 注释定时任务
state=absent 删除定时任务
基本用法:
ansible 172.16.1.31 -m cron -a "minute=0 hour=2 data=* mouth=* weekday=* job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
扩展用法:
01. 给定时任务设置注释信息
ansible 172.16.1.31 -m cron -a "name='time sync' minute=0 hour=2 job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1'"
02. 如何删除指定定时任务
ansible 172.16.1.31 -m cron -a "name='time sync01' state=absent"
PS: ansible可以删除的定时任务,只能是ansible设置好的定时任务
03. 如何批量注释定时任务
ansible 172.16.1.31 -m cron -a "name='time sync' job='/usr/sbin/ntpdate ntp1.aliyun.com >/dev/null 2>&1' disabled=yes"
10.mount:
mount: 批量进行挂载操作
src: 需要挂载的存储设备或文件信息 # 需要挂载的目录,共享目录
path: 指定目标挂载点目录 # 指定挂载到本机那个目录
fstype: 指定挂载时的文件系统类型
state
present/mounted --- 进行挂载
present: 不会实现立即挂载,修改fstab文件,实现开机自动挂载
mounted: 会实现立即挂载, 并且会修改fstab文件,实现开机自动挂载 *****
absent/unmounted --- 进行卸载
absent: 会实现立即卸载, 并且会删除fstab文件信息,禁止开机自动挂载
unmounted: 会实现立即卸载, 但是不会会删除fstab文件信息 *****
11.user:
user模块: 实现批量创建用户
name 指定用户名称
uid 指定用户uid
group 指定用户组
groups 指定附加组
create_home 是否创建用户家目录(默认yes,可以改为no)
shell 指定用户使用shell
基本用法:
ansible 172.16.1.31 -m user -a "name=oldboy01"
扩展用法:
1) 指定用户uid信息
ansible 172.16.1.31 -m user -a "name=oldboy02 uid=6666"
2) 指定用户组信息
ansible 172.16.1.31 -m user -a "name=oldboy03 group=oldboy02"
ansible 172.16.1.31 -m user -a "name=oldboy04 groups=oldboy02"
3) 批量创建虚拟用户
ansible 172.16.1.31 -m user -a "name=rsync create_home=no shell=/sbin/nologin"
4) 给指定用户创建密码
PS: 利用ansible程序user模块设置用户密码信息,需要将密码明文信息转换为密文信息进行设置
生成密文密码信息方法:
方法一:
ansible all -i localhost, -m debug -a "msg={{ '密码信息123456' | password_hash('sha512', 'oldboy') }}"
[root@m01 tmp]# ansible all -i localhost, -m debug -a "msg={{ '123456' | password_hash('sha512', 'oldboy') }}"
localhost | SUCCESS => {
"msg": "$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1"
}
方法二:(忽略)
mkpasswd --method=sha-512
方法三:
yum install -y python-pip
pip install passlib
python -c "from passlib.hash import sha512_crypt; import getpass; print(sha512_crypt.using(rounds=5000).hash(getpass.getpass()))"
Password:
$6$rJJeiIerQ8p2eR82$uE2701X7vY44voF4j4tIQuUawmTNHEZhs26nKOL0z39LWyvIvZrHPM52Ivu9FgExlTFgz1VTOCSG7KhxJ9Tqk.
ansible 172.16.1.31 -m user -a 'name=oldboy08 password=$6$oldboy$MVd3DevkLcimrBLdMICrBY8HF82Wtau5cI8D2w4Zs6P1cCfMTcnnyAmmJc7mQaE9zuHxk8JFTRgYMGv9uKW7j1'
62.ansible剧本编写规范:
1. 剧本的编写方法
剧本的作用: 可以一键化完成多个任务
自动化部署rsync服务:
服务端的操作
第一个历程安装软件:
ansible 172.16.1.41 -m yum -a "name=rsync state=installed"
第二个历程编写文件:
ansible 172.16.1.41 -m copy -a "src=/xxx/rsyncd.conf dest=/etc/"
第三个历程创建用户
ansible 172.16.1.41 -m user -a "name=rsync create_home=no shell=/sbin/nologin"
第四个历程创建目录
ansible 172.16.1.41 -m file -a "dest=/backup state=directory owner=rsync group=rsync"
第五个历程创建密码文件
ansible 172.16.1.41 -m copy -a "content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600"
第六个历程启动服务
ansible 172.16.1.41 -m service -a "name=rsyncd state=started enabled=yes"
客户端的操作:
第一个历程: 创建密码文件
ansible 客户端地址 -m copy -a "content='rsync_backup:oldboy123' dest=/etc/rsync.password mode=600"
剧本的做成部分:
演员信息: 男一号 hosts
干的事情: 吻戏 tasks
演员信息: 男二号
干的事情: 看着
剧本编写规范: pyyaml -- 三点要求
1. 合理的信息缩进 两个空格表示一个缩进关系
标题一
标题二
标题三
PS: 在ansible中一定不能用tab进行缩进
2. 冒号的使用方法
hosts: 172.16.1.41
tasks:
yum: name=xx
PS: 使用冒号时后面要有空格信息
以冒号结尾,冒号信息出现在注释说明中,后面不需要加上空格
3. 短横线应用 -(列表功能)
- 张三
男
- 打游戏
- 运动
- 李四
女
学习
湖南
- 王五
男
运动
深圳
PS: 使用短横线构成列表信息,短横线后面需要有空格
开始编写剧本
mkdir /etc/ansible/ansible-playbook
vim rsync_server.ymal
说明: 剧本文件扩展名尽量写为yaml
1. 方便识别文件是一个剧本文件
2. 文件编写时会有颜色提示
- hosts: 172.16.1.41
tasks:
yum: name=rsync state=installed
copy: src=/tmp/rsyncd.conf dest=/etc/
如何执行剧本:
第一个步骤: 检查剧本的语法格式
ansible-playbook --syntax-check rsync_server.yaml
第二个步骤: 模拟执行剧本
ansible-playbook -C rsync_server.yaml
第三个步骤: 直接执行剧本
ansible-playbook rsync_server.yaml
- hosts: 172.16.1.41
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/tmp/rsyncd.conf dest=/etc/
63.playbook编写:
0.回顾
1) 将所有模块进行了讲解说明
command 模块: 在远程主机上执行命令操作 默认模块
shell 模块: 在远程主机上执行命令操作 万能模块
PS: 有时剧本不能反复执行!!!
script 模块: 批量执行本地脚本
copy 模块: 用于批量分发传输数据信息
fetch 模块: 用于将远程主机数据进行拉取到本地管理主机
file 模块: 修改数据属性信息/创建数据信息
yum 模块: 用于安装和卸载软件包
service 模块: 用于管理服务的运行状态
user 模块: 用于批量创建用户并设置密码信息
mount 模块: 用于批量挂载操作
cron 模块: 批量部署定时任务信息
ping 模块: 远程管理测试模块
2) ansible服务剧本功能
剧本的组成部分:
剧本的语法规范:
1) 空格规范: 实现缩进功能
2) 冒号规范: 实现键值定义
3) 横线规范: 实现列表显示
1.rsync服务部署
rsync 服务部署
nfs 服务部署
sersync 服务部署
全网备份项目
rsync服务剧本编写:
准备工作:
01. 熟悉软件部署流程
02. 熟悉ansible软件模块使用
03. 熟悉ansible剧本编写规范
ansible:
ad-hoc 临时实现批量管理功能(模块) --- 命令
playbook 永久实现批量管理功能(剧本) --- 脚本
剧本编写常见错误:
01. 剧本语法规范是否符合(空格 冒号 短横线)
02. 剧本中模块使用是否正确
03. 剧本中一个name标识下面只能写一个模块任务信息
04. 剧本中尽量不要大量使用shell模块
[root@m01 ansible-playbook]# cat rsync_server.yaml
- hosts: rsync_server
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
#shell: useradd rsync -M -s /sbin/nologin
- name: 04-create backup dir
file: path=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: content=rsync_backup:oldboy123 dest=/etc/rsync.password mode=600
- name: 06-start rsync server
service: name=rsyncd state=started enabled=yes
- hosts: rsync_clients
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: content=oldboy123 dest=/etc/rsync.password mode=600
- name: 03-create test file
file: dest=/tmp/test.txt state=touch
- name: 04-check test
shell: rsync -avz /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
2.nfs服务部署 # 在65playbook进阶中最好一个
第一个历程:创建目录
第二个历程:编写配置文件
第三个历程:执行yaml文件
3.sersync服务部署
全网备份项目
64.主机清单配置:
如何配置主机清单
第一种方式: 分组配置主机信息
[web]
172.16.1.7
172.16.1.8
172.16.1.9
[data]
172.16.1.31
172.16.1.41
操作过程
[root@m01 ansible-playbook]# ansible data -a "hostname"
172.16.1.31 | CHANGED | rc=0 >>
nfs01
172.16.1.41 | CHANGED | rc=0 >>
backup
[root@m01 ansible-playbook]# ansible web -a "hostname"
172.16.1.7 | CHANGED | rc=0 >>
web01
第二种方式: 主机名符号匹配配置
[web]
172.16.1.[7:9]
[web]
web[01:03]
第三种方式: 跟上非标准远程端口
[web]
web01:52113 # web01在/etc/hosts文件中配置的
172.16.1.7:52113
第四种方式: 主机使用特殊的变量
[web]
172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
[web]
web01 ansible_ssh_host=172.16.1.7 ansible_ssh_port=52113 ansible_ssh_user=root ansible_ssh_pass=123456
第五种方式: 主机组名嵌入配置
[rsync:children] --- 嵌入子组信息
rsync_server
rsync_client
[rsync_server]
172.16.1.41
[rsync_client]
172.16.1.31
172.16.1.7
[web:vars] --- 嵌入式变量信息
ansible_ssh_host=172.16.1.7
ansible_ssh_port=52113
ansible_ssh_user=root
ansible_ssh_pass=123456
[web]
web01
主机清单的配置方法:
https://docs.ansible.com/ansible/latest/user_guide/intro_inventory.html
ansible -i 指定主机清单(默认为/etc/ansible/hosts)
65.playbook进阶:
1. 编写剧本的重要功能介绍
a 在剧本中设置变量信息 OK
b 在剧本中设置注册信息 OK 执行剧本时,可以显示输出命令结果信息
b 在剧本中设置判断信息 OK
c 在剧本中设置循环信息
d 在剧本中设置错误忽略
d 在剧本中设置标签信息
e 在剧本中设置触发信息
f 在剧本中进行剧本整合
02. 在剧本中设置变量信息
方式一:直接在剧本文件编写
vars:
oldboy01: data01
oldboy02: data02
方式二:在命令行中进行指定
ansible-playbook -e passfile=rsync.password -e backupdir=data
方式三:在主机清单文件编写
[rsync_server]
[rsync_server:vars]
passfile=rsync.password
backupdir=data
三种变量设置方式都配置了,三种方式的优先级???
最优先: 命令行变量设置
次优先: 剧本中变量设置
最后: 主机清单变量设置
如何全局设置变量: roles 剧本整合
3. 在剧本中设置注册信息 # 显示执行命令之后的结果
- hosts: oldboy
tasks:
- name: check server port
shell: netstat -lntup --- 端口信息
register: get_server_port<--端口信息 # 将这个命令进行注册
- name: display port info # 注册之后就可以获取
d2ebug: msg={{ get_server_port.stdout_lines }}
显示进程信息,表示服务已经正常启动
PS: 设置变量不能有空格信息
4. 在剧本中设置判断信息
如何指定判断条件:
(ansible_hostname == "nfs01")
(ansible_hostname == "web01")
setup模块中显示被管理主机系统的详细信息
- hosts: oldboy
remote_user: root
tasks:
- name: Check File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == "nfs") or (ansible_hostname == "backup")
- name: install httpd
yum: name=httpd state=installed
when: (系统情况 == "CentOS")
- name: install httpd2
yum: name=httpd2 state=installed
when: (系统情况 == "ubuntu")
获取内置变量方法:
ansible rsync_server -m setup -a "filter=ansible_hostname"
常见主机信息:
ansible_all_ipv4_addresses: 仅显示ipv4的信息。
ansible_devices: 仅显示磁盘设备信息。
ansible_distribution: 显示是什么系统,例:centos,suse等。
ansible_distribution_major_version: 显示是系统主版本。
ansible_distribution_version: 仅显示系统版本。
ansible_machine: 显示系统类型,例:32位,还是64位。
ansible_eth0: 仅显示eth0的信息。
ansible_hostname: 仅显示主机名。
ansible_kernel: 仅显示内核版本。
ansible_lvm: 显示lvm相关信息。
ansible_memtotal_mb: 显示系统总内存。
ansible_memfree_mb: 显示可用系统内存。
ansible_memory_mb: 详细显示内存情况。
ansible_swaptotal_mb: 显示总的swap内存。
ansible_swapfree_mb: 显示swap内存的可用内存。
ansible_mounts: 显示系统磁盘挂载情况。
ansible_processor: 显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus: 显示cpu个数(只显示总的个数)。
获取子信息方法:
ansible_eth0[ipv4]
5. 在剧本中设置循环信息
vim test04.yml
- hosts: all
remote_user: root
tasks:
- name: 02-push conf file
copy: src=/etc/ansible/server_file/rsync_server/ dest={ item.desc } mode={ item.mode }
with_items:
- { src: "rsyncd.conf", desc: "/etc/",mode: "644" }
- { src: "rsync.password", desc: "/etc/", mode: "600" }
vim test05.yml
- hosts: all
remote_user: root
tasks:
- name: Installed Pkg
yum:
name={{ item }} state=present
with_items:
- wget
- tree
- lrzsz
或者是使用下面这种方式:
yum:
name: [ "wget", "tree", "lrzsz" ]
state: present
6. 在剧本中设置忽略错误
默认playbook会检查命令和模块的返回状态,如遇到错误就中断playbook的执行
可以加入ignore_errors: yes忽略错误
vim test06.yml
- hosts: all
remote_user: root
tasks:
- name: Ignore False
command: /bin/false
ignore_errors: yes
- name: touch new file
file: path=/tmp/oldboy_ignore state=touch
7. 在剧本中设置标签功能
- hosts: oldboy
ignore_errors: yes
remote_user: root
tasks:
- name: Check File
file: path=/tmp/this_is_{{ ansible_hostname }}_file state=touch
when: (ansible_hostname == "nfs01") or (ansible_hostname == "backup")
tags: t1
- name: bad thing
command: ech 123
#ignore_errors: yes
tags: t2
- name: install httpd
yum: name=httpd state=installed
when: (ansible_all_ipv4_addresses == ["172.16.1.7","10.0.0.7"])
tags: t3
- name: install httpd2
yum: name=httpd2 state=installed
when: (ansible_distribution == "ubuntu")
tags: t4
指定执行哪个标签任务: ansible-playbook --tags=t2 test05.yml # 在剧本中打标签不能使用纯数字
跳过指定标签任务: ansible-playbook --skip-tags=t2 test05.yml
8. 在剧本中设置触发功能
- hosts: backup
remote_user: root
tasks:
- name: 01 Install rsync
yum: name=rsync state=present
- name: 02 push config file
copy: src=./file/{{ item.src }} dest=/etc/{{ item.dest }} mode={{ item.mode }}
with_items:
- { src: "rsyncd.conf", dest: "rsyncd.conf", mode: "0644" }
- { src: "rsync.password", dest: "rsync.password", mode: "0600" }
notify: restart rsync server # 当有copy命令再次执行(使得配置文件发生改变),就发起通知
handlers:
- name: restart rsync server # name必须是notify中的内容
service: name=rsyncd state=restarted
9. 将多个剧本进行整合
方式一:include_tasks: f1.yml
- hosts: all
remote_user: root
tasks:
- include_tasks: f1.yml
- include_tasks: f2.yml
方式二:include: f1.yml
- include:f1.yml
- include:f2.yml
方式三:- import_playbook: # 推荐
[root@m01 ansible-playbook]# cat main.yml
- import_playbook: base.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
- import_playbook: oxxx.yml
- import_playbook: rsync.yml
- import_playbook: nfs.yml
10 编写NFS服务剧本
第一个历程: 创建几个目录
[root@m01 ansible-playbook]# tree nfs-file/
nfs-file/
├── nfs-client
└── nfs-server
第二个历程: 编写剧本信息
主机清单:
[nfs:children]
nfs_server
nfs_client
[nfs_server]
172.16.1.31
[nfs_client]
172.16.1.7
#172.16.1.8
#172.16.1.9
- hosts: nfs
tasks:
- name: 01-install nfs software
yum:
name: ['nfs-utils','rpcbind']
state: installed
- hosts: nfs_server
#vars:
# Data_dir: /data
tasks:
- name: 01-copy conf file
copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc
notify: restart nfs server
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
# path: ['data01','data02','data03']
# state: directory
# owner: nfsnobody
# group: nfsnobody
- name: 03-boot server
#service: name=rpcbind state=started enabled=yes
#service: name=nfs state=started enabled=yes
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
handlers:
- name: restart nfs server
service: name=nfs state=restarted
- hosts: nfs_client
#vars:
# Data_dir: /data
tasks:
- name: 01-mount
mount: src=172.16.1.31:{{ Data_dir }} path=/mnt fstype=nfs state=mounted
- name: 02-check mount info
shell: df -h|grep /data
register: mount_info
- name: display mount info
debug: msg={{ mount_info.stdout_lines }}
第三个历程: 进行剧本测试
66.playbook优化:
10. ansible程序roles --- 规范
剧本编写完问题:
1. 目录结构不够规范 OK
2. 编写好的任务如何重复调用
3. 服务端配置文件改动,客户端参数信息也自动变化
4. 汇总剧本中没有显示主机角色信息
5. 一个剧本内容信息过多,不容易进行阅读,如何进行拆分 OK
第一个历程: 规范目录结构
cd /etc/ansible/roles
mkdir {rsync,nfs} --- 创建相应角色目录
mkdir {nfs,rsync}/{vars,tasks,templates,handlers,files} --- 创建角色目录下面的子目录
[root@m01 roles]# tree
.
├── nfs
│ ├── files --- 保存需要分发文件目录
│ ├── handlers --- 保存触发器配置文件信息
│ ├── tasks --- 保存要执行的动作信息文件 ok
│ ├── templates --- 保存需要分发模板文件 模板文件中可以设置变量信息
│ └── vars --- 保存变量信息文件
└── rsync
├── files
├── handlers
├── tasks
├── templates
└── vars
第二个历程: 在roles目录中创建相关文件
编写文件流程图:
1) 编写tasks目录中的main.yml文件
- name: 01-copy conf file
copy: src=exports dest=/etc
notify: restart nfs server
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
# path: ['data01','data02','data03']
# state: directory
# owner: nfsnobody
# group: nfsnobody
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
# 将上面的任务拆分成多个yaml文件,通过main文件导入
vim main.yml
- include_tasks: copy_info.yml
- include_tasks: create_dir.yml
- include_tasks: boot_server.yml
vim copy_info.yml
- name: 01-copy conf file
copy: src=exports dest=/etc
notify: restart nfs server
vim create_dir.yml
- name: 02-create data dir
file: path={{ Data_dir }} state=directory owner=nfsnobody group=nfsnobody
vim boot_server.yml
- name: 03-boot server
service: name={{ item }} state=started enabled=yes
with_items:
- rpcbind
- nfs
2) 编写vars目录中的main.yml文件
[root@m01 vars]# vim main.yml
Data_dir: /data
3) 编写files目录中的文件
[root@m01 files]# ll
total 4
-rw-r--r-- 1 root root 29 May 17 15:23 exports
4) 编写handlers目录中的main.yml文件
vim main.yml
- name: restart nfs server
service: name=nfs state=restarted
目录中文件编写好汇总结构
[root@m01 nfs]# tree
.
├── files
│ └── exports
├── handlers
│ └── main.yml
├── tasks
│ └── main.yml
├── templates
└── vars
└── main.yml
第三个历程: 编写一个主剧本文件
[root@m01 roles]# cat site.yml
- hosts: nfs_server
roles:
- nfs-server
- hosts: rsync_server
roles:
- rsync
rsync:
- hosts: 172.16.1.41
tasks:
- name: 01-install rsync
yum: name=rsync state=installed
- name: 02-copy rsyncd.conf
copy: src=/etc/ansible/server_file/rsync_server/rsyncd.conf dest=/etc/
- name: 03-create user
user: name=rsync create_home=no shell=/sbin/nologin
- name: 04-create baskup dir
file: dest=/backup state=directory owner=rsync group=rsync
- name: 05-create password file
copy: dest=/etc/rsync.password content=rsync_backup:oldboy123 mode=600
- name: 06-start rsync server
service: name=rsyncd enabled=yes state=started
- hosts: 172.16.1.31,172.16.1.7
tasks:
- name: 01-yum rsync
yum: name=rsync state=installed
- name: 02-create password file
copy: dest=/etc/rsync.password content=oldboy123 mode=600
- name: 03-check test backup data
file: dest=/tmp/test.txt state=touch
- name: 04-check-test
shell: rsync -az /tmp/test.txt rsync_backup@172.16.1.41::backup --password-file=/etc/rsync.password
nfs:
- hosts: nfs
tasks:
- name: 01-install nfs software
yum: name={{ item }} state=installed
with_items:
- nfs-utils
- rpcbind
- hosts: nfs_server
vars:
data_dir: /data
tasks:
- name: 01-copy conf file
copy: src=/etc/ansible/ansible-playbook/nfs-file/nfs-server/exports dest=/etc/
notify: restart nfs server
- name: 02-create data dir
file: dest={{ data_dir }} state=directory owner=nfsnobody group=nfsnobody
- name: 03-boot server
service: name=rpcbind state=started enabled=yes
# service: name=nfs state=started enabled=yes
with_items:
- rpcbind
- nfs
handlers:
- name: restart nfs server
service: name=nfs state=restarted
- hosts: nfs_client
vars:
data_dir: /data
tasks:
- name: 01-mount
mount: src=172.16.1.31:{{ data_dir }} path=/mnt fstype=nfs state=mounted
- name: 02-check mount info
shell: df -h|grep /data
register: mount_info
- name: 03-display mount info
debug: msg={{ mount_info.stdout_lines }}
tags: t1
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ASP.NET Core 模型验证消息的本地化新姿势
· 开发的设计和重构,为开发效率服务
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· 从零开始开发一个 MCP Server!
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Ai满嘴顺口溜,想考研?浪费我几个小时