在开始之前我们先试想一个场景,你的公司有成百上千台的服务器,这时候领导要求在所有服务器上都添加一个定时任务,或者是执行某个命令,你可能会说用xshell一个一个去连或者是编写一个shell脚本,但是如果过你经历过类似的事情,你一定可以体会到其中的痛苦,因为这么多服务器你用xshell去连的话工作量将变得特别大,但如果你是选择写一个脚本的话也会特别的麻烦,因为每执行一个不同的东西你就要去修改脚本的类容,而且批量脚本一般采用循环的方式去执行一些任务,如果节点太多的话,执行的效率会变得比较低,而批量管理工具一般采用的是并行的方式去执行一些任务或命令,这样在效率上也得到了一定的提升,常见的批量管理工具有ansible,saltstack,puppet
   ansible是用python开发的一款自动化运维工具,基于ssh协议进行远程的批量管理,ansible与同类别的软件对比,最大的有优势就是使用起来方便,简单,快捷,所以被诸多的运维小伙伴儿所喜爱

一、ansible软件部署流程

(一)、环境规划

server type ipaddress hostname
管理主机 10.0.0.61 m01
受控主机 10.0.0.41 backup
受控主机 10.0.0.31 nfs01
受控主机 10.0.0.7 web01

PS:以上所有主机均为centos6.9操作系统

(二)、创建ssh密钥对并批量分发密钥信息

  • 在管理主机上创建此脚本并执行

[root@m1 ~]# vim /service/scripts/fenfa_key.sh

#!/bin/bash
rm /root/.ssh/id_dsa
ssh-keygen -t dsa -f /root/.ssh/id_dsa -N ""
for ip in 31 41 7
do
sshpass -p666666 ssh-copy-id -i /root/.ssh/id_dsa.pub "-o StrictHostKeyChecking=no 10.0.0.$ip"
done
[root@m1 scripts]# sh fenfa_key.sh

  • 在执行完批量分发脚本之后为了保证ssh可以通过密钥的方式进行连接,我们可以写一个测试脚本进行测试

[root@m1 ~]# vim /service/scripts/jiancha_scripts.sh

