Ansible实战:如何正确选择 command 和shell模块?
在使用Ansible进行自动化运维时,command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似,但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率,还能帮助我们规避一些潜在的风险。在这篇文章中,我们将深入探讨 command和shell模块之间的差异,并通过一些高级案例来展示如何恰当地选择和使用它们。

两者模块的区别
| 特性 | commad模块 | shell模块 |
|---|---|---|
| 解析方式 | 不使用shell解析 | 使用完整的shell 解析 |
| 支持特性 | 不支持管道 | 重定向、管道等shell 功能 |
| 安全性 | 更安全,防止命令注入 | 存在命令注入风险,需要严格验证输入 |
| 适用场景 | 执行简单命令,如ls、mkdir等 | 执行复杂命令或需要shell功能的场景 |
常见场景及模块选择
执行简单命令
适合场景:执行单一命令,无需复杂的shell功能。
推荐模块:command
示例:在远程主机上创建目录
ansible -m node2 command -a 'mkdir -p /tmp/node1'
以下述命令是通过ad-hoc方式创建,简单的命令用这种方式很方便。执行成功如所示:
root@ansible:~# ansible node2 -m command -a 'mkdir -p /tmp/node2'
192.168.31.102 | CHANGED | rc=0 >>
root@ansible:~# ansible node2 -m command -a 'ls /tmp'
192.168.31.102 | CHANGED | rc=0 >>
....
node2
.....
以下方式通过剧本方式创建:
---
- name: 使用command模块创建目录hosts: node2gather_facts: yestasks:- name: 使用command模块创建目录command: mkdir -p /tmp/mydir
通过ansible-playbook执行成功,输出如下图所示:

使用管道或重定向
适合场景:需要使用shell特性(如管道、重定向)处理复杂逻辑。
推荐模块:shell
示例:统计日志文件中包含 error 的行数
root@ansible:~/test# ansible node2 -m shell -a 'grep 'error' /var/log/dmesg | wc -l'
192.168.31.102 | CHANGED | rc=0 >>
0
---
- name: 使用shell模块统计日志中的错误行数hosts: node2tasks:- name: 使用shell模块统计日志中的错误行数shell: grep 'error' /var/log/messages | wc -lregister: error_count- name: 打印错误行数ansible.builtin.debug:msg: "日志中包含的错误行数为:{{ error_count.stdout }}"
通过ansible-playbook执行成功,输出如下图所示:

