Ansible自动化运维工具


1、为什么会有自动化运维软件的出现?

由于互联网的快速发展导致产品更新换代的速度逐渐加快,运维人员每天都要进行大量的维护操作,依旧按照传统的方式进行维护会使工作效率低下。这时候,自动化运维软件的产生很好的解决了这样的一个问题,尽可能的安全高效的完成运维工作。

2、自动化运维软件有哪些分类?

一般我们把自动化运维工具划分为两类:一类是需要使用代理工具,也就是基于专用的Agent程序来完成管理功能,如:Puppet,Func,Zabbix等;另一类是不需要配置代理工具的,可以基于SSH服务来完成管理功能,如:Ansible、Fabric等。

3、Ansible的什么优点能够脱颖而出?

ansible是基于Python开发,集合众多运维工具的优点,实现批量运行命令,部署程序,配置系统等功能。默认通过SSH协议进行远程命令执行或下发配置,无需部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台主机并行管理,使得管理主机更加便捷。

4、Ansible的核心组件

●ansible核心引擎

●host inventory主机清单:用于定于ansible所管理的主机,默认在ansible配置文件中定义被管理的主机,同时也支持自定义动态管理主机清单和指定配置文件的位置。

●connection plugins连接插件:负责和被管理的主机实现通讯。除支持使用SSH连接到主机外,ansible还支持其他连接的方式,所以需要有连接插件将各个主机用连接插件连接到ansible。

●playbook剧本:用于集中定义ansible任务的配置文件,即将多个任务定义在一个剧本中有ansible自动执行,可以控制主机针对多台被管理主机运行多个任务。

●core modules核心模块:是ansible自带的模块,使用这些模块将资源分发到被管理主机,是其执行特定的任务或匹配特定的状态。

●custom modules自定义模块:用于完成模块功能的补充,可以借助相关插件完成记录日志、发送邮件等功能。

5、Ansible架构

自动化运维Ansible,强大的自动化运维工具!_第1张图片

图片转自大佬博客:https://blog.51cto.com/191226139/2066936


                                          安装部署Ansible服务


ansible案例环境


角色 操作系统 IP地址 组名
控制主机 Centos7 192.168.71.128
被管理主机 Centos7 192.168.71.129 web
被管理主机 Centos7 192.168.71.130 mysql



1、安装ansible

本案例使用centos7操作系统,通过yum安装ansible,需要依赖第三方的epel源。

[root@bogon ~]# yum install epel-release -y

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

[root@bogon ~]# ansible --version      #查看ansible版本号

自动化运维Ansible,强大的自动化运维工具!_第2张图片

[root@bogon ~]# yum install tree -y    #安装tree工具,查看ansible文件组成

[root@bogon ~]# tree /etc/ansible

自动化运维Ansible,强大的自动化运维工具!_第3张图片


2、配置主机清单

Asible通过读取默认主机清单 /etc/ansible/hosts文件,修改主机与组配置后,可同时连接到多个被管理的主机上执行任务。

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

自动化运维Ansible,强大的自动化运维工具!_第4张图片


3、设置SSH协议生成秘钥连接

[root@bogon ~]# ssh-keygen -t rsa         #设置rsa不对称秘钥

Generating public/private rsa key pair.          #回车

Enter file in which to save the key (/root/.ssh/id_rsa):     #秘钥保存位置在root目录下,使用ls -la命令可查看到./ssh文件

Created directory '/root/.ssh'.

Enter passphrase (empty for no passphrase):     #输入秘钥密码

Enter same passphrase again:         #再次确认密码

Your identification has been saved in /root/.ssh/id_rsa.

Your public key has been saved in /root/.ssh/id_rsa.pub.

The key fingerprint is:

SHA256:hZDkiN37NzohGKRu+Z+eoRXozPnOOhjQFYyBHGNOwTA root@bogon

The key's randomart image is:

+---[RSA 2048]----+

|EB++.oo.         |

|=+oo++.. .       |

| o.+o o . .      |

|. o .. . .       |

| o ..oo S        |

|  =+...o.        |

| . += o...o      |

|  . o= +.o .     |

|    o*O ..       |

+----[SHA256]-----+


4、推送秘钥到被管理主机

[root@bogon ~]# ssh-copy-id [email protected]         #使用ssh-copy-id命令进行推送

/usr/bin/ssh-copy-id: INFO: Source of key(s) to be installed: "/root/.ssh/id_rsa.pub"

The authenticity of host '192.168.71.129 (192.168.71.129)' can't be established.

ECDSA key fingerprint is SHA256:xN0OXAGFTp+l2+pApp3nbZOERwU80gPh38NZZWat55w.

