ansible - 自动化运维工具
一、ansible 概述
1、Ansible可以同时管理Redhat系的Linux,Debian系的Linux,以及Windows主机。管理节点只在执行脚本时与远程主机连接,没有特别的同步机制,所以断电等异常一般不会影响ansbile。
2、ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、cfengine、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。ansible是基于模块工作的,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。主要包括:
(1)、连接插件connection plugins:负责和被监控端实现通信;
(2)、host inventory:指定操作的主机,是一个配置文件里面定义监控的主机;
(3)、各种模块核心模块、command模块、自定义模块;
(4)、借助于插件完成记录日志邮件等功能;
(5)、playbook:剧本执行多个任务时,非必需可以让节点一次性运行多个任务。
3、ansible的架构:连接其他主机默认使用ssh协议。
二、 安装ansible
环境部署
主机名 | IP地址 | 软件服务 |
---|---|---|
ansible | 192.168.28.10 | ansible |
webserver | 192.168.28.20 | —— |
msyql | 192.168.28.40 | —— |
----关闭防火墙及安全机制----
[root@ansible ~]# systemctl stop firewalld && systemctl disable firewalld
[root@ansible ~]# setenforce 0
----配置在线YUM源----
[root@ansible ~]# mkdir -p /etc/yum.repos.d
[root@ansible ~]# mv -f /etc/yum.repos.d/* /etc/yum.repos.d/repos-0.bak
[root@ansible ~]# wget -O /etc/yum.repos.d/CentOS-Base.repo https://mirrors.aliyun.com/repo/Centos-7.repo
[root@ansible ~]# yum clean all && yum makecache fast
----安装epel源及ansible----
[root@ansible ~]# yum install -y epel-release
//epel:能为linux提供高质量软件包,相当于一个第三方源
[root@ansible ~]# yum install -y ansible
----查看ansible版本及结构----
[root@ansible ~]# ansible --version
三、ansible 配置主机清单及密钥对验证
[root@ansible ~]# yum install -y tree
//安装树形查看工具
[root@ansible ~]# tree /etc/ansible/
/etc/ansible/
├── ansible.cfg //配置文件
├── hosts //主机清单(管理)
└── roles
----配置主机清单----
[root@ansible ~]# vim /etc/ansible/hosts
//插入下面的内容,上面有模板,指向另外两台主机
[webserver]
192.168.28.20
[mysql]
192.168.28.40
----配置密钥对验证----
[root@ansible ~]# ssh-keygen -t rsa
[root@ansible ~]# ls -a //查看隐藏文件
. .bash_profile .esd_auth .tcshrc 图片
.. .bashrc .ICEauthority .viminfo 文档
anaconda-ks.cfg .cache initial-setup-ks.cfg .Xauthority 下载
.ansible .config .local 公共 音乐
.bash_history .cshrc .pki 模板 桌面
.bash_logout .dbus .ssh 视频
[root@ansible ~]# cd .ssh/
[root@ansible .ssh]# ls
id_rsa id_rsa.pub //生成的公钥和私钥文件
[root@ansible .ssh]# ssh-copy-id root@192.168.28.40
//将公钥推给被管理端
[root@ansible .ssh]# ssh-copy-id root@192.168.28.20
//切换至webserver端(192.168.28.20)
[root@webserver ~]# cd .ssh/
[root@webserver .ssh]# ls
authorized_keys
四、ansible 命令格式及基本用法
----命令格式----
ansible [主机] [-m 模块] [-a args]
ansible-doc -l //列出所有已安装的模块(按q退出)
ansible-doc -s yum //-s列出yum模块描述信息和操作动作
----基本用法----
[root@ansible .ssh]# ansible webserver -m command -a 'date' //指定主机执行date命令
[root@ansible .ssh]# ansible mysql -m command -a 'date'
//每次执行该命令都要输入密钥密码,比较麻烦,我们可以通过免交互代理来避免
[root@ansible .ssh]# ssh-agent bash
//再次尝试执行命令试试,这里除了别名也可以填IP地址,现在可以免交互执行命令了
[root@ansible .ssh]# ansible 192.168.28.20 -m command -a 'date'
五、ansible 常用模块管理
1、command默认模块
适合使用简单的命令,无法支持"<",">","|",";","&"等符号
命令格式:
ansible [主机] [-m 模块] [-a args]
ansible-doc -l //列出所有已安装的模块(按q退出)
ansible-doc -s yum //-s列出yum模块描述信息和操作动作(按q退出)
[root@ansible ~]# ansible 192.168.28.20 -m command -a 'date' //指定ip执行date命令
[root@ansible ~]# ansible webserver -m command -a 'date' //主机名与ip地址同理
[root@ansible ~]# ansible mysql -m command -a 'date'
[root@ansible ~]# ansible all -m command -a 'date' //所有hosts主机执行date命令
[root@ansible ~]# ansible all -a 'ls /' //若不加-m模块,则默认运行command模
2、cron定时任务模块
有两种状态(state):present表示添加(默认状态),absent表示移除
ansible-doc -s cron //-s查看cron模块信息
[root@mysqlr .ssh]# which echo //在PATH变量指定的路径中搜索echo命令的位置
/usr/bin/echo
[root@ansible ~]# ansible mysql -m cron -a 'minute="*/1" job="/usr/bin/echo hello" name="mxx cron job"' #每分钟执行一次
//指定webserver主机,-m不可省略,否则默认执行command模块
//-a指定参数,每分钟执行(间隔频率);执行操作;指定计划性任务名称
//这里注意格式,单引号与双引号的使用
[root@ansible ~]# ansible mysql -a 'crontab -l' '//执行命令查看以下有无该计划性任务'
192.168.28.20 | CHANGED | rc=0 >>
#Ansible: mxx cron job
*/1 * * * * /usr/bin/echo hello
[root@mysql .ssh]# crontab -l //切换至192.168.28.20主机查看
#Ansible: mxx cron job
*/1 * * * * /usr/bin/echo hello
您在 /var/spool/mail/root 中有新邮件
[root@mysql .ssh]# cat /var/spool/mail/root //信息写在该邮件内,可以去查看以下,一分钟执行一次该命令
[root@ansible ~]# ansible mysql -m cron -a 'name="mxx cron job" state=absent'
//移除计划性任务
//再切换至mysql查看,原先的计划性任务没了
[root@mysql .ssh]# crontab -l
3、user用户模块
'该模块请求的是useradd,userdel,usermod三个指令'
'即创建/删除用户,设定用户所属组'
ansible-doc -s user
//-s查看user模块信息
[root@ansible ~]# ansible mysql -m user -a 'name="test01"'
//在mysql主机中创建用户test01
[root@ansible ~]# ansible mysql -m command -a 'tail /etc/passwd'
//查看用户信息
[root@ansible ~]# ansible mysql -m user -a 'name="test01" state=absent'
//删除该用户;absent使用频率较高
[root@ansible ~]# ansible mysql -m command -a 'tail /etc/passwd'
//检查,是否还在
4、group用户(组)模块
'该模块请求的是groupadd,groupdel,groupmod这三个指令(组)'
ansible-doc -s group
[root@ansible ~]# ansible mysql -m group -a 'name=mysql gid=306 system=yes'
//在mysql主机上创建组,组名为mysql;gid号为306(不指定也行,会自动生成);指定system
[root@ansible ~]# ansible mysql -a 'tail /etc/group'
[root@ansible ~]# ansible mysql -m user -a 'name=test02 uid=306 system=yes group=mysql'
//创建用户,添加至mysql组,指定系统用户
[root@ansible ~]# ansible mysql -a 'id test02'
//注意一点,检查基本都是用-a,即command命令来检查的
5、copy模块
主要用于将管理主机上的数据信息传送给多台主机
ansible-doc -s copy
[root@ansible ~]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.bak owner=root mode=644'
//src表示原文件; dest表示目标;即从哪复制到哪
//owner表示属主(所有者),mode表示权限
[root@ansible ~]# ansible mysql -a 'ls -l /opt'
[root@ansible ~]# ansible mysql -a 'cat /opt/fstab.bak'
//查看复制文件的内容
[root@ansible ~]# ansible mysql -m copy -a 'content="hello world~" dest=/opt/fstab.bak'
//指定内容为hello world,重定向至该目录下(生成一个全新的文件)
[root@ansible ~]# ansible mysql -a 'cat /opt/fstab.bak'
//再次查看
//以上用法能够使用copy指定内容生成一个新文件
6、file模块
实现创建/删除文件信息 对数据权限进行修改
例:
ansible-doc -s file
//可切至mysql主机查看下
[root@mysql opt]# ls -l //这是执行file模块之前的参数
总用量 4
-rw-r--r-- 1 root root 12 4月 2 12:15 fstab.bak
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
//在ansible主机上操作
[root@ansible ~]# ansible mysql -m file -a 'path=/opt/fstab.bak owner=test02 group=mysql mode=666'
//path指定路径;指定属主test02(需已存在);group指定mysql组;权限修改为666
//前后对比
[root@mysql opt]# ls -l //执行file模块成功,提权,且修改了属组为test02
总用量 4
-rw-rw-rw- 1 test02 mysql 12 4月 2 12:15 fstab.bak
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
[root@ansible ~]# ansible mysql -m file -a 'src=/opt/fstab.bak path=/opt/fstab.bak.link state=link'
//创建软链接
[root@ansible ~]# ansible mysql -a 'ls -l /opt'
[root@ansible ~]# ansible mysql -m file -a "path=/opt/fstab.bak.link state=absent"
//删除
[root@ansible ~]# ansible mysql -a 'ls -l /opt'
[root@ansible ~]# ansible mysql -m file -a "path=/opt/test state=touch"
//建立空文件
[root@ansible ~]# ansible mysql -a 'ls -l /opt'
192.168.28.40 | CHANGED | rc=0 >>
总用量 4
-rw-rw-rw- 1 test02 mysql 12 4月 2 12:15 fstab.bak
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
-rw-r--r-- 1 root root 0 4月 2 14:33 test
[root@ansible ~]# ansible mysql -a 'cat /opt/test'
192.168.28.40 | CHANGED | rc=0 >>
//确认为空文件
7、ping模块
[root@ansible ~]# ansible all -m ping
//测试被管理主机是否在线
8、service/yum模块
(1)yum
yum:使用yum软件包管理器安装,升级,降级,删除和列出软件包和组
ansible-doc -s yum
[root@ansible ~]# ansible mysql -m yum -a 'name=httpd'
//yum下载httpd服务;也可以使用all,让所有主机一起运行
[root@ansible ~]# ansible mysql -a 'rpm -q httpd' //查看是否安装
[root@ansible ~]# ansible mysql -m yum -a 'name=httpd state=absent'
//卸载该软件包
(2)service模块
service:用于管理服务运行状态
//在yum安装完成后可以使用service模块启动该服务
[root@ansible ~]# ansible mysql -m yum -a 'name=httpd'
[root@ansible ~]# ansible mysql -m service -a 'name=httpd enabled=true state=started'
//启动该服务并设置开机自启
[root@ansible ~]# ansible mysql -a 'systemctl status httpd'
//检查该服务是否正常开启
9、shell/script - 模块
shell 模块可以使用"<",">","|",";","&"等符号特殊符号,使用方法与 command 模块一致
ansible-doc -s shell
ansible-doc -s script
[root@ansible ~]# ansible webserver -m user -a 'name=zz'
//在webserver端建立一个用户,以作后续测试
[root@ansible ~]# ansible webserver -m shell -a 'echo 123456|passwd --stdin zz'
//给该用户修改密码,这是一个免交互的过程
[root@ansible ~]# vim /opt/test.sh //这是一个测试脚本,生成一个测试文件到对方指定目录中去
#!/bin/bash
echo "this is test script" > /opt/script.txt
chmod +x /opt/script.txt //赋权(一定要赋予执行权限)
[root@ansible ~]# ansible all -m script -a '/opt/test.sh'
//使用script执行该脚本
[root@ansible ~]# ansible all -a 'ls -l /opt/'
'//查看是否生成新文件,该测试脚本书否成功,这种方法可用于大批量创建用户等循环重复场景'
192.168.28.20 | CHANGED | rc=0 >>
总用量 4
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
-rw-rw-rw- 1 root root 20 4月 2 14:55 script.txt
192.168.28.40 | CHANGED | rc=0 >>
总用量 8
-rw-rw-rw- 1 test02 mysql 12 4月 2 12:15 fstab.bak
drwxr-xr-x. 2 root root 6 3月 26 2015 rh
-rw-rw-rw- 1 root root 20 4月 2 14:55 script.txt
-rw-r--r-- 1 root root 0 4月 2 14:33 test
10、setup - 模块
ansible-doc -s setup
[root@ansible ~]# ansible mysql -m setup
//查看该主机详细信息,信息量巨大,建议配合grep使用