前言
学习和使用任何语言、工具都是服务于具体的目标的。目标驱动和即时反馈往往能让你效率提升,积极性被调动,掌握知识点也会更加牢靠。笔者学习和使用ansible的初衷是:使用ansible通过一台中控的linux机器,管理N台其他Linux主机,能够做到批量文件分发、批量修改配置文件、批量启动软件服务,从而合理”偷懒“
ps:手动一台一台撸过去会让人崩溃的,也是不聪明的做法,笔者在公司用java写了一套dup(deploy update platform)工具,用于批量部署软件,跟ansible的作用类似
基础概念
ansible究竟是什么?能做什么呢?它是一个自动化运维工具,能批量配置、管理,避免做一些重复的体力劳动。
比如:给N台主机安装jdk、拷贝文件到N台主机或者其他重复性工作。
当然,对于简单的任务,我们写点脚本也可以满足需求,但是ansible具有"幂等性",保证重复执行某个任务,得到相同的结果,即它会判断是否已经是正确完成的状态,不过已经完成,不执行操作。
当然,对于运维工具熟悉的同学可能还用过puppet、saltstack、chef等,它们要么是需要安装agent到目标主机,要么用Ruby语言等,ansible用python语言开发,采用ssh协议实现主机间通讯,不用安装agent,配置文件用YAML,任意一台主机都能当中控机(去中心化)。总体来说,简单易用,ansible还有一些特性:点对点(ad-hoc)、清单(inventory)、剧本(playbook)、模式(patterns)、模块(modules)、插件(plugins),这些后面会逐步介绍。
基础配置
首先是安装ansible环境,官方文档介绍的非常详细,ansible官方地址 包含了安装前置条件、python版本、ansible版本选择,apt安装/yum安装/pip安装等,由于大家安装环境的差异不展开讲,如果这一步环境都不能自己搞定,后面也不用看了,毕竟聪明的人才适合玩转ansible。
笔者的演示环境均为centos7.6的主机:
- 172.16.101.25 (中控机)
- 172.16.101.250 (受控主机1)
- 172.16.101.251 (受控主机2)
- 172.16.101.34 (受控主机3)
- 172.16.101.4 (受控主机4)
采用yum安装,先配置好阿里的镜像源
# cd /etc/yum.repos.d/
# cat aliBase.repo
[aliBase]
name=aliBase
baseurl=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/
enabled=1
gpgcheck=1
gpgkey=https://mirrors.aliyun.com/centos/$releasever/os/$basearch/RPM-GPG-KEY-CentOS-$releasever
# cat aliEpel.repo
name=aliEpel
baseurl=https://mirrors.aliyun.com/epel/$releaseverServer/$basearch/
enabled=1
gpgcheck=0
配置完毕repo后,直接yum安装ansible
yum install ansible
此时安装好的ansible是version 2.4.2.0
此时输入ansible,能正常提示表示安装好了。
此时安装的目录为/etc/ansible,这个目录下有ansible.cfg(配置文件)、hosts(受控主机清单)、roles(角色定义)
基本用法
下面根据ansible命令提示尝试一个内置的ping命令,m表示module模块:
ansible 172.16.101.4 -m ping
发现结果是:
想想看,对于中控机172.16.101.25而言,172.16.101.4并不认识,你想控制它,并不被允许,所以需要把172.16.101.4加入受控主机清单(inventory),即/etc/ansible/hosts文件中,hosts文件末尾添加了这个ip后,执行同样的命令,发现连接被拒绝:
这也很容易理解,你并没有172.16.101.4的用户名/密码,或者验证身份的秘钥,它不可能让你控制它,所以在hosts中加入用户名、密码、端口
172.16.101.4 ansible_port=22 ansible_user=root ansible_ssh_pass=123@abc.com
- ansible_port 端口
- ansible_user 用户名
- ansible_ssh_pass 密码
再次执行ping命令返回结果:
这样就表示能连接172.16.101.4这台主机了
能够通讯后,我们开始执行一些特定的命令做测试,例如在这台主机上新建一个文件夹,命令:
ansible 172.16.101.4 -m command -a 'mkdir /root/test'
返回结果:
当然,上述只是管理了一台主机,对于多台,我们需要在hosts文件中加入更多的主机即可,而且还有其他的一些配置方法:
上述第二行给172.16.101.251取了一个别名251,这样就能用别名来管理主机:
ansible host251 -m ping
上图第三行的172.16.101.34因为配置了ssh秘钥认证,所以不用配置用户名密码,端口为默认的22,所以也不用配置了。如果想了解ssh秘钥认证,可以参考我之前的文章ssh的秘钥认证做配置即可(ansible官方推荐用ssh秘钥认证)
最后看看ping多台主机的情况:
ansible all -m ping
返回结果:
表示我们可以连接到所有的受控主机了。
了解了ansible的安装、配置和最基础用法,后面我们会继续研究它的其他用法。