1 初识自动化运维及ansible架构
一、自动化运维的由来
Dev开发环境:开发人员在本地进行网站后台代码的编写,如果开发人员用到python解释器、mysql、nginx等,都得要在Dev开发服务器上去安装这些工具且调试完毕之后开发人员才能正确的编写代码进行开发。
QA测试环境:对应不同的环境,QA测试服务器,可能是内部工人进行测试。
UAT预生产环境:
Prod生产环境:正式生产环境的配置最高,前面的几个环境配置不可能该生产环境一样的配置,增加成本
一台服务器就要配置四个不同的环境,那一百台呢一万台呢?
早期人工运维:
运维人员早期需要维护数量众多的机器,因此需要执行反复,重复的劳动力,很多机器需要同时部署相同的服务或是执行相同的命令,还得反复的登录不同的机器,执行重复的动作。。
比如说你要在backup服务器配置rsync服务,进行数据同步的操作,那么客户端都得单独的安装一下rsync命令工具才能正确使用
你可能一台台机器去登录,安装rsync之后,再推出,登录下一个机器,可以使用xshell等工具,快捷的创建ssh登录,但是还是属于人工运维,效率比较低
自动化运维时代:
早期运维人员会结合ssh免密登录以及shell脚本来完成自动化的部署操作。系统管理员面临的问题主要是,配置管理系统,远程执行命令,批量安装服务,启停服务等等后来也就诞生了众多的开源软件。
自动化运维软件有: fabric、puppet、saltstack、chef、Ansible
其中有两款软件是基于python语言开发的, saltstack,ansible都是基于python编写
二、自动化运维趋势
人肉运维,人力运维>自动化运维>数据化运维,可视化运维>AI智能运维,devops
三、自动化运维的好处
提高工作效率,减少重复性的劳动力操作
大大的减少了人为出错的可能性
ansible支持数据化管理,数据化追源,找到问题的来源点
四、ansible架构
a. 介绍
ansible是一个同时管理多个远程主机的软件,必须是任意可以通过ssh登录的机器,因此ansible可以管理的机器如
●远程虚拟机
●物理机
●也可以直接管理本机机器
ansible通过shh协议实现了,管理节点(老板,安装了ansible服务的机器),被管理节点(员工,被管理的机器节点)的通信。
只要是通过ssh协议登录的主机,就可以完成ansible自动化部署操作
●批量文件分发
●批量数据复制
●批量数据修改,删除
●批量自动化安装软件服务
●批量服务启停
●脚本化,自动批量服务部署
b. ansible特点
ansible的编排引|擎可以出色的完成各种任务配置管理,ansible在流程控制, 资源部署等方便很强大,并且ansible无须安装客户端软件,
管理简洁,使用yaml配置文件语法,功能强大,便于维护。
ansible是基于python语言开发的,主要由python的两个ssh处理模块,paramiko,以及PyYAML模块
●安装部署简单
●管理主机便捷,支持多台主机并行管理
●无须安装被管理节点的客户端(no agent),且无须占用客户端的其他端口,仅仅使用ssh服务即可
●不仅仅支持python,还支持其他语言的二次开发
●不用root用户也可执行,降低系统权限
c.原理架构,工作流程
2 ansible实践部署及管理方式
一、准备好4个虚拟机
#修改主机名
sudo hostnamectl set-hostname new_hostname #new_hostname为新的主机名
sudo reboot #重启生效
准备好四个linux虚拟机,配置在同一个局域网内,然后设置好静态ip地址
Boos 192.168.1.108 管理机器(安装了ansible的服务端,公司的老板)
KL1 192.168.1.162 被管理机器(配置好ssh服务,以及关闭防火墙等等,公司员工1)
KL2 192.168.1.77 被管理机器(配置好ssh服务,以及关闭防火墙等等,公司员工2)
KL3 192.168.1.8 被管理机器(配置好ssh服务,以及关闭防火墙等等,公司员工3)
二、先准备ansible管理机器(老板)
1这里选择yum自动化安装,前提得配置好阿里云yum源,eple源。
yum install epel-release -y
yum install ansible libselinux-python -y
2检查ansible安装情况,查询配置文件和可执行命令等
rpm -ql ansible | grep -E "^/etc|^/user/bin" #"-E"表示支持扩展正则,后面的是两个筛选条件
3、检查ansible版本
ansible --version
三、再准备被管理机器(员工)
1、安装ansible所需的系统模块
yum install epel-release libselinux-python -y #安装ansible所需的系统模块
四、ansiblepe主机列表配置
批量管理主机的方式有两种:传统的输入ssh密码验证、密钥管理
1、备份好ansible的主机列表配置文件
cp /etc/ansible/hosts{,.ori} #","表示在最后一级目录的前一目录创建最后一级文件的.ori文件(备份文件)
cp /etc/ansible/hosts /etc/ansible/hosts.ori #详细的写法是这样
2、添加ansible需要管理的机器地址或主机名,添加如下信息
打开hosts文件后编辑
vim /etc/ansible/hosts
[KLZ1] #主机列表名/组名
192.168.1.162 #被管理主机ip
192.168.1.77
192.168.1.8
tail -3 /etc/ansible/hosts
五、ssh密码认证方式管理机器
ansible是直接利用linux本地的ssh服务,以及一些远程的ssh操作, 一般情况下客户端的ssh服务默认都是开启的,无须额外管理。
1、在Boss机器上,告诉其他被管理的机器,你要执行什么命令,以及用什么用户去执行。(通过这一步也能登录到ansible)
ansible KLZ1 -m command -a "hostname" -k -u root #让三个"员工"主机以root用户在指定的command模块去执行hostname命令
# "KLZ1"主机列表,hostname命令
# -m(module name)指定功能模块,默认就是command模块
# -a(module args)指定执行模块使用的参数,告诉模块需要执行的参数
# -k(ask-pass)询问密码验证
# -u(remote user)指定以哪个用户去运行
2、登录被管理机器免指纹密码验证
如上操作一般会有错误提示,这个报错要求我们把主机列表KLZ1里面定义的IP地址写进本地的known_hosts文件里。但是只需要在boss系统里手动ssh对被控主机进行一次连接,即可使用ansible命令操作了。连接后输入exit即可退回到Boss主机。
ssh root@192.168.1.162
ssh root@192.168.1.77
ssh root@192.168.1.8
3、再次通过ansible执行我们想要执行的命令:
ansible KLZ1 -m command -a "cd /" -k -u root
ansible KLZ1 -m command -a "ip addr" -k -u root #"-a"后面接指定的命令
六、配置免密登录(不安全)
每次执行ansible命令的时候,都需要输入ssh的认证密码,也就是root的密码, 如果不同的主机密码不一致,那你还得输入多次才行,因此我们可以配置如下的快捷登录方式
1、让ansible自带密码认证参数:
可以在 /etc/ansible/hosts 文件中,定义好密码即可,即可实现快速的认证,远程管理主机
#参数
ansible_host #主机地址
ansible_port #端口,默认是22端口
ansible_user #认证的用户
ansible_ssh_pass #用户认证的密码
使用hosts文件的参数形式,来实现ssh认证
修改hosts文件,改为如下:
2.此时可以不需要输入密码,即可自动ssh验证通过了,既然密码和用户都定好了,注意ansible命令也会有相应的变化:不再是 ansible KLZ1 -m command -a "hostname" -k -u root 而是:
ansible chaoge -m command -a "hostname"
七、ssh密钥方式批量管理主机(相对安全)
这个方式比起hosts文件的密码参数来的更安全放心
1、在boss机器上创建密钥对
一般想要查看得到密钥文件,建议采用ssh-keygen -t rsa这个创建命令。
ssh-keygen -t rsa
下面的这个命令似乎更安全,不过在下一步检查的时候就看不到公私钥文件。
ssh-keygen -f ~/.ssh/id_rsa -p "" > /dev/null 2>&1
# ssh-keygen,密钥生成的命令
# -f,指定把私钥文件写到后面用户家目录下的id_rsa里
# -p,后面给它指定一个空字符串,表示把空的密码写入到私钥文件当中
# > /dev/null,把默认输出的信息放到/dev/null里面让这些信息不显示
# 2>&1,把标准的输出以及错误信息都给它重定向到黑洞文件&1里边,无论这条命令执行正确与否都不要产生一些信息
所以两条命令的话可以配合起来使用,先执行第一条再执行第二条。
2、检查公私钥文件
注意:ls -a 能查看所有文件,包括隐藏起来的文件,并且想要在~/.ssh/下看到id_rsa就不能把> /dev/null 2>&1放在创建密钥的命令里执行。
cd ~/.ssh/ #~代表当前用户的主目录即根目录下的“root”账户的名为root的文件夹目录
3、编写公钥分发脚本
创建一个文件来放脚本文件
mkdir /mysh
cd /mysh
touch ssh_key_send.sh
vim ssh_key_send.sh
编辑公钥分发脚本
rm -rf ~/.ssh/id_rsa* #清空用户主目录下ssh里跟公私钥对有关的文件都删了
ssh-keygen -f ~/.ssh/id_rsa -P "" > /dev/null 2>&1 #创建一个新的公私钥对,-f指定一个私钥文件,-p指定输入的私钥密码为空(省略在执行这条生成公私钥对时输入密码的操作,即表示不给私钥设置密码)
SSH_Pass=zgy #
Key_Path=~/.ssh/id_rsa.pub
for ip in 162 77 8 #for循环,in后面接的是目标主机的主机位(你要批量分发的机器ip地址的主机位)
do
sshpass -p$SSH_Pass ssh-copy-id -i $Key_Path "-o StrictHostKeyChecking=no" 192.168.1.$ip #ssh-copy-id -i $Key_Path指定公钥文件; -o StrictHostKeyChecking=no,我们在首次进行ssh连接时会提示指纹信息确认,通过这个功能参数跳过确认过程;192.168.1.$ip,192.168.1.0子网网段,$ip为for循环的ip地址主机位
done
运行脚本
sh ssh_key_send.sh
测试是否还需要输入密码,如果不再弹出输入密码则成功
ssh -o "StrictHostKeyChecking=no" 192.168.1.162
此时在Boss机器上再连接客户端机器,就无须输入账号密码了,可以尝试使用ansible命令进行连接,例:
ansible KLZ1 -m command -a "ifconfig"
此时已经无须输入密码,即可远程管理
总结
在生产环境中,ansible的连接方式,二选一即可, 最好的是配置ssh公私钥免密登录
如果生产环境的要求更高,可以用普通用户去执行,再提权操作,sudo
2023/9/4
ansible实现批量化主机管理的模式,主要有两种
●利用ansible的纯命令行实现的批量管理,ad-hoc模式----好比简单的shell命令管理
●利用ansible的playbook剧本来实现批量管理,playbook剧本模式-----好比复杂的shelI脚本管理
ad-hoc模式
ansible的ad-hoc模式是ansible的命令行形式,也就是处理一些临时的,简单的任务,可以直接使用ansible的命令行来操作,比如
●临时批量查看被管理机器的内存情况,cpu负载情况,网络情况
●比如临时的分发配置文件等等
playbook模式
ansible的playbook模式是针对比较具体,且比较大的任务,那么你就得事先写好剧本。应用场景:
●一键部署rsync备份服务器
●一键部署Inmp环境
3 ansible实践之模式与命令
一、ad-hoc模式命令
ansible KLZ1 -m command -a "hostname"
# Ansible --- 自带提供的命令操作
# KLZ1-----/etc/ansible/hosts文件中定义的主机组,还可以写主机ip地址,以及通配符*
# -m command ansible的指定模块的参数,以及指定了command模块
# -a 指定给command模块什么参数即让它做什么事,比如hostname, "uname -r"(显示内核版本信息)
二、ansible-doc模块命令使用方法
1、列出所有的ansible支持的模块命令
ansible-doc -l #列出所有的ansible支持的模块
ansible-doc -l | grep command #列出所有的ansible支持的模块并过滤与command相关的
ansible-doc -l | grep ^command #过滤出以command开头的行
2、查看某个模块的具体用法参数
ansible-doc -s command #查看command模块的具体用法
ansible两大核心:ansible各种模块的用法和ansible剧本的编写
三、command模块
1、command模块参数查看
ansible-doc -s command #查看command模块的具体用法
作用:在远程节点上执行一-个命令
ansible-doc -S command 查看该模块支持的参数如下:
chdir 在执行命令之前,先通过cd进入该参数指定的目录
creates 在创建一个文件之前,判断该文件是否存在,如果存在了则跳过前面的东西,如果不存在则执行前面的动作
removes 定义一个文件是否存在,如果存在了则执行前面的动作,如果不存在则跳过动作
free_ form 该参数可以输入任何的系统命令,实现远程执行和管理
command 模块是ansible的默认基本模块,也可以省略不写,但是要注意如下的坑
●使用command模块,不得出现shell变量$name,也不得出现特殊符号> < | ; & 这些符号command模块都不认识,如果你想用前面指定的变量,特殊符号,请使用shell模块,command模块就不适合你了
2、command模块案例:
a.获取所有目标机器的负载信息
ansible KLZ1 -m command -a "uptime" #KLZ1主机列表可以改为IP地址或通配符*(所有ip),-m command可以省略不写
b.让客户端机器,先切换到/tmp目录下,然后打印当前的工作目录
ansible KLZ1 -m command -a "pwd chdir=/tmp/"
c.练习creates参数
该参数作用是判断该文件是否存在,存在则跳过,不存在则执行
ansible 192.168.1.8 -m command -a "pwd creates=/data" #
d.参数removes实践,
该参数作用是判断该文件是否存在存在则执行,不存在则跳过。它可以避免在执行没有的文件时提示错误
ansible KLZ1 -m command -a "ls /data removes=/不存在的文件"
e.warn参数,是否提供告警信息
ansible KLZ1 -a "chmod 777 /data warn=False"
四、shell模块
1、shell模块参数查看
作用:在远程机器上执行命令(复杂的命令),了解模块用法的渠道
●执行ansible命令查看
ansible-doc -s shell
●ansible官网查看帮助信息https://docs.ansible.com/ansible/latest/modules/shell_module.html
shell模块支持的参数和解释:
chdir 在执行命令之前,通过cd进入该参数指定的目录
creates 定义一个文件是否存在,如果存在则不执行该命令,如果存在该文件,则执行shell命令
free_ form 参数信息中可以输入任何的系统指令,实现远程管理
removes 定义一个文件是否存在,如果存在该文件,则执行命令,如果不存在,则跳过
2、shell模块案例
a.批量查询进程信息
vim jjj.txt & # &保持后台运行
ansible KLZ1 -m shell -a "ps -ef | grep vim | grep -v grep" #"-v grep"表示二次过滤把和grep相关的给过滤掉(上面显示有两个vim相关的进程,所以为了更精确需要进一步用管道符进行二次过滤)
b.批量创建并编写文本
ansible KLZ1 -m shell -a "echo 你好世界 > /tmp/heihei.txt"
cat /tmp/heihei.txt #在目标主机上执行,查看文件内容
c.批量远程执行脚本
该需要执行的脚本,必须要求在目标主机机器上存在,否则会报错文件不存在,这是shell模块的特点,是因为还有一个专门执行脚本的script模块
注意的是这个脚本必须在客户端机器上存在才行
1.创建文件夹
2.创建sh脚本文件,还要写入脚本内容
3.赋予脚本可执行权限
4.执行脚本
5.忽略warning信息(赋予可执行权限时会有告警信息)
思路分析:最好所有的操作都是在管理机器上,也就是(老板)这台机器Boss上进行远程的批量化操作
ansible KLZ1 -m shell -a "mkdir -p /mysh/;echo "hostname" > /mysh/hostname.sh;chmod +x /mysh/hostname.sh;bash /mysh/hostname.sh warn=False"
# ;表示通过分号对多条shell进行分割
# mkdir命令不写也能执行成功,后面的echo包含创建和编辑以及打印输出。但是在script模块没有mkir命令则不行,为了防止出错最好都写上。
# chamod +x,+x表示对所有对象(用户,用户所属的组,其他)都赋予可执行权限
# bash,用bash解释器去执行脚本文件,执行结果就是输出主机名
五、script模块
功能:把管理机器Boss上的脚本远程的传输到被管理节点上去执行
比起shell模块,script模块功能更强大, 在管理机器本地有一份脚本,就可以在所有被管理节点上去运行
1、script的模块参数
ansible-doc -s script #查看script模块的具体用法
chdir 在执行命令之前,先通过cd进入该参数指定的目录
creates 在创建一个文件之前,判断该文件是否存在,如果存在了则跳过前面的东西,如果不存在则执行前面的动作
removes 定义一个文件是否存在,如果存在了则执行前面的动作,如果不存在则跳过动作
2、script模块案例
script模块远程执行脚本
a.在管理机器上创建一个脚本
mkdir -p /myscripts #创建一个文件夹
echo -e "pwd\nhostname" > /myscripts/mysh.sh #实现两个功能。-e使echo命令将\n转换为一个换行符,重定向符号 > 将输出文本定向到目标文件 /myscripts/mysh.sh中,覆盖原有内容(如果有的话)。
cat /myscripts/mysh.sh #查看创建好的脚本内容是否正确
chmod +x /myscripts/mysh.sh #授权
b.远程的批量执行脚本,且在客户端上不需要存在该脚本
ansible KLZ1 -m script -a "/myscripts/mysh.sh"
#这里不用bash解释器,这是script模块,只需要把文件名传给它就可以了
利用script模块可以批量让所有被管理的机器执行脚本,且该脚本不需要在客户端上存在