Ansible自动化运维工具
无主无从架构,开箱即用,用完即走,支持API调用,支持插件
工作原理
使用模块的方式对大量主机进行操作
有主要使用的模块,也有用户自定义的模块、
通过SSH协议与其他主机进行通信
比较重要的是主机列表,ansible只读取主机列表中的内容
主要应用
-
应用部署
-
配置管理
-
工作流程编排
-
读取主机信息等
安装要求
服务端:
$$
Python2.6+
支持RedHat、Debian、CentOS、OS X等,不支持Windows
被
管
理
端
:
被管理端:
被管理端:
Python 2.6+ 需支持SSH
$$
安装过程
yum -y install epel-release
#先安装源
yum -y install ansible
#直接安装ansible
rpm -qa |grep ansible
#查看安装包
编写主机清单
vim /etc/ansible/hosts
#默认主机清单位置
主机列表有两种填写方式:
1.直接写IP地址或者主机名(要有IP地址与主机名的映射)
2.编写主机分组,再将主机IP地址或主机名写到对应分组下
[IP地址] [ansible_ssh_user=root] [ansible_ssh_pass=root`s password] [其他参数,端口等]
为了避免因对hosts文件大量重复性而导致的一些错误,我们可以采用 ansible -i参数来指定自定义的主机清单目录
配置文件:
/etc/ansible/ansible.cfg
免密登录
ssh-keygen -t rsa -f /root/.ssh/id_rsa -N ""
ssh-copy-id [主机IP]
可以设置免密登录,也可以在主机清单里面指定执行命令的用户名和密码
批量操作使用sshpass:非交互ssh密码验证
**单台主机:**sshpass -p 明文密码 登录主机
sshpass -p'123456' ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@10.248.64.18
批量操作:
#!/usr/bin/sh
# author: ergouzi
# date: 2020.05.28
# ssh免密认证公钥分发脚本
# 指定主机列表文件
_REMOTE_HOST_=/root/remote_hostIP.txt
for host in $(cat "${_REMOTE_HOST_}")
do
sshpass -p'bwdaq110' ssh-copy-id -o StrictHostKeyChecking=no -i /root/.ssh/id_rsa.pub root@$host > /dev/null 2>&1 && echo "$host succeed." || echo "$host failed."
done
Ansible常用模块
- 执行shell命令(command和shell)
- 文件传输(copy和file)
- 软件包管理(yum)
- 用户组管理(user)
- 源代码管理系统部署(git)
- 管理服务(service)
- 收集目标主机信息(setup)
command模块:
在远程主机上执行命令,不会经过远程主机的shell处理
ansible servers -m command -a "ls"
#执行了这条命令会返回相应结果,但是在目标主机上面并不会看到相应操作过程
#ansible使用模块的时候使用-m来指定模块名,当不使用-m参数时默认执行command模块
常用参数:
free_form:常用操作指令
chdir:切换目录
creates:创建一个文件,如果文件存在,不执行
removes:删除一个文件,如果文件不存在,不执行
当使用command模块去复制文档到远程主机的时候需要考虑本地文件是否具有可执行权限
command模块不会解析元字符的含义,如果需要用到通配功能就需要用到shell模块
shell模块比command多一个executable参数:指定其他类型shell的时候使用
yum模块:
yum 模块可以帮助我们在远程主机上通过 yum 源管理软件包
对安装包的验证,禁用yum源等操作
service模块:
管理远程主机上的服务,通常是启动、关闭、重启某服务等操作
AD-Hoc模式
配置文件批量复制 :copy模块的使用
ansible [主机IP或主机清单中的主机分组] -m copy -a "src=[源主机配置文件位置] dest=[目标主机配置文件位置]"
ansible servers -m copy -a “src=aaa dest=/home”
主机ping通测试:ping模块的使用
ansible [主机IP或分组] -m ping
ansible servers -m ping
这里是使用SSH协议测试连通性,并没有使用到ICMP协议
playbook模式
使用YUML语言编排应用的部署,适合复杂业务部署
生成一个.yml的文件,将执行信息写入文件执行:
指定文本执行的主机IP或主机分组(主机清单中),将需要部署业务分成多个任务,每个任务给定描述和执行命令,实现自动部署
ansible-playbook filename.yml --syntax-check
#检查yml文件中是否有语法错误
ansible-playbook filename.yml
#执行命令
playbook批量部署tomcat
- 下载jdk
- 下载tomcat包
- 解压
- 启动
执行文件:
---
- hosts: servers #与主机清单中的主机IP或者主机分组相对应
gather_facts: yes
#指定是否获取主机信息
vars:
tomcat_version: 8.5.54
#指定一个变量,便于修改版本
tomcat_install_dir: /usr/local
#指定安装目录
tasks:
#指定多个任务描述
- name: Install jdk1.8 #描述每个任务的名称
yum: name=java-1.8.0-openjdk state=present
#调用yum模块,present:安装,absent:删除
- name: Download tomcat
get_url: url=http://mirrors.hust.edu.cn/apache/tomcat/tomcat-8/v{{tomcat_version}}/bin/apache-tomcat-{{tomcat_version}}.tar.gz dest=/tmp
- name: Unarchive tomcat-{{tomcat_version}}.tar.gz
unarchive:
src: /tmp/apache-tomcat-{{tomcat_version}}.tar.gz
dest: "{{tomcat_install_dir}}"
copy: no
#只要求本地主机有这个源文件,yes则需要目标主机有源文件,没有就copy过去
- name: Start tomcat
shell: cd {{tomcat_install_dir}} && mv apache-tomcat-{{tomcat_version}} tomcat8 && cd tomcat8/bin && nohub ./startup.sh &
Roles:
有了剧本就要有角色。
我们可以在yml文件中指定roles参数,在roles下指定其他yml文件,从而精简playbook文件的内容,实现多任务执行。