Ansible实战:如何正确选择 command 和shell模块?

admin 2025年1月16日11:55:30评论17 views字数 2212阅读7分22秒阅读模式

Ansible实战:如何正确选择 command 和shell模块?

大家好!我是一个热衷于分享IT技术的up主。在这个公众号里,我将为大家带来最新、最实用的技术干货,从编程语言到前沿科技,从软件开发到网络安全。希望通过我的分享,能够帮助更多的小伙伴提升技术水平,共同成长!欢迎关注,一起探索科技的魅力吧!

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

Ansible实战:如何正确选择 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执行成功,输出如下图所示:

Ansible实战:如何正确选择 command 和shell模块?

使用管道或重定向

适合场景:需要使用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执行成功,输出如下图所示:

Ansible实战:如何正确选择 command 和shell模块?

动态变量替换

适合场景:需要解析变量或动态生成命令。推荐模块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"

总结

  1. 优先使用command模块如果命令可以通过 command 模块实现,优先选择它以确保安全性。
  2. 适时使用shell模块当任务需要使用管道、重定向、环境变量或命令替换时,选择shell模块。

通过合理选择和使用command与 shell 模块,可以高效完成复杂任务,同时确保系统安全性。希望本文的解析与案例能帮助你在Ansible自动化管理中更加得心应手!

原文始发于微信公众号(攻城狮成长日记):Ansible实战:如何正确选择 command 和shell模块?

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2025年1月16日11:55:30
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   Ansible实战:如何正确选择 command 和shell模块?https://cn-sec.com/archives/3634420.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息