[ansible]wget批量调用shell脚本

前言

相较于使用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'
posted @ 2022-08-30 16:44  花酒锄作田  阅读(861)  评论(0编辑  收藏  举报