应用场景假设:
BOSS:运维帮忙把所有的服务器tomcat 重启一下,谢谢!(tomcat 服务有2K台)
运维:…………
运维: 啪啪啪啪啪啪啪啪..........(键盘的声音响彻办公室)
BOSS:重启好了么?
运维: 稍等下,再过一个一个小时就好了……
当遇到上述需求时,靠人工一台一台操作显然是不可能的,如果你真的这么做了,那过不了试用期,就已经开除了。所以这时候批量管理工具的重要性就体现出来了。
------------------------------------------------------------------------------------------------------------------------
Ansible 是一款信任式批量管理工具。当Ansible 服务配置好信任后(如 用户名密码认证、秘钥等): 可在Ansible 服务主机上同时操作所有配置好的所有节点。Ansible 与其他两种管理工具比较的话最明显的特点就是,没有master和agent ,支持ssh 。Ansible 是由python开发的。管理功能虽不及puppet ,效率虽不及saltstack ,但简单、安全、不遗漏是最大特点。
相似的批量管理工具常见的有如下几种:
1. Puppet
2. Saltstack
其他两款简介:
Puppet: 体量相对比较大,是一堆模块的合集,配置管理方面很强悍,但单独执行简单命令时显很复杂,需要写配置文件,感觉太啰嗦。
Saltstack:和ansible 几乎没有太大差别,都是有python开发,但Saltstack 需要在节点上安装agent 并配置。Saltstack 执行指令时依赖agent 返回,当agent 未响应时可能执行漏掉某些主机,这点是个坑。Slatstack 执行效率高于Ansible
一、配置epel源
wget –O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-6.repo
二、安装ansible 依赖环境
yum install gcc python-devel python-pip -y
三、安装ansible
yum install ansible -y
验证安装是否成功:
ansible –version
应用场景:
有如下4台主机:
cpy01.dev.xjh.com
cpy02.dev.xjh.com
cpy03.dev.xjh.com
cpy04.dev.xjh.com
cpy01 供开发环境使用,密码为:passwddev
cpy02 供测试环境使用,密码为:passwdpre
cpy03 cpy04 供生产环境使用,密码为:passwdprd
把开发环境和测试环境分到test组,生产环境分到public组;最后将所有主机放在一个ALL组中。
要求对各个分组都能做到统一执行指令
------------------------------------------------------------------------------------------------------------------------
下文将介绍密码和秘钥两种方式对上述场景进行权限认证
公共配置(不管哪种方式需配置如下内容):
vim /etc/ansible/ansible.cfg inventory = /etc/ansible/hosts #指定主机组的配置文件位置 host_key_checking = False #关闭主机认证检查,不关闭这个会导致密码变更后, #原远程信息保存在known_hosts 中的信息改变,提示认证错误。 #需要清除know_hosts 文件的该条访问信息后才能远程。
一、用户名密码认证:
1.1 修改主机组配置文件如下(分组使用"[]",组名使用x_x或x-x ):
vim /etc/ansible/hosts [dev-hosts] cpy01.dev.xjh.com [pre-hosts] cpy02.dev.xjh.com [prd-hosts] cpy03.dev.xjh.com cpy04.dev.xjh.com #还可以写成这种方式 cpy[03:04].dev.xjh.com [test:children] dev-hosts pre-hosts [public:children] prd-hosts [all:children] test public
1.2 配置用户名密码(一般配置ssh端口、ssh用户名、ssh密码三项):
在分组目录中创建用户名密码认证文件,按自己所需要的分组进行配置,认证文件名要和分组名一致,这里我们按最小分组来做(最小分组有个好处是,大分组包含了小分组,所以密码认证是可行的。但如果按大分组来,若小分组中密码不一致则使用小分组名执行指令部分密码认证不一致的会失效)
vim /etc/ansible/group_vars/dev-hosts ansible_ssh_port: 22 //分组主机远程端口 ansible_ssh_user: root //分组主机用户名 ansible_ssh_pass: passwddev //分组主机密码 vim /etc/ansible/group_vars/pre-hosts ansible_ssh_port: 22 ansible_ssh_user: root ansible_ssh_pass: passwdpre vim /etc/ansible/group_vars/prd-hosts ansible_ssh_port: 22 ansible_ssh_user: root ansible_ssh_pass: passwdprd
1.3 测试权限配置是否正确:
测试命令:
ansible –m ping <group_name>
二、 秘钥认证:
2.1 四台服务器全开启秘钥认证服务
vim /etc/ssh/sshd_config #将如下内容取消注释
RSAAuthentication yes PubkeyAuthentication yes AuthorizedKeysFile .ssh/authorized_keys
2.2 生成三组秘钥(秘钥默认声称在/root/.ssh/目录中):
ssh-keygen –t rsa –f dev_rsa ssh-keygen –t rsa –f pre_rsa ssh-keygen –t rsa -f prd_rsa
2.3 将对应的公钥(.pub 结尾的文件)内容,拷贝到对应组服务器/root/.ssh/authorized_keys 中,每行代表一个公钥认证(没有该文件使用ssh-keygen –t rsa 生成一个,然后将rsa文件删除,创建authorized_keys文件)。
2.4 将所有的私钥文件(dev_rsa|pre_rsa|prd_rsa) 拷贝到ansible服务器的/root/.ssh/ 目录中
2.5 在ansible /root/.ssh/目录下 创建config文件并写入以下内容:
touch /root/.ssh/config vim /root/.ssh/config Host cpy01.dev.xjh.com User root IdentityFile /root/.ssh/dev_rsa Host cpy02.dev.xjh.com User root IdentityFile /root/.ssh/pre_rsa Host cpy03.dev.xjh.com User root IdentityFile /root/.ssh/prd_rsa Host cpy04.dev.xjh.com User root IdentityFile /root/.ssh/pre_rsa
2.6 重启sshd 服务:
service sshd restart
测试命令:
ansible –m ping <group_name>
Ansible 有两种模式,一种ad-hoc,另一种为playbook
ad-hoc: 适用于临时命令,简单的任务执行
playbook:适用于复杂场景,任务编排比较复杂的场景
一、 command | shell 模块
该模块为:执行命令模块 (由于命令模块较为强大,可根据自身对操作系统的熟练程度而增加。所以这里不再介绍类似可以实现同功能模块,比如service模块,需要重启某服务的操作使用命令行也可以完成,这里以能快速上手且上手后可以开始工作为前提)
命令:ansible -m command -a '<命令行>' <ansible 分组名> 或 ansible -m shell-a '<命令行>' <ansible 分组名>
如:
二、copy 模块
该模块作用为:从ansible 主机指定文件远程拷贝到节点主机上指定目录
命令:ansible -m copy -a 'src=<ansible 主机文件路径> dest=<节点主机目录路径>' <ansible 分组名>
如:
三、fetch 模块
该模块为:从节点主机指定文件 远程拷贝到 ansible 主机指定目录(拷贝过来的是带主机名的目录树)
命令:ansible -fetch -a 'src=<节点主机文件路径> dest=<ansible 主机目录路径>' <ansible 分组名>
如:
四、 script 模块
该命令为:使用ansible 主机脚本远程在节点主机上执行(其执行原理是,先copy到远程主机,执行完成后再删除脚本)
命令:ansible -m shell -a '<脚本路径>' <ansible 分组名>
如:
1. 先写一个简单的脚本,脚本执行写入文件操作,保存在/root/writefile.py
#!/usr/bin/env python # -*-coding: utf-8 -*- import sys reload(sys) sys.setdefaultencoding('utf-8') class ResultFile(object): def __init__(self): self.outfile = '/tmp/test.txt' def writefile(self): with open(self.outfile,'w') as fs: fs.write('hello,word!') if __name__=='__main__': start = ResultFile() start.writefile()
五、 user 模块
该命令是对节点主机用户进行处理
命令: ansible -m user -a 'name=<username>groups=<grouname> state=<present|absent>' <ansible 分组名>
如:
1. 增加一个新用户
2. 删除一个用户
六、 group 模块
该命令是对节点主机用户组 进行处理
命令: ansible -m group -a 'name=<groupname> gid=<gidnumber> state=<present|absent>' <ansible 分组名>
如:
1. 增加一个新组
2. 删除一个组
七、 file 模块
该命令是对节点主机文件做处理
命令: ansible -m file -a 'dest=<文件路径> group=<组名> owner=<用户名> mode=<权限>' <ansible 分组名>
如:
八、cron 模块
该命令可以对节点主机添加crontab定时任务
命令: ansible -m cron -a 'name="<计划任务的注释信息>" minute=<分> hour=<时> day=<日> month=<月> weekday=<周> user=<执行任务用户名> job="<任务命令>"' <ansible 分组名>
如:
九、setup 模块
该模块可以获取主机系统信息
命令: ansible -m setup <ansible 分组名> #获取所有主机信息
ansible -m setup -a "filter=<key>"<ansible 分组名> #过滤自己筛选后的主机信息