一、ansible 是什么?
ansible是新出现的自动化运维工具,基于Python开发,集合了众多运维工具(puppet、chef、func、fabric)的优点,实现了批量系统配置、批量程序部署、批量运行命令等功能。 ansible是基于 paramiko 开发的,并且基于模块化工作,本身没有批量部署的能力。真正具有批量部署的是ansible所运行的模块,ansible只是提供一种框架。ansible不需要在远程主机上安装client/agents,因为它们是基于ssh来和远 程主机通讯的。
二、ansible 架构图

上图中我们看到的主要模块如下:
Ansible:Ansible核心程序。HostInventory:记录由Ansible管理的主机信息,包括端口、密码、ip等。Playbooks:“剧本”YAML格式文件,多个任务定义在一个文件中,定义主机需要调用哪些模块来完成的功能。CoreModules:核心模块,主要操作是通过调用核心模块来完成管理任务。CustomModules:自定义模块,完成核心模块无法完成的功能,支持多种语言。ConnectionPlugins:连接插件,Ansible和Host通信使用
三、ansible 任务执行
ansible 任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc和playbook:
ad-hoc模式(点对点模式) 使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。
playbook模式(剧本模式) 是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
ansible 执行流程

简单理解就是Ansible在运行时, 首先读取ansible.cfg中的配置, 根据规则获取Inventory中的管理主机列表, 并行的在这些主机中执行配置的任务, 最后等待执行返回的结果。
ansible 命令执行过程
加载自己的配置文件,默认
/etc/ansible/ansible.cfg;查找对应的主机配置文件,找到要执行的主机或者组;
加载自己对应的模块文件,如 command;
通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
对应执行用户的家目录的
.ansible/tmp/XXX/XXX.PY文件;给文件 +x 执行权限;
执行并返回结果;
删除临时py文件,
sleep 0退出;
四、ansible 的部署和配置
(一)环境说明
(二)ansible-master安装Ansible
通过Apt (Ubuntu)安装最新发布版本
Ubuntu 编译版可在PPA中获得: <https://launchpad.net/~ansible/+archive/ansible>
配置PPA及安装ansible,执行如下命令:
$ sudo apt-get install software-properties-common
$ sudo apt-add-repository ppa:ansible/ansible
$ sudo apt-get update
$ sudo apt-get install ansible在早期Ubuntu发行版中, “software-properties-common” 名为 “python-software-properties”.
也可从源码checkout中创建 Debian/Ubuntu 软件包,执行:
$ make deb通过Yum安装最新发布版本
通过Yum安装RPMs适用于 EPEL 6, 7, 以及仍在支持中的Fedora发行版.
托管节点的操作系统版本可以是更早的版本(如 EL5), 但必须安装 Python 2.4 或更高版本的Python.
Fedora 用户可直接安装Ansible, 但RHEL或CentOS用户,需要 配置 EPEL
# install the epel-release RPM if needed on CentOS, RHEL, or Scientific Linux
$ sudo yum install ansible你也可以自己创建RPM软件包.在Ansible项目的checkout的根目录下,或是在一个tarball中,使用 make rpm 命令创建RPM软件包. 然后可分发这个软件包或是使用它来安装Ansible.在创建之前,先确定你已安装了 rpm-build, make, and python2-devel .
$ git clone git://github.com/ansible/ansible.git
$ cd ./ansible
$ make rpm
$ sudo rpm -Uvh ~/rpmbuild/ansible-*.noarch.rpm通过 Pip 安装最新发布版本
Ansible可通过 “pip” 安装(安装和管理Python包的工具),若你还没有安装 pip,可执行如下命令安装:
$ sudo easy_install pip然后安装Ansible:
$ sudo pip install ansible如果你是在 OS X Mavericks 上安装,编译器可能或告警或报错,可通过如下设置避免这种情况:
$ sudo CFLAGS=-Qunused-arguments CPPFLAGS=-Qunused-arguments pip install ansible使用 virtualenv 的读者可通过 virtualenv 安装 Ansible, 然而我们建议不用这样做,直接在全局安装 Ansible.不要使用 easy_install 直接安装 ansible.
(三)ansible 程序结构
安装目录如下(yum安装):
配置文件目录:/etc/ansible/
执行文件目录:/usr/bin/
Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/
Help文档目录:/usr/share/doc/ansible-X.X.X/
Man文档目录:/usr/share/man/man1/
ansible配置文件查找顺序
ansible与我们其他的服务在这一点上有很大不同,这里的配置文件查找是从多个地方找的,顺序如下:
检查环境变量
ANSIBLE_CONFIG指向的路径文件(export ANSIBLE_CONFIG=/etc/ansible.cfg);~/.ansible.cfg,检查当前目录下的ansible.cfg配置文件;/etc/ansible.cfg检查etc目录的配置文件。
(四)ansible配置文件
安装的ansible配置文件为空,范例可查看ansible/examples/ansible.cfg at stable-2.9 · ansible/ansible · GitHub
ansible 的配置文件为/etc/ansible/ansible.cfg,ansible 有许多参数,下面我们列出一些常见的参数:
inventory = /etc/ansible/hosts #这个参数表示资源清单inventory文件的位置
library = /usr/share/ansible #指向存放Ansible模块的目录,支持多个目录方式,只要用冒号(:)隔开就可以
forks = 5 #并发连接数,默认为5
sudo_user = root #设置默认执行命令的用户
remote_port = 22 #指定连接被管节点的管理端口,默认为22端口,建议修改,能够更加安全
host_key_checking = False #设置是否检查SSH主机的密钥,值为True/False。关闭后第一次连接不会提示配置实例
timeout = 60 #设置SSH连接的超时时间,单位为秒
log_path = /var/log/ansible.log #指定一个存储ansible日志的文件(默认不记录日志)(五)ansuble主机清单 --inventory
Inventory文件通常用于定义要管理的主机的认证信息,例如ssh登录用户名、密码以及key相关信息。可以同时操作一个组的多台主机,组与主机组之间的关系都是通过inventory文件配置。配置文件路径为:/etc/ansible/hosts
基于密码连接
# 方法一
[webserver]
192.168.13.225 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="xiaolv@0408"
192.168.13.226 ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="xiaolv@0408"
# 方法二
[webserver]
192.168.13.22[5:6] ansible_ssh_port=22 ansible_ssh_user=root ansible_ssh_pass="xiaolv@0408"
# 方法二
[webserver]
192.168.13.22[5:6]
[webserver:vars]
ansible_ssh_pass="xiaolv@0408"
# 测试
ansible all -m ping
基于密钥连接
基于秘钥连接需要先创建公钥和私钥,并发送给被管理机器
# master执行
ssh-keygen -t rsa -P "" -f /root/.ssh/id_rsa
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.13.225
ssh-copy-id -i /root/.ssh/id_rsa.pub root@192.168.13.226(六)ansible 常用命令
ansible 命令集
/usr/bin/ansibleAnsibe AD-Hoc 临时命令执行工具,常用于临时命令的执行/usr/bin/ansible-docAnsible 模块功能查看工具/usr/bin/ansible-galaxy下载/上传优秀代码或Roles模块 的官网平台,基于网络的/usr/bin/ansible-playbookAnsible 定制自动化的任务集编排工具/usr/bin/ansible-pullAnsible远程执行命令的工具,拉取配置而非推送配置(使用较少,海量机器时使用,对运维的架构能力要求较高)/usr/bin/ansible-vaultAnsible 文件加密工具/usr/bin/ansible-consoleAnsible基于Linux Consoble界面可与用户交互的命令执行工具
其中,我们比较常用的是/usr/bin/ansible和/usr/bin/ansible-playbook。
ansible 命令
语法格式:
ansible <host-pattern> [-m module_name] [-a args]
# 范例
# 测试连接
ansible all -m ping
# 执行命令
ansible webservers -m command -a "uptime"
# 安装软件包
ansible webservers -m apt -a "name=nginx state=present" --becomeansible的host-pattern 匹配主机的列表
All :表示所有Inventory中的所有主机
ansible all -m ping
* :通配符
ansible “” -m ping # 其中代表的意思就是all,所有的IP地址
ansible 192.168.1.* -m ping # 匹配1.*的IP地址
ansible “*srvs” -m ping
或关系
ansible “websrvs:appsrvs” -m ping # 或关系,取IP地址的并集
ansible “192.168.1.10:192.168.1.20” -m ping
ansible的Host-pattern
逻辑与
ansible “websrvs:&dbsrvs” -m ping # 与关系,取IP地址的交集
在websrvs组并且在dbsrvs组中的主机
逻辑非
ansible ‘websrvs:!dbsrvs’ -m ping # 在websrvs中,取dbsrvs的反
在websrvs组,但不在dbsrvs组中的主机
注意:此处为单引号
综合逻辑
ansible ‘websrvs:dbsrvs:&appsrvs:!ftpsrvs’ -m ping
正则表达式
ansible “websrvs:&dbsrvs” -m ping
ansible “~(web|db).*.magedu.com” -m ping