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

网络
在这篇文章中,我们将深入探讨 command和shell模块之间的差异,并通过一些高级案例来展示如何恰当地选择和使用它们。

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

一、两者模块的区别

特性

commad模块

shell模块

解析方式

不使用shell解析

使用完整的shell 解析

支持特性

不支持管道

重定向、管道等shell 功能

安全性

更安全,防止命令注入

存在命令注入风险,需要严格验证输入

适用场景

执行简单命令,如ls、mkdir等

执行复杂命令或需要shell功能的场景

二、常见场景及模块选择

1. 执行简单命令

适合场景:执行单一命令,无需复杂的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:node2
gather_facts:yes
tasks:
    -name:使用command模块创建目录
      command:mkdir-p/tmp/mydir

通过ansible-playbook执行成功,输出如下图所示:

2. 使用管道或重定向

适合场景:需要使用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:node2
tasks:
    -name:使用shell模块统计日志中的错误行数
      shell:grep'error'/var/log/messages|wc-l
      register:error_count
    -name:打印错误行数
      ansible.builtin.debug:
        msg:"日志中包含的错误行数为:{{ error_count.stdout }}"

通过ansible-playbook执行成功,输出如下图所示:

3. 动态变量替换

适合场景:需要解析变量或动态生成命令。推荐模块:shell

示例:获取当前主机名并打印

---
-name:获取主机名
hosts:node2
tasks:
    -name:获取主机名
      ansible.builtin.shell:hostname
      register:hostname_output
    
    -name:打印主机名
      ansible.builtin.debug:
        msg:"当前主机名为:{{ hostname_output.stdout }}"

4. 定期备份数据库

需求:通过cron任务,每日备份数据库并压缩备份文件。

使用 shell 模块:

ansible node2 -m shell -a \
"mysqldump -u root -p'password' mydatabase | gzip > /backups/mydatabase_$(date +'%Y%m%d').sql.gz"

说明:shell 模块支持日期命令 $(date),可以动态生成文件名。

5. 清理大文件

需求:删除 /var/log/ 目录中超过 100M 的文件。

使用 shell 模块:

ansible node2 -m shell -a "find /var/log/ -type f -size +100M -exec rm -f {} \;"

说明:find 命令需要结合-exec,只能用shell 模块完成。

6. 监控服务状态

需求:检查远程主机上的Nginx服务是否正在运行。

使用 command 模块:

ansible node2 -m command  -a "systemctl is-active nginx"

三、总结

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

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

责任编辑:赵宁宁 来源: 攻城狮成长日记
相关推荐

2025-01-08 07:38:39

setup模块Ansible网络

2024-11-01 10:30:05

2009-11-30 09:40:44

2022-11-22 13:00:38

2013-01-07 11:38:54

VMware认证

2023-07-21 12:13:50

综合布线数据中心

2018-04-04 13:59:22

天线无线通信

2020-02-04 14:25:29

云迁移云计算云平台

2018-04-23 14:58:27

大数据

2014-08-18 10:58:20

编程语言编程书籍

2022-11-24 09:55:12

Kubernetes监控

2018-04-20 10:54:52

数据集成数据科学工具

2024-03-28 09:00:00

NoSQL数据库

2012-09-17 09:58:02

云集成平台云集成集成平台

2021-11-11 14:49:42

人工智能AI

2009-02-27 14:33:00

服务器软件企业服务器软件

2021-08-31 08:00:00

开发软件框架

2025-01-07 14:42:09

2022-07-13 15:03:23

网络安全数据安全远程工作

2017-11-09 08:51:28

点赞
收藏

51CTO技术栈公众号