Ansible实战:怎样正确选择 command 和shell模块?

打印 上一主题 下一主题

主题 1044|帖子 1044|积分 3132

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

两者模块的区别

特性commad模块shell模块解析方式不利用shell解析利用完整的shell 解析支持特性不支持管道重定向、管道等shell 功能安全性更安全,防止命令注入存在命令注入风险,必要严格验证输入适用场景执行简单命令,如ls、mkdir等执行复杂命令或必要shell功能的场景 常见场景及模块选择

执行简单命令

适合场景:执行单一命令,无需复杂的shell功能。
推荐模块:command
示例:在远程主机上创建目录
  1. ansible -m  node2 command -a 'mkdir -p /tmp/node1'
复制代码
以下述命令是通过ad-hoc方式创建,简单的命令用这种方式很方便。执行成功如所示:
  1. root@ansible:~# ansible   node2 -m  command -a 'mkdir -p /tmp/node2'
  2. 192.168.31.102 | CHANGED | rc=0 >>
  3. root@ansible:~# ansible   node2 -m  command -a 'ls  /tmp'
  4. 192.168.31.102 | CHANGED | rc=0 >>
  5. ....
  6. node2
  7. .....
复制代码
以下方式通过剧本方式创建:
  1. ---
  2. - name: 使用command模块创建目录
  3.   hosts: node2
  4.   gather_facts: yes
  5.   tasks:
  6.     - name: 使用command模块创建目录
  7.       command: mkdir -p /tmp/mydir
复制代码
通过ansible-playbook执行成功,输出如下图所示:

利用管道或重定向

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

动态变量更换

适合场景:必要解析变量或动态天生命令。
推荐模块:shell
示例:获取当前主机名并打印
  1. ---
  2. - name: 获取主机名
  3.   hosts: node2
  4.   tasks:
  5.     - name: 获取主机名
  6.       ansible.builtin.shell: hostname
  7.       register: hostname_output
  8.    
  9.     - name: 打印主机名
  10.       ansible.builtin.debug:
  11.         msg: "当前主机名为:{{ hostname_output.stdout }}"
复制代码
定期备份数据库

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


  • 利用 shell 模块
  1. ansible node2 -m shell -a \
  2. "mysqldump -u root -p'password' mydatabase | gzip > /backups/mydatabase_$(date +'%Y%m%d').sql.gz"
复制代码
说明:shell 模块支持日期命令 $(date),可以动态天生文件名。
清算大文件

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


  • 利用 shell 模块
  1. ansible node2 -m shell -a "find /var/log/ -type f -size +100M -exec rm -f {} \;"
复制代码
  说明:find 命令必要团结-exec,只能用shell 模块完成。
  监控服务状态

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


  • 利用 command 模块
  1. 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入门,开启自动化运维之旅


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

杀鸡焉用牛刀

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表