从入门到精通:Ansible Shell 模块的应用与最佳实践

Ansible是一款强大的自动化运维工具,通过其模块化的设计,可以方便地管理和配置远程主机。作为Ansible的一个常用模块,shell 模块使得我们可以在目标主机上执行复杂的命令或脚本。无论是单一的命令,还是复杂的Shell脚本, Ansible shell 模块都能够轻松处理。

本文将从入门到精通,全面讲解 Ansible shell模块的使用,并结合最佳实践,帮助你更高效地使用这个模块执行自动化任务。

Ansible shell模块概述

Ansibleshell 模块允许我们在目标主机上执行任意的Shell命令。它支持标准的 Shell命令语法,包括管道、重定向等操作,因此非常适合处理一些需要复杂命令或脚本的场景。

shell 模块的基本语法

ansible <host-pattern> -m shell -a '<command>'
  • <host-pattern>: 要执行命令的主机或主机组,可以是单个主机、多个主机或主机组。

  • -m shell: 指定使用 shell 模块执行命令。

  • -a '<command>': 通过 -a 传递要执行的命令,这里是 uptime

还可以使用ansible-playbook方式,执行shell

- name: Run a shell commandhosts: alltasks:- name: Run a command to check disk spaceshell: <command> # "df -h"register: disk_space- name: Show the outputdebug:var: disk_space.stdout
  • <command>是你希望在目标主机上执行的Shell命令,例如:df -h

  • 与其他Ansible模块不同,shell模块通常需要在命令字符串中明确写出所需的操作。

  • register: disk_space 捕获命令 df -h 的返回结果,并将其存储在 disk_space 变量中。

shell 模块的常用参数

  • chdir:指定在执行命令前切换到的目录。

  • creates:如果该文件或目录已经存在,则不会执行该命令。适用于防止重复执行任务。

  • removes:与 creates 类似,但如果文件或目录不存在,命令才会执行。

基础用法:执行简单命令

示例 1:执行 uptime 命令

使用 ansible -m shell -a 'uptime' 命令可以直接在Ansible管理的远程主机上执行 uptime 命令。该命令使用了shell模块,并通过-a参数传递了命令参数。 成功执行如下所示:

root@ansible:~/shell# ansible hp -m shell -a 'uptime'
192.168.31.232 | CHANGED | rc=0 >>12:11:06 up 17 min,  2 users,  load average: 0.77, 0.66, 0.44
192.168.31.231 | CHANGED | rc=0 >>12:11:06 up 17 min,  2 users,  load average: 0.77, 0.66, 0.44

使用ansible-palybook执行,先要编写yml文件,内容如下:

- name: Execute a simple shell commandhosts: alltasks:- name: Run `uptime` commandshell: uptimeregister: uptime_output- name: Show the outputdebug:var: uptime_output.stdout

上述内容使用shell模块,执行uptime,把输出的结果存入uptime_output,并以标准输出到终端。

此示例在所有目标主机上执行 uptime 命令,获取系统运行时间。

示例 2:运行多个命令

Ansibleshell模块支持执行多个命令,可以通过管道 (&&;) 来串联命令。

还可以通过ansible-palybook执行

- name: Run multiple shell commandshosts: hptasks:- name: Check disk space and system loadshell: "df -h && uptime"register: output_vars- name: Show the outputdebug:var: output_vars.stdout

在该示例中,df -h 用于查看磁盘空间,执行完后再执行 uptime 来查看系统负载。

进阶应用:多行命令与脚本执行

shell模块支持多行命令的执行,允许你在一个任务中运行一个完整的Shell脚本。

示例 3:执行多行命令

- name: Execute a multi-line shell scripthosts: alltasks:- name: Run setup scriptshell: |echo "Starting setup..."mkdir -p /tmp/setupcd /tmp/setupcurl -O https://example.com/setup.shchmod +x setup.sh./setup.sh

在这个示例中,| 符号表示一个多行命令,任务会:

  1. 创建目录 /tmp/setup

  2. 下载脚本 setup.sh

  3. 为脚本添加执行权限

  4. 执行该脚本

示例 4:使用条件判断执行命令

shell 模块还可以结合条件判断来执行命令。如下所示,只有在 /tmp/mydir 不存在时才会创建该目录。

- name: Run a conditional shell commandhosts: alltasks:- name: Check if a directory exists and create itshell: |if [ ! -d "/tmp/mydir" ]; thenmkdir /tmp/mydirfi

高级功能:避免重复执行和工作目录

示例 5:避免重复执行命令

有时我们不希望每次运行Playbook时都执行相同的命令。creates参数可以帮助我们避免这种情况。

- name: Run a command only if a file does not existhosts: alltasks:- name: Create a file if it doesn't already existshell: touch /tmp/example.txtargs:creates: /tmp/example.txt

如果 /tmp/example.txt 文件已经存在,任务就不会执行,从而避免重复创建文件。

示例 6:在特定目录中执行命令

