官方定义:"Ansible is Simple IT Automation"——简单的自动化IT工具
Ansible 为运维自动化工具,一种集成 IT 系统的配置管理、应用部署、执行特定任务的开源平台,是 AnsibleWorks 公司名下的项目,该公司由 Cobbler 及 Func 的作者于 2012 年创建成立。
Ansible 基于 Python 语言实现,由 Paramiko 和 PyYAML 两个关键模块构建。
Ansible 特点:
部署简单,只需在主控端部署 Ansible 环境,被控端无需做任何操作。
默认使用 SSH(Secure Shell)协议对设备进行管理。
主从集中化管理。
配置简单、功能强大、扩展性强。
支持 API 及自定义模块,可通过 Python 轻松扩展。
通过 Playbooks 来定制强大的配置、状态管理。
对云计算平台、大数据都有很好的支持。
提供一个功能强大、操作性强的 Web 管理界面和 REST API 接口 —- AWX 平台。
Ansible 与 SaltStack:
最大的区别是 Ansible 无需在被监控主机部署任何客户端代理,默认通过 SSH 通道进行远程命令执行或下发配置。
相同点是都具备功能强大、灵活的系统管理、状态配置,都使用 YAML 格式来描述配置,两者都提供丰富的模板及 API,对云计算平台、大数据都有很好的支持。
如何安装
yum install -y ansible
如何配置minion
vi /etc/ansible/hosts
[gameservers]
106.53.236.78 ansible_ssh_user=root ansible_ssh_port=3737
[backendservers]
106.53.236.198 ansible_ssh_user=root ansible_ssh_port=3737
让我们来远程执行下指令:
[root@VM_0_11_centos script]# ansible 106.53.236.195 -m shell -a "df -h"
106.53.236.198 | UNREACHABLE! => {
"changed": false,
"msg": "Failed to connect to the host via ssh: Permission denied (publickey,gssapi-keyex,gssapi-with-mic,password).",
"unreachable": true
}
原因分析:没有在ansible管理节点(即安装ansible的节点)上添加目标节点(即需要管理的节点)的ssh认证信息。
解决步骤:
1:管理节点生成SSH-KEY
ssh-keygen
成功后在~/.ssh/路径下将生成ssh密钥文件:id_rsa及id_rsa.pub
2:添加目标节点的SSH认证信息
cd ~/.ssh/
[root@VM_0_11_centos .ssh]# ls
id_rsa id_rsa.pub
ssh-copy-id "-p 3737 [email protected]"
会让你输入密码,添加认证信息后,目标节点主机的~/.ssh/目录下将会出现一个authorized_keys文件,里面包含了ansible管理节点的公钥信息,可以检查一下是否存在。
3:在确定目标主机的SSH认证信息都已正确添加且目标主机的~/.ssh/目录都存在管理节点的公钥信息后,再执行之前出错的ansible指令,有效:
[root@VM_0_11_centos .ssh]# ansible 106.53.236.198 -m shell -a "df -h"
106.53.236.198 | SUCCESS | rc=0 >>
Filesystem Size Used Avail Use% Mounted on
/dev/vda1 50G 3.7G 44G 8% /
/dev/vdb 50G 462M 47G 1% /data
Ansible远程执行命令
指令指令格式
ansible [主机组] -m [模块方法] -a [指令]
ansible 106.53.236.198 -m command -a 'w' #对单个IP
ansible gameservers -m shell -a "df -h" #对服务器组
ansible 106.53.236.198 -m shell -a "df -h"
ansible all -m ping #对所有minion
Ansible远程执行脚本
ansible gameservers -m shell -a "cd /data/server/logger/;sh start.sh"
Ansible拷贝文件或者目录
对主机组拷贝文件,目标中的文件不存在时就会创建,存在时就会覆盖原来的内容,写入新的内容
ansible gameservers -m copy -a "src=/data/server/data/version.properties dest=/data/server/data owner=root group=root mode=0755"
ansible gameservers -m copy -a "src=/data/server/data/version.properties dest=/data/server/data"
ansible gameservers -m copy -a "src=/data/server/router/lib/game-common.jar dest=/data/server/router/lib"
复制目录,定义所属组,当data不存在时就会创建,并把data传入到/data/server/下
ansible gameservers -m copy -a "src=/data/server/data/ dest=/data/server/data/"
进阶篇
ansible默认是同步阻塞模式,它会等待所有的机器都执行完毕才会在前台返回。可以采取异步执行模式。
如何提速?
vi /etc/ansible/ansible.cfg
pipelining=False
SSH pipelining 是一个加速 Ansible 执行速度的简单方法。ssh pipelining 默认是关闭,修改为 pipelining=True
参考文献:
saltstack与ansible对比
Ansible系列(七):执行过程分析、异步模式和速度优化