Ansible概述
由于互联网的快速发展导致产品更新换代速度逐渐加快,运维人员每天都要进行大量的维护操作,仍旧按照传统方式进行推护会使得工作效率低下。这时,部署自动化运维就可以尽可能安全、高效地完成这些工作。
一般会把自动化运维工具划分为两类:
一类是需要使用代理工具的,也就是基于专用的Agent程序来完成管理功能,如:Puppet、Func、Zabbix等;另处一类是不需要配置代理工其的,可以直接基于SSH服务来完成管理功能,如Ansible、Fabric等。下面介绍几款功能类似的自动化运维工具。
- Puppet:Puppet基于Ruby开发,支持Linux、UNIX、Windows平台,可以针对用户、系统服务、配置文件、软件包等进行管理,有很强的扩展性,但远程执行命令相对较弱。
- SaltStack:Salsaskk基于Python开发,允许管理员对多个操作系统创建统一的管理系统, 比Puppet更轻量级。
- Ansible:Ansible基于Python开发,集合了众多优秀运维工具的优点,实现了批量运行命令,部署程序、配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷。
Ansible核心组件
Ansible基本架构由六个部分构成:
- Ansible核心引擎
- Host inventory主机清单:用来定义Ansible所管理的主机,默认是在Ansible的hosts配置文件中定义被管理主机,同时也支持自定义动态主机清单和指定其他配置文件的位置。
- Connection plugins连接插件:负责和被管理主机实现通信。除支持使用SSH连接被管理主机外,Ansible 还支持其他的连接方式,
所以需要有连接插件将各个主机用连接插件连接到Ansible, - Playbooks (yaml, jinja2)剧本:用来集中定义Ansible任务的配置文件,即将多个任务定义在一个剧本中由Ansible自动执行,可以由控制主机针对多台被管理主机同时运行多个任务。
- Core modules核心模块:是Ansible自带的模块,使用这些模块将资源分发到被管理主机,使其执行特定任务或匹配特定的状态。
- Custom modules自定义模块:用于完成模块功能的补充,可借助相关插件完成记录日志、发送邮件等功能。
安装部署Ansible服务
案例环境
管理端:192.168.10.157
被管理端:192.168.10.179 组名:xxy1
1、安装Ansible
#使用源码进行安装
yum install -y epel-release //安装epel源
yum install ansible -y //安装Ansible
ansible --version //查看ansible版本
2、树状结构查看Ansible相关配置文件
yum install tree -y
tree /etc/ansible/ //树状结构展示文件夹
/etc/ansible/
├── ansible.cfg //ansible的配置文件
├── hosts //ansible的主仓库,用于存储需要管理的远程主机的相关信息
└── roles //角色
3、配置主机清单
Ansible通过读取默认主机清单/etc/ansible/hosts文件,自改主机与组配置后,可以同时连接到多个被管理主机上执行任务
cd /etc/ansible
vi hosts //配置主机清单
[xxy1]
192.168.10.179
4、设置SSH无密码登录
为了避免Ansible下发指令时输入被管理主机的密码,可以通过证书签名达到SSH无密码登录的效果,使用ssh-keygen产生一对密钥,使用ssh-copy-id来下发生成公钥。
ssh-keygen -t rsa //基于SSH密钥的连接
ssh-copy-id [email protected] //下发公钥
#免密码的交互
ssh-agent bash
ssh-add
Ansible命令应用基础
1、Ansible命令格式
ansible [主机] [-m 模块] [-a 模块持有参数]
ansible-doc -l //列出所有已安装的模块 注:按q退出
ansible-doc -s yum //-s列出yum模块描述信息和操作动作
ansible all -a 'ls /' //查看被控制端根目录下所有内容
2、command模块
使用-m选项来指定使用模块,默认使用command模块
ansible 192.168.10.179 -m command -a 'date' //指定ip执行date命令
ansible xxy1 -m command -a 'date' //指定分类执行date
ansible all -m command -a 'date' //所有被控制端主机执行date命令
3、cron模块
cron模块用于定义任务计划。其中有两种状态(state):present表示添加(可以省略),absent表示移除。
ansible xxy1 -m cron -a 'minute="*/1" job="/bin/echo heihei" name="test cron job"' //xxy1下的主机添加计划任务:每分钟输出一次“heihei”
ansible xxy1 -a 'crontab -l' //查看xxy1下的主机的计划任务
ansible xxy1 -m cron -a 'name="test cron job" state=absent' //移除计划任务,假如该计划任务没有取名字,name=None即可
4、user模块
用于创建新用户和更改、删除已存在的用户。user模块请求的是useradd, userdel, usermod三个指令
ansible xxy1 -m user -a 'name="test01"' //xxy1下的主机创建用户test01
ansible xxy1 -m user -a 'name="test01" state=absent' //xxy1下的主机删除用户test01
5、group模块
用于对用户组进行管理,group模块请求的是groupadd, groupdel, groupmod 三个指令。
ansible xxy1 -m group -a 'name=xxy gid=306 system=yes' //xxy1下的主机创建xxy组,指定gid,属于系统组
ansible xxy1 -m user -a 'name=xxy01 uid=306 system=yes group=xxy' //xxy1下的主机创建xxy01永不,指定uid,加入xxy组,属于系统用户
ansible xxy1 -a 'id xxy01' //xxy1下的主机查看xxy01用户信息
6、copy模块
用于实现文件复制和批量下发文件,src定义本地源文件路径,dest定义被管理主机文件路径,使用content通过指定信息内容来生成目标文件
ansible xxy1 -m copy -a 'src=/etc/fstab dest=/opt/fstab.back owner=root mode=640' //xxy1下的主机将/etc/fatab文件复制到/opt目录下命名为fatab.back,并设置所有者为root,权限为640
ansible xxy1 -a 'ls -l /opt' //xxy1下的主机查看/opt目录下的信息
ansible xxy1 -a 'cat /opt/fstab.back' //xxy1下的主机查看/opt/fstab.back文件内容
ansible xxy1 -m copy -a 'content="hello heihei!" dest=/opt/fstab.back'
//xxy1下的主机将hello heihei!写入/opt/fstab.back文件中
ansible xxy1 -a 'cat /opt/fstab.back' //xxy1下的主机查看/opt/fatab.back文件内容
7、file模块
设置文件属性,使用path指定文件路径,使用src定义源文件路径,使用name或dest来替换创建文件的符号链接
ansible xxy1 -m user -a 'name=lisi system=yes' //xxy1下的主机创建lisi用户
ansible xxy1 -m group -a 'name=lisizu system=yes' //xxy1下的主机创建lisizu组
ansible xxy1 -m file -a 'owner=lisi group=lisizu mode=644 path=/opt/fstab.back' //xxy1下的主机将/opt/fstab.back文件所有者改为lisi,属于lisizu,644权限
ansible xxy1 -m file -a 'path=/opt/fstab.link src=/opt/fstab.back state=link' //xxy1下的主机给/opt/fstab.back文件创建链接文件/opt/fstab.link
ansible xxy1 -m file -a "path=/opt/fstab.back state=absent" //xxy1下的主机删除/opt/fstab.back文件
ansible xxy1 -m file -a "path=/opt/test state=touch" //xxy1下的主机在/opt目录下创建test文件
8、ping模块
使用ping模块检测所有被控制端主机的连通性
ansible all -m ping //使用ping模块检测所有被控制端主机的连通性
9、shell模块
可以在被管理主机上运行命令,并支持像管道符等功能的复杂命令
ansible xxy1 -m user -a 'name="zhangsan"' //xxy1下的主机创建用户zhangsan
ansible xxy1 -m shell -a 'echo abc123|passwd --stdin zhangsan' //xxy1下的主机使用无交互模式给zhangsan用户设置密码
10、script模块
可以将本地脚本复制到被管理主机上进行运行,需使用相对路径指定脚本
#在本地编辑一个简单的脚本
vi test.sh
#!/bin/bash
echo "hello ansible from script"> /opt/script.txt
#给脚本可执行文件
chmod +x test.sh
ansible xxy1 -m script -a 'test.sh' //将本地脚本复制到xxy1下的主机上运行
#到192.168.10.179上查看,可查看到脚本已经执行,并文件下有内容
cat /opt/script.txt
11、yum与service模块
yum模块负责在被管理主机上安装与卸载软件包,但是需要提前在每个节点配置自己的YUM仓库。使用name指定要安装的软件包,不带软件包版本号则安装最新软件包,使用state指定安装包状态,present、latest用来表示安装,absent表示卸载
service模块控制管理服务的运行状态。使用enabled表示是否开机自启动,取值为true或者false;使用name定义服务名称;使用state指定服务状态,取值分别为started、stoped、restarted。
ansible xxy1 -m yum -a 'name=httpd' //xxy1下的主机安装httpd服务
ansible xxy1 -a 'systemctl status httpd' //xxy1下的主机查看httpd服务运行状态
ansible xxy1 -m service -a 'enabled=true name=httpd state=started' //开启xxy1下的主机的httpd服务
ansible xxy1 -a 'systemctl status httpd' //xxy1下的主机查看httpd服务运行状态,已开启
ansible xxy1 -m yum -a 'name=httpd state=absent' //xxy1下的主机卸载httpd服务
12、setup模块
使用setup模块收集、查看被管理主机的facts(facts是ansible采集被管理主机设备的一个功能)。每个被管理主机在接收并运行管理命令前,都会将自己的相关信息(操作系统版本、IP地址等)发送给控制主机。
ansible xxy1 -m setup //获取xxy1下的主机的facts信息