通过 chdir 参数,可以指定命令执行的工作目录。这对于需要在某个项目目录中执行命令时非常有用。

- name: Execute command in a specific directoryhosts: alltasks:- name: Pull the latest code from Gitshell: git pullargs:chdir: /path/to/project

该任务会进入 /path/to/project 目录,并执行 git pull 命令更新代码。

常见问题与最佳实践

使用 shell 模块时的注意事项

  • 避免执行简单命令:对于简单的命令,尽量使用 command 模块,它比 shell 模块更加安全和高效。command 模块不会在命令行中处理任何Shell特性(如管道、重定向等),因此对于简单任务,建议优先选择command

  • 确保幂等性Ansible的任务应当是幂等的,即任务在多次执行时不会产生副作用。对于需要执行的命令,最好通过条件判断来确保只有在必要时才执行。

  • 避免在命令中暴露敏感信息:如果命令中包含敏感信息(如密码),尽量避免将其硬编码在Playbook 中。可以考虑使用Ansible Vault来加密敏感信息。

性能优化

  • 减少命令的执行次数:通过合理利用 createsremoves 参数,避免不必要的命令执行,提升Playbook的执行效率。

  • 合理分割任务:将较为复杂的脚本分割成多个任务,确保每个任务的执行目标单一,便于排查问题。

总结

Ansibleshell 模块提供了强大的功能,使得我们能够在目标主机上执行复杂的命令和脚本。通过合理使用 shell 模块的多种特性,可以大大简化自动化运维工作,提升生产效率。

推荐阅读


  • 深入了解Ansible配置与主机清单:轻松管理自动化任务
  • 效率提升神器:Ansible入门,开启自动化运维之旅
  • Kubernetes 镜像拉取策略全解析:如何根据需求选择最佳配置?
  • ncdu:Linux磁盘分析的利器,你值得拥有
  • Linux磁盘爆满?别慌!这几个命令轻松搞定
  • fnOS搭建音乐服务Navidrome

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/66360.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux应用软件编程--网络通信(传输层:udp协议,tcp协议,应用层:http协议)

网络通信&#xff1a;不同主机&#xff0c;进程间通信&#xff0c;分为广域网和局域网 OSI 七层模型&#xff1a;是一种理论模型 应用层&#xff1a;通信传输的数据内容 http、FTP、TFTP、MQTT 表述层&#xff1a;数据加密&#xff0c;解密操作&#xff0c;压缩&#xff…

Android中的LoadedApk:使用指南与核心代码解析

Android中的LoadedApk&#xff1a;使用指南与核心代码解析 引言 在Android系统中&#xff0c;LoadedApk是一个非常重要的内部类&#xff0c;它代表了已加载的APK文件。LoadedApk类在Android应用程序的运行过程中扮演着关键角色&#xff0c;负责管理应用程序的资源、类加载器、…

鸿蒙的APP真机调试以及发布

目录&#xff1a; 1、创建好鸿蒙项目2、创建AGC项目3、实现自动签名3.1、手动方式创建签名文件和密码 4、运行项目5、无线真机调试 1、创建好鸿蒙项目 2、创建AGC项目 &#xff08;1&#xff09;在File->Project Structure->Project->Signing Configs中进行登录。(未…

n8n - AI自动化工作流

文章目录 一、关于 n8n关键能力n8n 是什么意思 二、快速上手 一、关于 n8n n8n是一个具有原生AI功能的工作流自动化平台&#xff0c;它为技术团队提供了代码的灵活性和无代码的速度。凭借400多种集成、原生人工智能功能和公平代码许可证&#xff0c;n8n可让您构建强大的自动化…

redis cluster 主节点挂了,如何保证消息不丢失

redis cluster 主节点挂了&#xff0c;从节点切换成主节点时&#xff0c;如何保证消息不丢失 在 Redis Cluster 中&#xff0c;主节点挂掉后&#xff0c;能够确保消息不丢失的关键在于以下几个机制&#xff1a; 1. Redis Cluster 的数据复制机制 Redis Cluster 使用了主从复…

【Shell脚本】Docker构建Java项目,并自动停止原镜像容器,发布新版本

本文简述 经常使用docker部署SpringBoot 项目&#xff0c;因为自己的服务器小且项目简单&#xff0c;因此没有使用自动化部署。每次将jar包传到服务器后&#xff0c;需要手动构建&#xff0c;然后停止原有容器&#xff0c;并使用新的镜像启动&#xff0c;介于AI时代越来越懒的…

jmeter 中 BeanShell 预处理程序、JSR223后置处理程序使用示例

1. 各个组件如何新建的&#xff1f; 2. "http请求" 组件内容样例&#xff1a; "消息体数据" 源码&#xff1a; {"task_tag": "face_detect","image_type": "base64","extra_args": [{"model"…

K8s高可用集群之Kubernetes集群管理平台、命令补全工具、资源监控工具部署及常用命令