动态变量替换
适合场景:需要解析变量或动态生成命令。
推荐模块:shell
示例:获取当前主机名并打印
---
- name: 获取主机名hosts: node2tasks:- name: 获取主机名ansible.builtin.shell: hostnameregister: hostname_output- name: 打印主机名ansible.builtin.debug:msg: "当前主机名为:{{ hostname_output.stdout }}"
定期备份数据库
需求:通过cron任务,每日备份数据库并压缩备份文件。
- 使用
shell模块:
ansible node2 -m shell -a \
"mysqldump -u root -p'password' mydatabase | gzip > /backups/mydatabase_$(date +'%Y%m%d').sql.gz"
说明:shell 模块支持日期命令 $(date),可以动态生成文件名。
清理大文件
需求:删除 /var/log/ 目录中超过 100M 的文件。
- 使用
shell模块:
ansible node2 -m shell -a "find /var/log/ -type f -size +100M -exec rm -f {} \;"
说明:
find命令需要结合-exec,只能用shell模块完成。
监控服务状态
需求:检查远程主机上的Nginx服务是否正在运行。
- 使用
command模块:
ansible node2 -m command -a "systemctl is-active nginx"
总结
- 优先使用
command模块:
如果命令可以通过command模块实现,优先选择它以确保安全性。 - 适时使用
shell模块:
当任务需要使用管道、重定向、环境变量或命令替换时,选择shell模块。
通过合理选择和使用command与 shell 模块,可以高效完成复杂任务,同时确保系统安全性。希望本文的解析与案例能帮助你在Ansible自动化管理中更加得心应手!
推荐阅读
- 运维效率倍增!Ansible Copy 模块必知必会操作
- 如何在Ansible中轻松实现复杂SSH跳转?这个参数搞定
- Ansible Setup模块实战,如何使用Setup模块收集主机信息
- 从入门到精通:Ansible Shell 模块的应用与最佳实践
- 深入了解Ansible配置与主机清单:轻松管理自动化任务
- 效率提升神器:Ansible入门,开启自动化运维之旅
相关文章:
Ansible实战:如何正确选择 command 和shell模块?
在使用Ansible进行自动化运维时,command 和 shell 模块是我们执行命令的好帮手。虽然它们看起来很相似,但在功能特性和适用场景上其实有着明显的不同。正确选择合适的模块不仅能够提高任务的效率,还能帮助我们规避一些潜在的风险。在这篇文章…...
机器学习:监督学习与非监督学习
监督学习是利用带有标签的数据进行训练,模型通过学习输入和输出之间的关系来进行预测。也就是说,数据集中既有输入特征,也有对应的输出标签,模型的目标是找到从输入到输出的映射关系。 而无监督学习则使用没有标签的数据进行训练,模型的任务是发现数据中的内在结构或模式…...
近红外简单ROI分析matlab(NIRS_SPM)
本次笔记主要想验证上篇近红外分析是否正确,因为叠加平均有不同的计算方法,一种是直接将每个通道的5分钟实时长单独进行叠加平均,另一种是将通道划分为1分钟的片段,将感兴趣的通道数据进行对应叠加平均,得到一个总平均…...
运输层安全协议SSL
安全套接字层 SSL (Secure Socket Layer) SSL 作用在端系统应用层的 HTTP 和运输层之间,在 TCP 之上建立起一个安全通道,为通过 TCP 传输的应用层数据提供安全保障。 应用层使用 SSL 最多的就是 HTTP,但 SSL 并非仅用于 HTTP,而是…...
“扣子”开发之四:与千帆AppBuilder比较
上一个专题——“扣子”开发——未能落地,开始抱着极大的热情进入,但迅速被稚嫩的架构模型折磨打击,硬着头皮坚持了两周,终究还是感觉不实用不趁手放弃了。今天询问了下豆包,看看还有哪些比较好的AI开发平台࿰…...
Asp .Net Core 实现微服务:集成 Ocelot+Nacos+Swagger+Cors实现网关、服务注册、服务发现
什么是 Ocelot ? Ocelot是一个开源的ASP.NET Core微服务网关,它提供了API网关所需的所有功能,如路由、认证、限流、监控等。 Ocelot是一个简单、灵活且功能强大的API网关,它可以与现有的服务集成,并帮助您保护、监控和扩展您的…...
62_Redis服务器集群优化
Redis集群虽然具备高可用特性,且能实现自动故障恢复,但是如果使用不当,也会存在一些问题,总结如下。 集群完整性问题集群带宽问题数据倾斜问题客户端性能问题命令的集群兼容性问题Lua和事务问题1.集群完整性问题 在 Redis 集群的默认配置下,当节点检测到存在至少一个哈希…...
【React】静态组件动态组件
目录 静态组件动态组件创建一个构造函数(类)使用 class 实现组件**使用 function 实现类组件** 静态组件 函数组件是静态组件: 组件第一次渲染完毕后,无法基于内部的某些操作让组件更新「无法实现自更新」;但是,如果调用它的父组…...
深度学习中的卷积和反卷积(四)——卷积和反卷积的梯度
本系列已完结,全部文章地址为: 深度学习中的卷积和反卷积(一)——卷积的介绍 深度学习中的卷积和反卷积(二)——反卷积的介绍 深度学习中的卷积和反卷积(三)——卷积和反卷积的计算 …...
ASP.NET Core - IStartupFilter 与 IHostingStartup
ASP.NET Core - IStartupFilter 与 IHostingStartup 1. IStartupFilter2 IHostingStartup2.5.1 创建外部程序集2.5.2 激活外部程序集 1. IStartupFilter 上面讲到的方式虽然能够根据不同环境将Startup中的启动逻辑进行分离,但是有些时候我们还会可以根据应用中的功能…...
【零基础租赁实惠GPU推荐及大语言模型部署教程01】
租赁GPU推荐及大语言模型部署简易教程 1 官网地址2 注册账号及登录3 租用GPU3.1 充值(不限制充值最低金额,1元亦可)3.2 容器实例(实际就是你租用的GPU电脑)3.3 选择镜像(选择基础环境:框架版本和…...
接口传参 data格式和json格式区别是什么
接口传参 data格式和json格式区别是什么 以下是接口传参 data 格式和 JSON 格式的区别: 定义和范围 Data 格式: 是一个较为宽泛的概念,它可以指代接口传递参数时所使用的任何数据的组织形式。包括但不限于 JSON、XML、Form 数据、纯文本、二进…...
踏上 C++ 编程之旅:开篇之作
踏上 C 编程之旅:开篇之作 在计算机编程的广袤天地中,C 宛如一座巍峨的高峰,吸引着无数开发者攀登探索。今天,就让我们一同开启这段充满挑战与惊喜的 C 编程之旅,在代码的世界里开辟属于自己的道路。 一、为什么选择…...
docker在不删除容器的情况下修改端口映射
注意:必须先停止docker服务!!!! 1) 停止容器 2) 停止docker服务(systemctl stop docker) 3) 修改这个容器的hostconfig.json和config.v2.json文件中的端口 先查看容器id docker inspect jenkins 进入该目录 hostcon…...
Mysql tinyint与Java的数据类型的对应关系
参考资料 理解误区——mysql中tinyint与Java的数据类型的对应关系;tinyint(1) 与tinyint(4)的区别 1.1 tinyint字段取值 数据库字段类型为 tinyint,值为0或1,直接通过SQL语句查询的话,0会取出false;1会取出true目前就想取出的结果为 0 或 1 selectpg_id ,pg_name…...
mac intel芯片下载安卓模拟器
一、调研 目前主流两个模拟器: 雷神模拟器 不支持macosmumu模拟器pro版 不支持macos intel芯片 搜索到mumu的Q&A中有 “Intel芯片Mac如何安装MuMu?” q&a🔗:https://mumu.163.com/mac/faq/install-on-intel-mac.html 提…...
掌握 Ubuntu 终端 mv 与 rename 命令的高效重命名使用方法
在日常的计算任务中,文件重命名是一个经常性的需求。对于熟悉图形用户界面(GUI)的人来说,通过右键点击并选择“重命名”选项,这个过程简单直接。然而,当涉及到大量文件或需要自动化流程时,命令行…...
【Python】数据容器:列表,元组,字符串,集合字典及通用操作
文章目录 一.序列1.1list列表定义常用操作列表的遍历 1.2tuple元组定义常见操作元组的遍历 1.3str字符串定义常见操作字符串的遍历 1.4序列常用操作——切片 二.set集合定义常见操作集合的遍历 三.dict字典定义常用操作字典的嵌套 *数据容器对比总结四.数据容器的通用操作4.1通…...
基于Oracle与PyQt6的电子病历多模态大模型图形化查询系统编程构建
一、引言 1.1 研究背景阐述 在当今数字化时代,医疗行业正经历着深刻的变革,数字化转型的需求日益迫切。电子病历(EMR)作为医疗信息化的核心,其管理的高效性和数据利用的深度对于提升医疗服务质量、优化临床决策以及推动医学研究具有至关重要的意义。传统的电子病历管理系…...
2025智能网联汽车数据分类分级白皮书
智能网联汽车作为现代交通技术的重要成果,其核心特征之一是产生了大量的、多样化的数据,这些数据不仅对提升车辆性能和用户体验至关重要,对维护交通安全、推动智能交通系统的发展具有深远影响。在数字经济时代,数据的价值日益凸显…...
synchronized 学习
学习源: https://www.bilibili.com/video/BV1aJ411V763?spm_id_from333.788.videopod.episodes&vd_source32e1c41a9370911ab06d12fbc36c4ebc 1.应用场景 不超卖,也要考虑性能问题(场景) 2.常见面试问题: sync出…...
微信小程序之bind和catch
这两个呢,都是绑定事件用的,具体使用有些小区别。 官方文档: 事件冒泡处理不同 bind:绑定的事件会向上冒泡,即触发当前组件的事件后,还会继续触发父组件的相同事件。例如,有一个子视图绑定了b…...
《Qt C++ 与 OpenCV:解锁视频播放程序设计的奥秘》
引言:探索视频播放程序设计之旅 在当今数字化时代,多媒体应用已渗透到我们生活的方方面面,从日常的视频娱乐到专业的视频监控、视频会议系统,视频播放程序作为多媒体应用的核心组成部分,扮演着至关重要的角色。无论是在个人电脑、移动设备还是智能电视等平台上,用户都期望…...
centos 7 部署awstats 网站访问检测
一、基础环境准备(两种安装方式都要做) bash # 安装必要依赖 yum install -y httpd perl mod_perl perl-Time-HiRes perl-DateTime systemctl enable httpd # 设置 Apache 开机自启 systemctl start httpd # 启动 Apache二、安装 AWStats࿰…...
剑指offer20_链表中环的入口节点
链表中环的入口节点 给定一个链表,若其中包含环,则输出环的入口节点。 若其中不包含环,则输出null。 数据范围 节点 val 值取值范围 [ 1 , 1000 ] [1,1000] [1,1000]。 节点 val 值各不相同。 链表长度 [ 0 , 500 ] [0,500] [0,500]。 …...
linux 错误码总结
1,错误码的概念与作用 在Linux系统中,错误码是系统调用或库函数在执行失败时返回的特定数值,用于指示具体的错误类型。这些错误码通过全局变量errno来存储和传递,errno由操作系统维护,保存最近一次发生的错误信息。值得注意的是,errno的值在每次系统调用或函数调用失败时…...
BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践
6月5日,2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席,并作《智能体在安全领域的应用实践》主题演讲,分享了在智能体在安全领域的突破性实践。他指出,百度通过将安全能力…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
python报错No module named ‘tensorflow.keras‘
是由于不同版本的tensorflow下的keras所在的路径不同,结合所安装的tensorflow的目录结构修改from语句即可。 原语句: from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense 修改后: from tensorflow.python.keras.lay…...
【电力电子】基于STM32F103C8T6单片机双极性SPWM逆变(硬件篇)
本项目是基于 STM32F103C8T6 微控制器的 SPWM(正弦脉宽调制)电源模块,能够生成可调频率和幅值的正弦波交流电源输出。该项目适用于逆变器、UPS电源、变频器等应用场景。 供电电源 输入电压采集 上图为本设计的电源电路,图中 D1 为二极管, 其目的是防止正负极电源反接, …...