ECDSA key fingerprint is MD5:59:30:06:88:69:6f:4b:ae:dc:35:50:f1:a6:51:d6:4a.

Are you sure you want to continue connecting (yes/no)? yes       #是否建立连接,yes

/usr/bin/ssh-copy-id: INFO: attempting to log in with the new key(s), to filter out any that are already installed

/usr/bin/ssh-copy-id: INFO: 1 key(s) remain to be installed -- if you are prompted now it is to install the new keys

[email protected]'s password:            #输入被控制主机的密码


5、使用ssh-agent代理免密操作

[root@bogon ~]# ssh-agent bash

[root@bogon ~]# ssh-add

Enter passphrase for /root/.ssh/id_rsa:      #秘钥密码

Identity added: /root/.ssh/id_rsa (/root/.ssh/id_rsa)


                                        Ansible应用命令基础

1、查看模块及相关模块命令

[root@bogon ~]# ansible-doc -l            #查看ansible所有模块,q退出

[root@bogon ~]# ansible-doc -s command    #查看command模块的用法

2、conmand模块

格式:ansible+组名 -m 指定模块  -a  '命令’

[root@bogon ~]# ansible web -m command -a 'date'      #使用command查看web组下的主机的时间

192.168.71.129 | CHANGED | rc=0 >>

2018年 10月 19日 星期五 22:34:23 CST

3、cron模块

Ansible中cron模块用于定义任务计划。其中有两种状态(state):present表示添加,absent表示移除

[root@bogon ~]# ansible web -m cron -a 'minute="*/1" job="/usr/bin/echo hello" name="test"'    #每一分钟输出一个hello,人物名为test

192.168.71.129 | CHANGED => {

    "changed": true, 

    "envs": [], 

    "jobs": [

        "test"

    ]

}

[root@bogon ~]# ansible web -m cron -a 'name="test" state=absent'       #移除任务

192.168.71.129 | CHANGED => {

    "changed": true, 

    "envs": [], 

    "jobs": []

}

4、user模块

Ansible中的user模块用于创建新用户和更改、删除已存在的用户。其中name选项用来知名创建用户的名称。

[root@bogon ~]# ansible all -m user -a 'name="test01" system=yes'        #all指定所有组,name=test01,system=yes固定参数。

192.168.71.129 | CHANGED => {

    "changed": true, 

    "comment": "", 

    "create_home": true, 

    "group": 985, 

    "home": "/home/test01", 

    "name": "test01", 

    "shell": "/bin/bash", 

    "state": "present", 

    "system": true, 

    "uid": 990

}

192.168.71.130 | CHANGED => {

    "changed": true, 

    "comment": "", 

    "create_home": true, 

    "group": 985, 

    "home": "/home/test01", 

    "name": "test01", 

    "shell": "/bin/bash", 

    "state": "present", 

    "system": true, 

    "uid": 990

}

[root@bogon ~]# ansible web -m user -a 'name="test01" state=absent'       #state=absent,删除test01用户。

192.168.71.129 | CHANGED => {

    "changed": true, 

    "force": false, 

    "name": "test01", 

    "remove": false, 

    "state": "absent"

}

5、group模块

group模块请求的是groupadd,groupdel,groupmod 三个指令

[root@bogon ~]# ansible mysql -m group -a 'name=mysql system=yes'      #创建mysql组

192.168.71.130 | CHANGED => {

    "changed": true, 

    "gid": 984, 

    "name": "mysql", 

    "state": "present", 

    "system": true

}

[root@bogon ~]# ansible mysql -m user -a 'name=test02 uid=1001 group=mysql system=yes'  创建用户,name指定用户名称,uid自定义,加入group组中。

192.168.71.130 | CHANGED => {

    "changed": true, 

    "comment": "", 

    "create_home": true, 

    "group": 984, 

    "home": "/home/test02", 

    "name": "test02", 

    "shell": "/bin/bash", 

    "state": "present", 

    "system": true, 

    "uid": 1001

}

6、copy模块

可以用来copy文件和写入信息到指定文件中

[root@bogon ~]# ansible mysql -m copy -a 'src=/etc/fstab dest=/opt/fstab.bk owner=test02 mode=644'     #复制/etc/fstab文件到被控制主机下的/opt目录下改名为fstab.bk 属主为test02 权限644

192.168.71.130 | CHANGED => {

    "changed": true, 

    "checksum": "e8641c5e427d241ea0cc641d8545b86205b803a8", 

    "dest": "/opt/fstab.bk", 

    "gid": 0, 

    "group": "root", 

    "md5sum": "3394e646a6032f7fcb08007f466bac35", 

    "mode": "0644", 

    "owner": "test02", 

    "secontext": "system_u:object_r:usr_t:s0", 

    "size": 617, 

    "src": "/root/.ansible/tmp/ansible-tmp-1539933819.19-164467458307203/source", 

    "state": "file", 

    "uid": 1001

}

