基于Ansible实现批量管理

基于Ansible实现批量管理

Ansible提供一种最简单的方式用于发布、管理和编排计算机系统的工具,可在数分钟内搞定,Ansible本身是一种python程序,只需要配置一个节点,只要ssh连接ok 被控制节点不需要安装任何工具,就可以实现远程连接执行任何操作支持多节点发布、远程任务执行。

如果想熟练使用Ansible 还需了解Ansible的模块机制,下面我们来介绍ansible的日常使用,从而达到我们批量管理的目的

安装ansible

只需要将管理节点安装ansible ,被管理节点不需要安装

但如果使用yum安装的话,必须配置epel源

rpm -Uvh  http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm

rpm -import/etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-6

安装依赖关系包

yum installpython-dev python-yamlpython-paramiko python-jinja2 git

确保无误,使用yum安装absible

yum install ansible

ansbible配置文件

安装后的配置文件位于/etc/ansible

[[email protected]]# pwd

/etc/ansible

[ro[email protected]]# ll
total 20
-rw-r--r--. 1 root root 5507 May  1 17:53 ansible.cfg     #主配置文件
-rw-r--r--. 1 root root  965 Mar 15 13:07 hosts            #目标主机

目标被管理主机要定义在host中,否则只能一个一个去手写了

查看配置文件ansible.cfg常用参数:

hostfile  = /etc/ansible/hosts      #默认目标主机文件
library = /usr/share/ansible       #库文件,装载模块时候其模块装载的路径,因为ansible是模块化的工具

module_name =command              #模块的名称,意思是没有使用指定模块的时候其默认使用的模块,默认是命令,意为只执行命令

forks = 5                            #启动的子进程

remote_port  = 22                    #被管理主机的端口,默认为22,如果ssh端口有变动则需要修改此参数

sudo_user = root                      #如果以普通用户登录进行sudo那么sudo的默认账户是root

host配置文件

一般按照安全性要求,应该禁止 root 登录,禁用密码登录,一律使用证书登录。 ansible 支持通过 sudo 来执行

所有管理主机,每个被管理主机都可以使用主机名或者ip地址都可以

使用中括号可以组,紧跟着中括号下面的都是同一组内被管理的主机

[[email protected]]# grep -v "^#" hosts | grep -v "^$"
green.example.com
blue.example.com
192.168.100.1
192.168.100.10
[webservers]
alpha.example.org
beta.example.org
192.168.1.100
192.168.1.110
www[001:006].example.com           #定义组的时候还可以使用通配符
[dbservers]
db01.intranet.mydomain.net
db02.intranet.mydomain.net
10.25.1.56
10.25.1.57
db-[99:101]-node.example.com

使用absible批量管理节点

假如这个配置文件不符合我们的意向,可以cp一份作为参考模板,方便以后借鉴

[[email protected]]# cp hosts hosts.bak

这里我们定义2台被管理节点

#使用[]指定分组

[[email protected]]# grep -v ‘#‘  hosts
[hac]
10.0.10.62
10.0.10.61

10.0.10.60

要基于ssh工作,所以本地要生成一对ssh秘钥,然后让其基于秘钥认证方式来管理节点

创建秘钥

[[email protected]]# ssh-keygen -t rsa -P ‘‘

传送至被管理控节点上去

ssh-copy-id-i .ssh/id_rsa.pub [email protected]
ssh-copy-id -i .ssh/id_rsa.pub [email protected]
ssh-copy-id -i .ssh/id_rsa.pub [email protected]     #因为本地也是被监控节点之一

尝试ansible是否可用

先来man一下帮助手册

ANSIBLE(1)   System administration commands    ANSIBLE(1)

NAME
    ansible - run acommand somewhere else

SYNOPSIS   #使用格式

ansible <host-pattern> [-f forks] [-mmodule_name] [-a args]

主机模式,可以使用通配

-f forks      表示我们可以明确指明启动多少个子进程去连接这些主机默认不定义为5个forks,如果节点比较多,可以将forks参数调大

-m           指定使用的模块,每个模块都需要接受特定参数

-a           来指定使用参数

比如我们想让所有主机显示当前系统时间

