因为互联网的快速发展致使产品更新换代速度逐渐加快,运维人员天天都要进行
大量的维护操做,仍旧按照传统方式进行维护会使得工做效率低下。这时,部署自动
化运维就能够尽量安全、高效地完成这些工做。
通常会把自动化运维工具划分为两类:一类是须要使用代理工具的,也就是基于
专用的ABem程序来完成管理功能,如: Puppet、Func、 Zabbix等;另一类是不需
要配置代理工具的,能够直接基于SSH服务来完成管理功能,如: Ansible、 Fabric等。
python
-mysql
下面介绍几款功能相似的自动化运维工具:web
1. Puppet
Pup基于Rpy开发,支持Linx、UNDX、 Windows平台,能够针对用户、系统服务
配置文件、软件包等进行管理,有很强的扩展性,但远程执行命令相对较弱。sql2. SaltStack
CallStack基于 Python开发,容许管理员对多个操做系统建立统一的管理系统,比
pet更轻量级shell
工具 | 开发语言 | 结构 | 配置文件 格式 | 运行任务 |
---|---|---|---|---|
Ansible | Python | 无 | YAML | 支持命令行 |
SaltStack | Python | C/S | YAML | 支持命令行 |
Puppet | Ruby | C/S | Ruby语法格式 | 经过模块实现 |
Ansible
Ansible基于 Python开发,集合了众多优秀运维工具的优势,实现了批量运行命令
部署程序、配置系统等功能。默认经过SSH协议进行远程命令执行或下发配置,无需
部署任何客户端代理软件,从而使得自动化环境部署变得更加简单。可同时支持多台
主机并行管理,使得管理主机更加便捷。vim
官方的title是“Ansible is Simple IT Automation”——简单的自动化IT工具。
Ansible跟其余IT自动化技术的区别在于其关注点并不是配置管理、应用部署或IT流程工做流,而是提供一个统一的界面来协调全部的IT自动化功能,所以Ansible的系统更加易用,部署更快。
Ansible可让用户避免编写脚本或代码来管理应用,同时还能搭建工做流实现IT任务的自动化执行。IT自动化能够下降技术门槛及对传统IT的依赖,从而加快项目的交付速度。安全
Ansible基本架构由六个部分组成:
Ansible core 核心引擎。
Host inventory 主机清单:用来定义Ansible 所管理的主机,默认是在Ansible的host配置文件中定义被管理主机,同时也支持自定义动态主机清单和指定其余配置文件的位置。
Connection plugins链接插件:负责和被管理主机实现通讯。除支持使用ssh链接被管理主机外, Ansible还支持其余的链接方式,因此须要有链接插件将各个主机用链接插件链接到 Ansible。
Playbooks(yaml, injaz2)剧本:用来集中定义 Ansible任务的配置文件,即将多个任务定义在一个剧本中由 Ansible自动执行,能够由控制主机针对多台被管理主机同时运行多个任务。
Core modules核心模块:是 Ansible自带的模块,使用这些模块将资源分发到被管理主机,使其执行特定任务或匹配特定的状态。
Custom modules自定义模块:用于完成模块功能的补充,可借助相关插件完成记录日志、发送邮件等功能。bash
-架构
ansible功能特性:
- 应用代码自动化部署
- 系统管理配置自动化
- 支持持续交付自动化
- 支持云计算,大数据平台环境
- 轻量级,无序在客户端安装agent,更新时只需在控制机上进行更行便可
- 批量任务执行能够写成脚本,不用分发到远程就能够执行
- 支持非root用户管理操做,支持sudo
- 使用python编写,维护更简单
Ansible 自动化运维环境由控制主机与被管理主机组成,因为Ansible是基于SSH协议进行通讯的,因此控制主机安装Ansible软件后不须要重启或运行任何程序,被管理主机也不须要安装和运行任何代理程序。运维
角色 | 主机名 | IP地址 | 组名 |
---|---|---|---|
控制主机 | 01 | 192.168.100.129 | |
被管理主机 | 02 | 192.168.100.128 | webserver |
被管理主机 | 03 | 192.168.100.130 | mysql |
三台主机关闭防火墙:
[root@localhost ~]# systemctl stop firewalld.service [root@localhost ~]# setenforce 0
yum install epel-release -y yum install ansible –y
[root@01 ~]# ansible --version
[root@01 ~]# cd /etc/ansible/ [root@01 ansible]# ls
[root@01 ansible]# vim /etc/ansible/hosts //配置主机清单
[root@01 ~]# ssh-keygen -t rsa //生成密钥对
[root@01 ~]# ssh-agent bash [root@01 ~]# ssh-add
shell脚本批量发送公钥
[root@01 .ssh]# yum install expect -y //yum安装expect
[root@01 .ssh]# ansible all -m ping //使用ansible中的ping模块
ansible是基于SSH协议,因此能够ping通的主机储存在.ssh/known_hosts的文件当中。固然就算不ping通也能够用shell脚本实现批量推送公钥。
[root@01 ~]# cd ~/.ssh/ [root@01 .ssh]# ls id_rsa id_rsa.pub known_hosts [root@01 .ssh]# vim known_hosts //查看下已经记录在SSH协议的主机,不作任何修改操做
[root@01 .ssh]# vim ~/.ssh/pushssh.sh
#!/bin/sh cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys host1=`cat /etc/ansible/hosts | awk -F " " '{print $1}' | grep '^192'` #在生产状况中,有不少种得到IP的方法,本脚本最重要的就是得到IP地址,脚本只是提供一个思路。 for i in $host1; do command1="scp ~/.ssh/authorized_keys root@$i:~/.ssh/authorized_keys" password="123123" /usr/bin/expect -c " spawn ssh-copy-id root@$i expect { \"*password\" { send \"$password\r\"; exp_continue } } expect eof" done #编写脚本完成后保存退出 [root@01 .ssh]# sh pushssh.sh //执行脚本
[root@01 ~]# ansible all -m command -a 'date'