前言
相较于使用playbook,个人更习惯于编写shell脚本。如果需要多台服务器执行某一任务,可以将脚本放在某个http服务目录下,比如nginx,然后通过ansible的shell模块让服务器通过wget执行远程脚本。
本文以 ansible + nginx + shell脚本为例。
IP | 服务 | 说明 |
192.168.0.20 | nginx | 提供http服务 |
192.168.0.20 | ansible | ansible控制节点 |
192.168.0.21 | 目标主机 |
nginx配置
nginx的配置比较简单,大致如下,根据自身所需修改配置。
server { listen 80; server_name 192.168.0.20; charset utf-8; location /res { alias /home/res; autoindex on; autoindex_format html; autoindex_exact_size off; autoindex_localtime on; } }
shell脚本
在/home/res
目录下随便写个shell脚本。为了避免有些服务器的bash路径不是/bin/bash
,这里通过环境变量引用bash解释器。
#!/usr/bin/env bash df -h
- 测试
# q后面是大写字母O, 不是数字0 sh -c "$(wget http://192.168.0.20/res/test.sh -qO -)"
正常情况下会输出当前服务器的分区存储情况。
ansible调用
ansible all -m shell -a 'sh -c "$(wget http://192.168.0.20/res/test.sh -qO -)"'
其它
- 如果没有nginx,也可以用python的标准库临时创建一个http服务,毕竟绝大部分linux发行版都内置python。比如:
# 在脚本文件所在目录创建http服务, 指定12345端口 # 如果使用python 2, 命令为 python -m SimpleHTTPServer 12345 python3 -m http.server 12345 ansible all -m shell -a 'sh -c "$(wget http://192.168.0.20:12345/test.sh -qO -)"'
- 才发现ansible还有个执行脚本的script模块,主要作用就是把管理节点的脚本分发到被管理节点然后执行。具体帮助文档可见
ansible-doc script
。示例如下:
# /tmp/test.sh 是管理节点上的shell脚本 ansible all -m script -a '/tmp/test.sh'