[[email protected] ~]#ansible all -m command -a ‘date‘
10.0.10.61 | success | rc=0 >>
Thu May  1 18:49:18 CST 2014

10.0.10.60 | success | rc=0 >>
Mon Apr 28 22:17:58 CST 2014

10.0.10.62 | success | rc=0 >>
Thu May  1 02:49:58 CST 2014

-m command 为指定模块,默认为command,如果默认执行命令的话,可以不加这个模块,如下所示

[[email protected] ~]#ansible all -a ‘date‘
10.0.10.60 | success | rc=0 >>
Mon Apr 28 22:18:06 CST 2014

10.0.10.62 | success | rc=0 >>
Thu May  1 02:50:05 CST 2014

10.0.10.61 | success | rc=0 >>
Thu May  1 18:49:27 CST 2014

可以看到,时间不同步,但是命令是同时进行的,因为会发起N个子进程分别与每个被监控节点进行交互的

如果节点比较多,可以将forks参数调大

现在期望多个节点自动的去ntp服务器同步时间

[[email protected] ~]#ansible all -a ‘crontab -l‘
10.0.10.60 | FAILED | rc=1 >>
no crontab for root

10.0.10.62 | success | rc=0 >>
00 * * * * ntpdate time.windows.com

10.0.10.61 | FAILED | rc=1 >>
no crontab for root

可以看到只有一个节点存在,那么我们只要同步其余两台机器即可

定义单独组

[[email protected]]# cat hosts

[hac]
10.0.10.62
10.0.10.61
10.0.10.60

[crontab]
10.0.10.61
10.0.10.60

首先先来手动同步

[[email protected]]# ansible crontab -a ‘ntpdate time.windows.com‘
10.0.10.60 | success | rc=0 >>
30 Apr 18:57:02 ntpdate[2079]: step time server 65.55.56.206 offset160320.206233 sec

10.0.10.61 | success | rc=0 >>
30 Apr 18:57:02 ntpdate[3619]: step time server 65.55.56.206 offset-86361.207014 sec

将时间同步加入计划任务,我们可以使用命令追加的方式来写入计划任务

[[email protected]]# ansible crontab -a ‘echo ‘00 * * * * * ‘ >>/var/spool/cron/root‘

这样一来可以实现,但是实在是太麻烦了,为此,ansible有专门计划任务管理的模块,可以使用内置模块来实现以最简单的命令方式来轻松批量管理

定义crontab的参数有很多,可以在官方去查找帮助文档,这里不再一一介绍

明确指定crontab组,-m指定cron模块 -a指定参数

[[email protected] ansible]# ansible crontab -m cron-a ‘name="sync time from time.windows.com" minute=‘*/3‘job="/usr/sbin/ntpdate time.windows.com" ‘
10.0.10.60 | success >> {
   "changed": true,
   "jobs": [
       "sync time fromtime.windows.com"
   ]
}

10.0.10.61 | success >> {
   "changed": true,
   "jobs": [
       "sync time fromtime.windows.com"
   ]
}

[[email protected] ansible]# ansible all -a ‘crontab -l‘
10.0.10.60 | success | rc=0 >>
#Ansible: sync time from time.windows.com
*/3 * * * * /usr/sbin/ntpdate time.windows.com

10.0.10.62 | success | rc=0 >>
00 * * * * ntpdate time.windows.com

10.0.10.61 | success | rc=0 >>
#Ansible: sync time from time.windows.com
*/3 * * * * /usr/sbin/ntpdate time.windows.com

参数说明:

name=sync time from time.windows" 这是任务的名称注释会写到crontab里面去,也可以不指定,效果如下所示

[[email protected]]# crontab -l

#Ansible:sync time from time.windows.com                        #因此上面多了一个注释信息

*/3 * * * */usr/sbin/ntpdate time.windows.com

minute=‘*/3 我们这里只需要关注分钟,只需要提供分钟的定义,省去的统统默认为*

job="/usr/sbin/ntpdate time.windows.com"   此为我们定义的计划任务执行的命令

使用ansible批量安装程序

我们工作场景中,如果想安装程序的话,只要我们的yum源无问题,那么则可以完全使用yum来安装

那我们来man一下其模块

man的使用方法比较独特如果想man查看ansible模块的话必须加符号.

[[email protected]]# man ansible.yum

安装vsftpd服务

[[email protected]]# ansible crontab -m yum -a‘name=vsftpd state=present‘

state=present 状态判断其是安装还是卸载的,这里也可以使用install

[[email protected]]# ansible crontab -m yum -a‘name=vsftpd state=present‘
10.0.10.61 | success >> {
   "changed": true,
   "msg": "",
   "rc": 0,
   "results": [
       "Loaded plugins: fastestmirror,refresh-packagekit, security\nLoading mirror speeds from cached hostfile\n *base: mirror.neu.edu.cn\n * epel: ftp6.sjtu.edu.cn\n * extras: mirror.neu.edu.cn\n* updates: mirror.neu.edu.cn\nSetting up Install Process\nResolvingDependencies\n--> Running transaction check\n---> Package vsftpd.x86_640:2.2.2-11.el6_4.1 will be installed\n--> Finished DependencyResolution\n\nDependencies Resolved\n\n================================================================================\nPackage        Arch           Version                   Repository    Size\n================================================================================\nInstalling:\nvsftpd         x86_64         2.2.2-11.el6_4.1          base          151 k\n\nTransactionSummary\n================================================================================\nInstall      1 Package(s)\n\nTotal download size: 151 k\nInstalled size: 331 k\nDownloadingPackages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction TestSucceeded\nRunning Transaction\n\r  Installing :vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\r  Verifying  : vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\nInstalled:\n  vsftpd.x86_64 0:2.2.2-11.el6_4.1                                             \n\nComplete!\n"
   ]
}
10.0.10.60 | success >> {
   "changed": true,
   "msg": "",
   "rc": 0,
   "results": [
       "Loaded plugins: fastestmirror,security\nLoading mirror speeds from cached hostfile\n * base:mirrors.btte.net\n * extras: mirrors.btte.net\n * updates:mirrors.btte.net\nSetting up Install Process\nResolving Dependencies\n-->Running transaction check\n---> Package vsftpd.x86_64 0:2.2.2-11.el6_4.1will be installed\n--> Finished Dependency Resolution\n\nDependenciesResolved\n\n================================================================================\nPackage        Arch            Version                   Repository    Size\n================================================================================\nInstalling:\nvsftpd         x86_64         2.2.2-11.el6_4.1          base          151 k\n\nTransactionSummary\n================================================================================\nInstall      1 Package(s)\n\nTotal download size: 151 k\nInstalled size: 331 k\nDownloadingPackages:\nRunning rpm_check_debug\nRunning Transaction Test\nTransaction TestSucceeded\nRunning Transaction\n\r  Installing :vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\r  Verifying  :vsftpd-2.2.2-11.el6_4.1.x86_64                              1/1 \n\nInstalled:\n  vsftpd.x86_640:2.2.2-11.el6_4.1                                             \n\nComplete!\n"
   ]
}

对于ansible来讲的话,很难生成yum配置文件,但可以使用wget将其批量下载

#可以看到只有定义个没用装,因为本来就没有安装。。

[[email protected]]# ansible all -a ‘rpm -q vsftpd‘
10.0.10.62 | FAILED | rc=1 >>
package vsftpd is not installed

10.0.10.60 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64

10.0.10.61 | success | rc=0 >>
vsftpd-2.2.2-11.el6_4.1.x86_64

使其服务批量启动

[[email protected]]# ansible crontab -a ‘/etc/init.d/vsftpd start‘
10.0.10.60 | success | rc=0 >>
Starting vsftpd for vsftpd: [  OK  ]

10.0.10.61 | success | rc=0 >>
Starting vsftpd for vsftpd: [  OK  ]

再查看端口是否被监听

[[email protected]]# ansible crontab -a ‘netstat -lnt ‘ | grep 21
tcp        0      00.0.0.0:21                 0.0.0.0:*                  LISTEN    
tcp        0      00.0.0.0:21                 0.0.0.0:*                  LISTEN

以上,为absible的简单配置与使用,谢谢大家。

基于Ansible实现批量管理,布布扣,bubuko.com

时间: 05-02

基于Ansible实现批量管理的相关文章

Linux 运维工作中的经典应用ansible(批量管理)

一 Ansible自动化运维工具 Python 在运维工作中的经典应用 ansible(批量管理操作) 1.安装ansible(需要bese epel 2种源) wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo curl -o /etc/yum.repos.d/CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo yum

ansible模块批量管理

1.[copy]模块 ansible oldboy-m copy -a "src=/etc/hosts dest=/opt/" 加上backup=yes对客户端的文件进行备份 ansible oldboy -m copy -a "src=/etc/hostsdest=/opt/ backup=yes" 2.Shell模块 用之前需要将脚本先推送到客户端才能执行 1)推送 ansible oldboy-m copy -a "src=/server/scrip

免密码交互方式+ansible批量管理服务介绍

介绍了ssh服务 1) 远程连接加密传输数据协议,实现远程连接登录,默认端口222)ssh远程连接原理依赖于锁头(公钥)和钥匙(私钥),实现远程加密连接3)ssh基于秘钥远程登录原理a 管理服务器创建秘钥対,将公钥传输发送给给管理端b 管理端请求与被管理端建立连接c 被管理向管理端发送公钥质询d 管理端处理质询信息,实现管理与被管理端免密码交互4)基于ssh协议相关命令ssh scp sftp netstat -lntup |egrep sshd 查看ssh端口 1.1 部署ssh+key (免

Linux中ansible批量管理软件部署及剧本编写

服务器版本信息: Centos6.9 [[email protected] ~]# uname -a Linux db02 2.6.32-696.el6.x86_64 #1 SMP Tue Mar 21 19:29:05 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux ansible软件介绍 ansible是一个基于Python开发的自动化运维工具! 其功能实现基于SSH远程连接服务! ansible可以实现批量系统配置.批量软件部署.批量文件拷贝.批量运行命令等

ansible批量管理服务详解

在开始之前我们先试想一个场景,你的公司有成百上千台的服务器,这时候领导要求在所有服务器上都添加一个定时任务,或者是执行某个命令,你可能会说用xshell一个一个去连或者是编写一个shell脚本,但是如果过你经历过类似的事情,你一定可以体会到其中的痛苦,因为这么多服务器你用xshell去连的话工作量将变得特别大,但如果你是选择写一个脚本的话也会特别的麻烦,因为每执行一个不同的东西你就要去修改脚本的类容,而且批量脚本一般采用循环的方式去执行一些任务,如果节点太多的话,执行的效率会变得比较低,而批量管

ansible批量管理常见的配置方法

第7章 ansible的管理????103 7.1 ansible概念的介绍????103 7.1.1 ansible的概念????104 7.1.2 ansible使用的一些意义????104 7.1.3 ansible拥有哪些服务????104 7.1.4 ansible服务的一些特点????104 7.2 ansible部署过程????104 7.2.1 服务的安装????104 7.2.2 服务版本的检查????105 7.3 ansible的主机清单讲解????105 7.3.1 根据

ansible批量管理远程服务器

使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器:  2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问:  比如在.bashrc中定义$app_path=/opt/app/bin 最终选择ansible,使用这个自动化运维工具可以满足我的需求:  下面介绍下对于我这种场景需要使用的ansible的主要模块:  关于ansible是什么以及安装配置请自行

使用ansible批量管理远程服务器

使用ansible批量管理远程服务器 背景 本地需要管理远程的一批服务器,主要执行以下任务: 1) 将本地的文件复制到远端所有服务器: 2) 需要在远程服务器中执行一个个命令: 远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问: 比如在.bashrc中定义$app_path=/opt/app/bin 最终选择ansible,使用这个自动化运维工具可以满足我的需求: 下面介绍下对于我这种场景需要使用的ansible的主要模块: 关于ansible是什么以及安装配置请自行百度:

基于ansible role实现LAMP平台批量部署

前言 作为运维人员,当面对几十台或上百台服务器需要修改某个参数或部署某个平台,你将从何入手呢?ansible的出现很好的解决了这一困扰,ansible基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能.本文带来的是基于Ansible Role实现LAMP平台批量部署. ansible简介 特性 No agents:不需要在被管控主机上安装任意客户端 No server:无服务器端