[root@bogon ~]# ansible mysql -m copy -a 'content="this is test" dest=/opt/fstab.bk'       #写入一段话到被控制主机/opt/fstab文件中

192.168.71.130 | CHANGED => {

    "changed": true, 

    "checksum": "b6794b2000d94d348203d0279c2e7322b922cb16", 

    "dest": "/opt/fstab.bk", 

    "gid": 0, 

    "group": "root", 

    "md5sum": "8c6d115258631625b625486f81b09532", 

    "mode": "0644", 

    "owner": "test02", 

    "secontext": "system_u:object_r:usr_t:s0", 

    "size": 12, 

    "src": "/root/.ansible/tmp/ansible-tmp-1539933966.74-136016829845719/source", 

    "state": "file", 

    "uid": 1001

}

7、file模块

用来创建文件、目录和修改属主属组及权限

[root@bogon ~]# ansible web -m user -a 'name="test" system=yes'            #创建test用户

[root@bogon ~]# ansible web -m group -a 'name="test" system=yes'         #创建test组

[root@bogon ~]# ansible web -m file -a 'path=/opt/fstab.bk owner=test group=test mode=666'     #修改控制主机下/opt/fstab.bk文件属主属组和权限

192.168.71.129 | CHANGED => {

    "changed": true, 

    "gid": 984, 

    "group": "test", 

    "mode": "0666", 

    "owner": "test", 

    "path": "/opt/fstab.bk", 

    "secontext": "unconfined_u:object_r:usr_t:s0", 

    "size": 617, 

    "state": "file", 

    "uid": 989

}

[root@bogon ~]# ansible web -m file -a 'path=/opt/file.txt state=touch'       #创建空文件file.txt

192.168.71.129 | CHANGED => {

    "changed": true, 

    "dest": "/opt/file.txt", 

    "gid": 0, 

    "group": "root", 

    "mode": "0644", 

    "owner": "root", 

    "secontext": "unconfined_u:object_r:usr_t:s0", 

    "size": 0, 

    "state": "file", 

    "uid": 0

}

[root@bogon ~]# ansible web -m file -a 'path=/opt/temp state=directory mode=755'     #创建目录

192.168.71.129 | CHANGED => {

    "changed": true, 

    "gid": 0, 

    "group": "root", 

    "mode": "0755", 

    "owner": "root", 

    "path": "/opt/temp", 

    "secontext": "unconfined_u:object_r:usr_t:s0", 

    "size": 6, 

    "state": "directory", 

    "uid": 0

}

[root@bogon ~]# ansible web -m file -a 'path=/opt/temp state=absent'   #删除目录,删除文件同理

192.168.71.129 | CHANGED => {

    "changed": true, 

    "path": "/opt/temp", 

    "state": "absent"

8、yum模块

用yum模块给被控制主机一键安装众多服务

[root@bogon ~]# ansible all -m yum -a 'name=httpd'    #所有被控制主机yum安装httpd

ansible web -m yum -a 'name=httpd state=absent'  #卸载服务

9、service模块

启动、关闭、查看服务状态

ansible web -a 'systemctl status httpd'     #查看服务状态

ansible web -a 'systemctl start httpd'      #开启服务

ansible web -a 'systemctl stopped httpd'  #关闭服务

10 shell模块

[root@bogon ~]# ansible web -m user -a 'name=jerry'    #创建jerry用户

192.168.71.129 | CHANGED => {

    "changed": true, 

    "comment": "", 

    "create_home": true, 

    "group": 1001, 

    "home": "/home/jerry", 

    "name": "jerry", 

    "shell": "/bin/bash", 

    "state": "present", 

    "system": false, 

    "uid": 1001

}

[root@bogon ~]# ansible web -m shell -a 'echo 123123 | passwd --stdin jerry'    #使用shell模块更改jerry用户密码

192.168.71.129 | CHANGED | rc=0 >>

更改用户 jerry 的密码 。

passwd:所有的身份验证令牌已经成功更新。

11、script模块

vim /opt/abc.txt     #创建一个shell脚本

#!/bin/bash

echo "this is test"> /opt/abc

ansible mysql -m script -a '/opt/abc.sh'   #使用script模块可以让被控制主机去执行该shell脚本

12、setup模块

ansible mysql -m setup   #查看被控制主机信息

13、ping模块

[root@bogon ~]# ansible web -m ping     #查看被控制主机网络情况

192.168.71.129 | SUCCESS => {

    "changed": false, 

    "ping": "pong"

}