#/bin/bash
if [ $# -ne 1 ]
then
echo "pls input one agrs"
exit 1
fi
for ip in 31 41 7
do
echo ==============info 10.0.0.$ip==============
ssh 10.0.0.$ip $1
echo ""
done
[root@m1 ~]# sh /service/scripts/jiancha_scripts.sh hostname
==============info 10.0.0.31==============
nfs01

==============info 10.0.0.41==============
backup

==============info 10.0.0.7==============
web01

(三)、通过yum安装ansible软件

  • 注意在安装之前我们需要确认自己的管理主机服务器上边安装了epel源,如果没有可以通过下边这条命令进行下载阿里的epel源
    wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo

[root@m1 ~]# yum -y install ansible

小提示:在有的时候我们可能为了服务器的安全性开启了系统当中的selinux,这时候selinux就有可能阻止了正常的ssh服务的连接,导致ansible命令运行失败,如果你懂selinux还好,如果你不懂selinux怎么办呢?这时候可以在受控端通过 yum install -y libselinux-python 安装ansible官方提供的一个软件来解决因selinux而无法正常使用ansible命令的问题

(四)、在管理主机上添加受控端

[root@m1 ~]# vim /etc/ansible/hosts

[SA]
10.0.0.7
10.0.0.31
10.0.0.41

配置说明:[SA]是受控端主机的组名,下边的ip地址为受控端主机的ip地址,如果有需要可以设置多个组名,方便管理
至此ansible软件部署完成

二、ansible软件的应用

(一)、ansible应用语法

  • ansible 受控端主机信息或者主机组信息 -m 模块名称 -a 相关模块参数

    (二)、ansible常用模块

    1、 command模块

    在远程节点上执行命令

  • chidir-->(在运行命令之前切换到此目录)
    一个栗子:[root@m1 ~]# ansible 10.0.0.31 -m command -a "chdir=/tmp/ pwd"
         10.0.0.31 | SUCCESS | rc=0 >>
         /tmp
  • creates-->(判断一个文件或目录是否存在,如果不存在则执行后边的命令)
    一个栗子:[root@m1 ~]# ansible 10.0.0.31 -m command -a "creates=/etc/dd hostname"
         10.0.0.31 | SUCCESS | rc=0 >>
         nfs01
  • removes -->(判断一个文件是否存在,如果不存在则不执行后边的命令)
    [root@m1 ~]# ansible 10.0.0.31 -m command -a "removes=/etc/dd hostname"
    10.0.0.31 | SUCCESS | rc=0 >>
    skipped, since /etc/dd does not exist

    2、shell模块

    shell模块可以满足command模块所有功能,并且可以支持识别特殊字符信息,可以理解成一个万能的模块,参数也基本与command相同
    一个栗子:[root@m1 ~]# ansible 10.0.0.31 -m shell -a "cd /etc/;pwd"
         10.0.0.31 | SUCCESS | rc=0 >>
         etc

    3、scripts模块

    一个专门执行脚本的模块,即把脚本里边的类容在远端节点上执行
    一个栗子:[root@m1 scripts]# ansible 10.0.0.31 -m script -a "/service/scripts/test.sh"

    4、copy模块

    将文件复制到远端节点上

  • backup-->(覆盖文件前备份源文件)
  • src--->(指定要推送的数据信息)
  • dest-->(定义数据推送到远程目录的什么节点中)
  • owner--->(设置复制后的文件属主权限)
  • group--->(设置复制后的文件属组权限)
  • mode--->(设置复制后的文件权限)
    一个栗子:[root@m1 ~]# ansible 10.0.0.31 -m copy -a "src=/tmp/aa.txt dest=/tmp/ backup=yes mode=777"
    说明:将管理主机下/tmp/aa.txt 文件推到0.31远程节点/tmp/目录下并备份源文件且把文件权限改为777

    5、file模块

    用于修改文件属性或者创建文件或目录

  • owner--->(设置复制后的文件属主权限)
  • group--->(设置复制后的文件属组权限)
  • mode--->(设置复制后的文件权限)
  • state---->(创建文件或目录)
    几个栗子:
    [root@m1 tmp]# ansible 10.0.0.31 -m file -a "dest=/tmp/bb state=directory"------>(在远程节点上创建目录)
    [root@m1 tmp]# ansible 10.0.0.31 -m file -a "dest=/tmp/bb.txt state=touch mode=644"--->(在远程节点上穿件文件,并修改权限)

    6、yum模块

    用于安装卸载查看远程节上的程序包

  • name-->(执行要安装软件的名称,以及软件的版本)
  • state-->(installed安装 absent(卸载)
  • list-->(指定软件名称,查看软件是否可以安装,以及是否已经安装过了)
    几个栗子
    [root@m1 tmp]# ansible 10.0.0.31 -m yum -a "name=iftop state=absent"-->(卸载iftop软件)
    [root@m1 tmp]# ansible 10.0.0.31 -m yum -a "name=iftop state=installed"-->(安装iftop软件)
    [root@m1 tmp]# ansible 10.0.0.31 -m yum -a "list=iftop"-->(查看iftop软件)

    7、service模块

    用于管理远程节点服务运行状态及开机自启

  • name-->(指定要管理的服务名称;注意:管理的服务一定在chkconfig中可以看到)
  • state-->(用于设置服务的状态如:stopped started restarted reloaded)
  • enabled-->(设置服务是否开机自启动,yes表示服务开机自启动 no表示服务开机不要自动启动)

一个栗子
[root@m1 tmp]# ansible 10.0.0.31 -m service -a "name=crond state=stopped enabled=on"-->(将crond这个服务关闭并设置开机不要启动)

8、cron模块

用于管理远端节点的定时任务

  • minute  -->(分)
  • hour   -->(时)
  • day   -->(日)
  • month  -->(月)
  • weekday -->(周)
  • name   -->(指定定时任务的名字)
  • job    -->(要干的事情)
  • state-->(对定时任务执行什么操作如:absent删除定时任务)
  • disabled-->(注释某个定时任务,yes标识注释,no 标识取消注释)

几个栗子

[root@m1 tmp]# ansible 10.0.0.31 -m cron -a "name=empty minute=0 hour=0 job='cat /dev/null>/tmp/aa.txt' "-->(添加一个定时任务)
[root@m1 tmp]# ansible 10.0.0.31 -m cron -a "name=empty job='cat /dev/null>/tmp/aa.txt' disabled=yes"-->(注释掉一个定时任务)
[root@m1 tmp]# ansible 10.0.0.31 -m cron -a "name=empty state=absent"-->(删除掉一个定时任务)

(三)、ansible剧本

ansible剧本与Linux当中shell脚本类似,在Linux中如果我们需要执行多条命令实现一个功能这时候我们就可以把这些命令写到一个文件里生成一个shell脚本,而ansible剧本就是将多个ansible命令语法模块写到一个文件里,从而实现一些自动化的,方便的一些功能

1、ansible编写剧本规范

PS:编写规范遵循pyyaml语法规范,我们可以参考官方文档进行学习:https://docs.ansible.com/ansible/latest/reference_appendices/YAMLSyntax.html
格式说明

  • 短横线“-”表示定义同级别的语法
  • 冒号“:”定义键号后边的值如:姓名: 张三
  • 空格 对内容进行分级,每隔一级前边需要有两个空格
    一个栗子
    使用ansible一键安装httpd服务
    ansible批量管理服务详解

    2、执行ansible脚本的方法

  • ansible-playbook httpd.yml执行该剧本
  • ansible-playbook -C httpd.yml 测试该剧本是否可以正常运行

总结:学好ansible的两个重点一是学好ansible的模块二是学好ansible剧本的编写,当然前者是为后者做铺垫的,所以想要学好ansible除了参考官方文档以外还可以使用ansible-doc命名,这个命令相当与shell中的man命令,可以在线寻求帮助