Ansible概述:
- Ansible是一款开源的、简单的运维自动化工具,是企业当中应用非常广的,自动化统一配置管理工具。
- Ansible没有使用C/S架构,而是直接通过ssh协议来进行系统管理、自动化执行命令、部署等操作和任务。
- Ansible的自动化主要体现在Ansible集成了丰富模块以及功能组件…… Ansible可以通过一个命令完成一系列的操作,进而能减少重复性的工作和维护成本,可以提高工作效率。
- Ansible可以同步或异步完成playbook任务,默认是同步进行,但需要的话也可以在playbook中指定为异步模式。
Ansible的特点:
- Ansible不需要单独安装客户端,也不需要启动任何服务
- Ansible是python中的一套完整的自动化执行任务模块
- Ansible playbook剧本采用yaml配置,对于自动化任务的执行过程一目了然
Ansible的功能:
- 远程执行批量执行远程命令,可以对多台主机进行远程操作
- 配置管理批量配置软件服务,可以进行自动化方式配置,服务的统一配置管理,和启停
- 事件驱动通过Ansible的模块,对服务进行不同的事件驱动,比如: 1)修改配置后重启。 2)只修改配置文件,不重启。 3)修改配置文件后,重新加载。 4)远程启停服务管理
- 任务编排可以通过playbook的方式来统一管理服务,并且可以使用一条命令,实现一套架构的部署
- 跨平台,跨系统几乎不受到平台和系统的限制,比如安装apache和启动服务
Ansible和其他管理软件的对比:
Ansible的架构图及执行流程:
- Ansible读取playbook剧本,剧本中会记录对哪些主机执行哪些任务。
- 首先Ansible通过主机清单找到要执行的主机,然后调用具体的模块,将前面的信息加载到模块当中。
- 然后Ansible会通过连接插件 (Ansible通过SSH进行远程链接) 连接对应的主机并推送对应的任务列表。
- 最后被管理的主机,会将Ansible发送过来的任务进行解析,然后以本地Shell命令的方式执行完毕。
Ansible:
- 核心:ansible 核心模块(Core Modules):这些都是ansible自带的模块
- 扩展模块(Custom Modules):如果核心模块不足以完成某种功能,可以添加扩展的自定义模块(这些模块是开发人员补充完成)
- 插件(Plugins):完成模块功能的补充
- 剧本(Playbooks):ansible的任务配置文件,将多个任务定义在剧本中,由ansible自动执行
- 连接插件(Connectior Plugins):ansible基于连接插件连接到各个主机上,虽然ansible是使用ssh连接到各个主机的,但是它还支持其他的连接方法,所以需要有连接插件
- 主机群(Host Inventory):定义ansible管理的主机
使用shell脚本一键式部署Ansible
准备两台机器:
控制节点:node1:192.168.40.134
受管节点:node2:192.168.40.134
编写脚本:
#!/bin/bash
#判断本地仓库是否存在
if [ -f /etc/yum.repos.d/yum.repo ]
#存在
then
#挂载本地仓库
mount /dev/sr0
#不存在
else
#删除系统默认仓库
rm -rf /etc/yum.repos.d/*
#编写本地仓库
cat >/etc/yum.repos.d/yum.repo <<EOF
[yum]
name=centos
enabled=1
gpgcheck=0
baseurl=file:///mnt
EOF
#挂载本地仓库
mount /dev/sr0 /mnt
fi
#设置开机自启
echo " /etc/yum.repos.d/ " >> /etc/rc.d/rc.local
chmod +x /etc/rc.d/rc.local
#--------------------------------------------------------------
#下载网络仓库配置文件
wget -O /etc/yum.repos.d/epel-7.repo https://mirrors.aliyun.com/repo/epel-7.repo
wget -O /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
#清除现有缓存,构建新的仓库缓存
yum clean all && yum makecache
#Ansible-控制节点,安装ansible
yum install -y ansible
#Ansible主控节点,在/etc/hosts文件,做主机名与IP地址映射
echo "192.168.40.134 node1" >> /etc/hosts
echo "192.168.40.135 node2" >> /etc/hosts
#编写主机清单
cat >> /etc/ansible/hosts << EOF
[web]
node1
node2
EOF
#安装expect包
yum install -y expect
#非交互式生成密钥对
expect <<EOF
spawn ssh-keygen
expect {
"(/root/.ssh/id_rsa):" { send "\r";exp_continue }
"(empty for no passphrase):" { send "\r";exp_continue }
"again:" { send "\r";exp_continue }
}
EOF
#循环传输密钥
for i in `seq 2`
do
expect <<EOF
spawn ssh-copy-id node$i
expect {
"(yes/no)?" { send "yes\r";exp_continue }
"password:" { send "123456\r";exp_continue }
}
EOF
done