K8s高可用集群之Kubernetes管理平台、补全命令工具、资源监控工具部署及常用命令 1.Kuboard可视化管理平台2.kubectl命令tab补全工具3.MetricsServer资源监控工具4.Kubernetes常用命令 1.Kuboard可视化管理平台 可以选择安装k8s官网的管理平台&#xff1b;我这里是安装的其他开…

Centos源码安装MariaDB 基于GTID主从部署(一遍过)

MariaDB安装 安装依赖 yum install cmake ncurses ncurses-devel bison 下载源码 // 下载源码 wget https://downloads.mariadb.org/interstitial/mariadb-10.6.20/source/mariadb-10.6.20.tar.gz // 解压源码 tar xzvf mariadb-10.5.9.tar.gz 编译安装 cmake -DCMAKE_INSTA…

github gitbook写书

github创建新的仓库 在仓库中添加目录 ‘SUMMARY.md # Summary * [简介](README.md)gitbook 新建一个site https://www.gitbook.com/ 注册账号 取名字 一路 next&#xff0c;注意选免费版 最后 gitbook同步到github 你在主页可以看到 刚刚的test网站 点击右上角圈出来…

Rust 泛型、特征与生命周期详解

Rust 泛型、特征与生命周期详解 泛型编程 泛型函数 // 泛型函数&#xff1a;找出最大值 fn largest<T: PartialOrd>(list: &[T]) -> &T {let mut largest &list[0];for item in list {if item > largest {largest item;}}largest }fn main() {let…

colnames看似简单,却能优化数据处理流程

引言 在数据处理和分析中&#xff0c;变量名称是至关重要的&#xff0c;它们决定了数据的可读性和操作的简便性。在R语言中&#xff0c;colnames 函数以其简单的语法设计&#xff0c;提供了高效管理数据框列名的能力&#xff0c;尤其是在复杂的爬虫任务中显得尤为重要。本篇文…

2025新春烟花代码(一)HTML5夜景放烟花绽放动画效果

标题预览效果 标题HTML代码 <!DOCTYPE html> <html lang"en"> <script>var _hmt _hmt || [];(function () {var hm document.createElement("script");hm.src "https://hm.baidu.com/hm.js?45f95f1bfde85c7777c3d1157e8c2d34&…

软件项目体系建设文档,项目开发实施运维,审计,安全体系建设,验收交付,售前资料(word原件)

软件系统实施标准化流程设计至关重要&#xff0c;因为它能确保开发、测试、部署及维护等各阶段高效有序进行。标准化流程能减少人为错误&#xff0c;提升代码质量和系统稳定性。同时&#xff0c;它促进了团队成员间的沟通与协作&#xff0c;确保项目按时交付。此外&#xff0c;…

通过shell脚本定时采集数据到HDFS

第一步&#xff1a;创建shell脚本&#xff08;在虚拟机1下的/export/data目录下执行vi uploadHDFS.sh命令&#xff0c;编辑shell脚本文件&#xff0c;具体代码如下&#xff1a;&#xff09; 第二步&#xff1a;执行shell脚本&#xff08;确保Hadoop集群处于启动状态&#xff0c…

如何进一步提高Oracle lgwr的写性能?

今天在我们的一个项目中&#xff0c;客户非常关系Oracle的log file sync、db file parallel write性能。 由于我们的分布式存储zdatax已经是nvme了&#xff0c;因此db file parallel write的性能足够好了&#xff0c;平均等待时间也就0.13ms。 然后log file sync 确高达0.6ms…

HTML5 进度条(Progress Bar)详解

HTML5 进度条&#xff08;Progress Bar&#xff09;详解 进度条是用于显示任务完成进度的控件&#xff0c;常用于加载、上传或下载等操作。HTML5提供了原生的<progress>元素&#xff0c;使得创建进度条变得简单和直观。 1. 基本用法 <progress>元素的基本语法如…

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World

20250103在Ubuntu20.04.5的Android Studio 2024.2.1.12中跑通Hello World 2025/1/3 14:06 百度&#xff1a;android studio helloworld android studio hello world kotlin helloword kotlin 串口 no run configurations added android studio no run configurations added 1、…

一机多实例:如何在一台机器上高效运行多个 MySQL 服务

前言 在实际开发和测试环境中&#xff0c;我们经常需要运行多个 MySQL 实例来模拟不同的数据库环境。例如&#xff0c;在一台服务器上运行多个数据库服务以节约硬件资源&#xff0c;或者同时运行不同版本的 MySQL 进行功能兼容性测试。MySQL 本身支持通过配置多实例运行&#…

STM32智能小车(循迹、跟随、避障、测速、蓝牙、wifi、4g、语音识别)总结

前言 有需要帮忙代做51和32小车或者其他单片机项目&#xff0c;课程设计&#xff0c;报告&#xff0c;PCB原理图的小伙伴&#xff0c;可以在文章最下方加我V交流咨询&#xff0c;本篇文章的小车所有功能实现的代码还有硬件清单放在资源包里&#xff0c;有需要的自行下载即可&a…