官方定义:"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
如果安装不成功,提示 No package ansible available,可能需要安装前置依赖包epel-release
yum install -y epel-release
并且不能一起写,否则也还会触发这个问题 ,比如如下写法:
yum install -y epel-release 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
如果要一劳永逸的配置多台,可以用如下格式
192.168.1.[1:100]
其他参数如以下列表:
ansible_ssh_host 将要连接的远程主机名.与你想要设定的主机的别名不同的话,可通过此变量设置 ansible_ssh_port ssh端口号.如果不是默认的端口号,通过此变量设置. ansible_ssh_user 默认的 ssh 用户名 ansible_ssh_pass ssh 密码(这种方式并不安全,我们强烈建议使用 --ask-pass 或 SSH 密钥) ansible_sudo_pass sudo 密码(这种方式并不安全,我们强烈建议使用 --ask-sudo-pass) ansible_sudo_exe (new in version 1.8) sudo 命令路径(适用于1.8及以上版本) ansible_connection 与主机的连接类型.比如:local, ssh 或者 paramiko. Ansible 1.2 以前默认使用 paramiko.1.2 以后默认使用 'smart','smart' 方式会根据是否支持 ControlPersist, 来判断'ssh' 方式是否可行. ansible_ssh_private_key_file ssh 使用的私钥文件.适用于有多个密钥,而你不想使用 SSH 代理的情况. ansible_shell_type 目标系统的shell类型.默认情况下,命令的执行使用 'sh' 语法,可设置为 'csh' 或 'fish'. ansible_python_interpreter 目标主机的 python 路径.适用于的情况: 系统中有多个 Python, 或者命令路径不是"/usr/bin/python",比如 \*BSD, 或者 /usr/bin/python 不是 2.X 版本的 Python.我们不使用 "/usr/bin/env" 机制,因为这要求远程用户的路径设置正确,且要求 "python" 可执行程序名不可为 python以外的名字(实际有可能名为python26). ansible_ruby_interpreter 与 ansible_python_interpreter 的工作方式相同,可设定如 ruby 或 perl 的路径
让我们来远程执行下指令:
[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 root@106.53.236.198
会让你输入密码,添加认证信息后,目标节点主机的~/.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
DOCKERFILE里添加ansible
RUN yum makecache && yum install -y ansible && yum update -y; yum clean all ADD ./devops/hosts /etc/ansible/ RUN sed -i 's/^#pipelining.*/pipelining = True/g' /etc/ansible/ansible.cfg RUN sed -i 's/^#host_key_checking.*/host_key_checking = False/g' /etc/ansible/ansible.cfg
参考文献: