阿里云-云小站(无限量代金券发放中)
【腾讯云】云服务器、云数据库、COS、CDN、短信等热卖云产品特惠抢购

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

175次阅读
没有评论

共计 2970 个字符,预计需要花费 8 分钟才能阅读完成。

背景

本地需要管理远程的一批服务器,主要执行以下任务:

1)将本地的文件复制到远端所有服务器;
2)需要在远程服务器中执行一个个命令;

远端服务器路径并非完全一致,一般访问通过环境变量中定义的变量路径访问;
比如在.bashrc 中定义 $app_path=/opt/app/bin

最终选择 ansible,使用这个自动化运维工具可以满足我的需求;
下面介绍下对于我这种场景需要使用的 ansible 的主要模块;
关于 ansible 是什么以及安装配置请自行百度;

复制

copy 模块

使用 copy 模块,可以将本地文件一键复制到远程服务器;
- a 后跟上参数,参数中指定本地文件和远端路径;

ansible myservers -m copy -a "src=/opt/app/bin/transfer.tar dest=~/"

ansible 通过 ssh 登录到远程服务器后,并不执行.bash_profile 来设置用户自定义的环境变量;如果我们需要管理的目标服务器的路径不同,就不能直接写绝对路径,也不能写变量替换的路径;

比如:针对服务器 A 的目标复制路径为 /opt/app/user1/bin , 服务器 B 的目标复制路径为 /opt/app/user2/bin; 这两个路径在各自的服务器中的路径变量都设置为 $bin; 但在 copy 模块中,我们不能直接使用 dest = $bin/;
路径设置一般放在.bashrc /.bash_profile 文件,但 ansible 模块登录后并不加载这两个文件;

解决方法:
针对这种情况,可以将 dest 路径设置为~/,都复制到用户目录,后续再通过远程脚本处理;

远程批量命令

需要在远程执行一个个命令来管理远程服务器;

远程执行命令的模块有 command、shell、scripts、以及 raw 模块;

command 模块

command 模块为 ansible 默认模块,不指定 - m 参数时,使用的就是 command 模块;
comand 模块比较简单,常见的命令都可以使用,但其命令的执行不是通过 shell 执行的,所以,像这些 “<“, “>”, “|”, and “&” 操作都不可以,当然,也就不支持管道;
示例:显示远程路径:

ansible myservers  -a 'pwd'
10.6.143.38 | success | rc=0 >>
/home/rduser
10.6.143.53 | success | rc=0 >>
/home/rduser
10.6.143.37 | success | rc=0 >>
/home/rduser

缺点:不支持管道,就没法批量执行命令;

shell 模块

使用 shell 模块,在远程命令通过 /bin/sh 来执行;所以,我们在终端输入的各种命令方式,都可以使用;
但是我们自己定义在.bashrc/.bash_profile 中的环境变量 shell 模块由于没有加载,所以无法识别;如果需要使用自定义的环境变量,就需要在最开始,执行加载自定义脚本的语句;

对 shell 模块的使用可以分成两块:
1) 如果待执行的语句少,可以直接写在一句话中:

ansible myservers  -a ". .bash_profile;ps -fe |grep sa_q" -m shell

2) 如果在远程待执行的语句比较多,可写成一个脚本,通过 copy 模块传到远端,然后再执行;但这样就又涉及到两次 ansible 调用;对于这种需求,ansible 已经为我们考虑到了,script 模块就是干这事的;

scripts 模块

使用 scripts 模块可以在本地写一个脚本,在远程服务器上执行:

ansible myservers  -m script -a "/opt/app/target.sh"

这里是命令模块的官方文档:
http://docs.ansible.com/list_of_commands_modules.html

批量执行 playbooks

远程批量命令执行的另外一种方式是用 playbooks;
这里是 playbooks 的官方文档:http://docs.ansible.com/playbooks.html
这里有 ansible 的 playbooks 示例:https://github.com/ansible/ansible-examples

在 Python 中使用 ansbile API

以上执行 ansible 模块的方式都是在命令行中直接调用,如果对返回结果需要进一步处理,可以在程序中通过 API 调用的方式来使用 ansible 模块:
比如,以上在命令行中调用 scripts 的模块的方式在 API 中调用:

import ansible.runner
results = ansible.runner.Runner(
pattern='myservers', forks=5,
module_name='script', module_args='/opt/app/target.sh',
).run()

这里是官方给出的一个详细示例,直接运行一次,将 result 全部打印出来,会有直观的了解:

#!/usr/bin/python

import ansible.runner
import sys

# construct the ansible runner and execute on all hosts
results = ansible.runner.Runner(
pattern='*', forks=10,
module_name='command', module_args='/usr/bin/uptime',
).run()

if results is None:
   print "No hosts found"
   sys.exit(1)

print "UP ***********"
for (hostname, result) in results['contacted'].items():
if not 'failed' in result:
print "%s >>> %s" % (hostname, result['stdout'])

print "FAILED *******"
for (hostname, result) in results['contacted'].items():
if 'failed' in result:
print "%s >>> %s" % (hostname, result['msg'])

print "DOWN *********"
for (hostname, result) in results['dark'].items():
print "%s >>> %s" % (hostname, result)

API 设计详见:http://docs.ansible.com/developing_api.html

Ansible 和 Docker 的作用和用法  http://www.linuxidc.com/Linux/2014-11/109783.htm

Ansible 批量搭建 LAMP 环境 http://www.linuxidc.com/Linux/2014-10/108264.htm

Ansible:一个配置管理和 IT 自动化工具  http://www.linuxidc.com/Linux/2014-11/109365.htm

Ansible 的详细介绍 :请点这里
Ansible 的下载地址 :请点这里

本文永久更新链接地址 :http://www.linuxidc.com/Linux/2015-05/118080.htm

正文完
星哥说事-微信公众号
post-qrcode
 0
星锅
版权声明:本站原创文章,由 星锅 于2022-01-20发表,共计2970字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
【腾讯云】推广者专属福利,新客户无门槛领取总价值高达2860元代金券,每种代金券限量500张,先到先得。
阿里云-最新活动爆款每日限量供应
评论(没有评论)
验证码
【腾讯云】云服务器、云数据库、COS、CDN、短信等云产品特惠热卖中