当前位置: 首页 > news >正文

Ansible——shell模块

目录

基本用法

更复杂的命令

在特定目录下执行命令

传递环境变量

仅在指定节点上执行

使用Ansible Vault加密变量

示例:综合应用

下述是在YAML语法中的使用。 

基本语法

参数

示例

示例 1:执行一个简单的shell命令

示例 2:使用通配符和管道

示例 3:改变目录后执行命令

示例 4:仅当文件不存在时创建文件

示例 5:仅当文件存在时删除文件

示例 6:使用特定的shell执行命令

完整的Playbook示例


Ansible中的shell模块用于在目标主机上执行通过shell解释的命令。与command模块不同,shell模块允许使用shell特性,如管道、重定向、通配符等。这使得shell模块在处理复杂的命令和脚本时非常有用,但也需要更加谨慎地处理输入,以避免潜在的安全风险。

在命令行中使用Shell模块可以执行各种系统命令。下面是可以在命令行中直接使用的几种Shell模块的语法示例:

常用参数

  • cmd:

    • 描述:要在远程主机上执行的命令。
    • 类型:字符串
    • 必需:是
    • 示例:cmd: "ls -l | grep '^d'"
  • chdir:

    • 描述:在执行命令前更改为指定的目录。
    • 类型:字符串
    • 示例:chdir: /path/to/directory
  • creates:

    • 描述:如果指定的文件存在,则不运行命令。
    • 类型:字符串
    • 示例:creates: /path/to/somefile
  • removes:

    • 描述:如果指定的文件不存在,则不运行命令。
    • 类型:字符串
    • 示例:removes: /path/to/somefile
  • executable:

    • 描述:指定用于运行命令的 shell。
    • 类型:字符串
    • 示例:executable: /bin/bash
  • stdin:

    • 描述:要传递给命令的标准输入。
    • 类型:字符串
    • 示例:stdin: "some input"
  • stdin_add_newline:

    • 描述:如果为 yes,则在传递的 stdin 后添加一个换行符。
    • 类型:布尔值
    • 默认值:yes
    • 示例:stdin_add_newline: no
  • strip_empty_ends:

    • 描述:如果为 yes,则删除命令输出中的空行。
    • 类型:布尔值
    • 默认值:yes
    • 示例:strip_empty_ends: no
  • warn:

    • 描述:如果为 yes,则在使用管道符、重定向符等时显示警告。
    • 类型:布尔值
    • 默认值:yes
    • 示例:warn: no

 

  • timeout:指定命令的超时时间,以秒为单位。

 

基本用法

  • all:指定对所有主机执行命令。
  • -m shell:指定使用shell模块。
  • -a "echo Hello, World!":传递要执行的命令作为参数。

更复杂的命令

ansible all -m shell -a "ls -l /var/log | grep 'syslog'"

可以执行任何有效的Shell命令,包括管道和重定向。

在特定目录下执行命令

ansible all -m shell -a "pwd" -e "ansible_shell_executable=/bin/bash" -b

使用-e传递环境变量参数指定使用的Shell解释器,这里是/bin/bash,并且使用-b表示需要提升权限(类似于sudo)。

传递环境变量

ansible all -m shell -a "echo $HOME" -e "HOME=/custom/home"

可以通过-e来传递环境变量,以更改命令的执行环境。

仅在指定节点上执行

例如,仅对特定主机组执行命令:

ansible webservers -m shell -a "df -h"

webservers指的是库存文件中定义的组名称。

使用Ansible Vault加密变量

当你需要传递加密的变量时:

ansible all -m shell -a "echo $SECRET_VAR" --ask-vault-pass

这个示例会在运行时提示输入Ansible Vault的密码,以解密$SECRET_VAR

示例:综合应用

假设有以下需求:

  1. 在所有的webservers主机上执行一些更新命令。
  2. 使用sudo权限。
  3. 需要在特定目录中执行命令。
  4. 有环境变量需要设置。

可以这样写:

ansible webservers -m shell -a "cd /var/www && git pull origin master" -e "ansible_shell_executable=/bin/bash" -e "GIT_SSH=/home/user/.ssh/id_rsa" -b
  • -m shell: 使用Shell模块。
  • -a "cd /var/www && git pull origin master":执行的命令。
  • -e "ansible_shell_executable=/bin/bash":指定Shell解释器。
  • -e "GIT_SSH=/home/user/.ssh/id_rsa":传递环境变量。
  • -b:使用sudo权限。

下述是在YAML语法中的使用。 

基本语法

- name: 描述任务的名称shell: <命令以及其参数>

参数

  • chdir: 在执行命令前更改目录。
  • creates: 只有在指定的文件或目录不存在时才执行命令。
  • removes: 只有在指定的文件或目录存在时执行命令。
  • executable: 指定用于运行命令的shell,如/bin/bash

示例

示例 1:执行一个简单的shell命令
- name: Echo a messageshell: echo "Hello, World!"

示例 2:使用通配符和管道
- name: List all text files and count themshell: ls *.txt | wc -l

示例 3:改变目录后执行命令
- name: List files in the /tmp directoryshell: ls -largs:chdir: /tmp

示例 4:仅当文件不存在时创建文件
- name: Create a file if it does not existshell: touch /tmp/myfileargs:creates: /tmp/myfile

示例 5:仅当文件存在时删除文件
- name: Remove a file if it existsshell: rm /tmp/myfileargs:removes: /tmp/myfile

示例 6:使用特定的shell执行命令
- name: Use /bin/bash to run a commandshell: echo "Hello with Bash" | /bin/bashargs:executable: /bin/bash

完整的Playbook示例

这是一个包含多种shell模块任务的完整Ansible Playbook示例:

---
- name: Example Playbook for using shell modulehosts: alltasks:- name: Echo Hello Worldshell: echo "Hello, World!"- name: List all text files and count themshell: ls *.txt | wc -l- name: List files in the /tmp directoryshell: ls -largs:chdir: /tmp- name: Create a file if it does not existshell: touch /tmp/myfileargs:creates: /tmp/myfile- name: Remove a file if it existsshell: rm /tmp/myfileargs:removes: /tmp/myfile- name: Use /bin/bash to run a commandshell: echo "Hello with Bash" | /bin/bashargs:executable: /bin/bash

相关文章:

  • 面试题:如何避免索引失效?
  • LCD电子广告牌课程设计
  • R语言绘图 --- 桑基图(Biorplot 开发日志 --- 5)
  • Win10下CodeBlock实现socket TCP server/client
  • CSS--超出就显示滚动条并设置滚动条的样式
  • LeetCode 每日一题 2024/6/3-2024/6/9
  • Qt——窗口
  • RabbitMQ从入门到入土
  • 什么是校园抄表系统?
  • 基于SOA海鸥优化算法的三维曲面最高点搜索matlab仿真
  • ABSD方法论:一种有效的软件开发方法
  • 网络故障排除:保持网络稳定与业务连续
  • esp32s3-gc9a01-lvgl
  • 爬取京东商品图片的Python实现方法
  • 跨国大文件传输需要哪些方面?怎么实现数据快速传输?
  • ES6语法详解(一)
  • express.js的介绍及使用
  • idea + plantuml 画流程图
  • Java 9 被无情抛弃,Java 8 直接升级到 Java 10!!
  • Javascripit类型转换比较那点事儿,双等号(==)
  • javascript面向对象之创建对象
  • Perseus-BERT——业内性能极致优化的BERT训练方案
  • Twitter赢在开放,三年创造奇迹
  • 对话:中国为什么有前途/ 写给中国的经济学
  • 反思总结然后整装待发
  • 构造函数(constructor)与原型链(prototype)关系
  • 机器人定位导航技术 激光SLAM与视觉SLAM谁更胜一筹?
  • 消息队列系列二(IOT中消息队列的应用)
  • UI设计初学者应该如何入门?
  • #100天计划# 2013年9月29日
  • #565. 查找之大编号
  • #考研#计算机文化知识1(局域网及网络互联)
  • #我与Java虚拟机的故事#连载07:我放弃了对JVM的进一步学习
  • %3cli%3e连接html页面,html+canvas实现屏幕截取
  • (13):Silverlight 2 数据与通信之WebRequest
  • (undone) MIT6.824 Lecture1 笔记
  • (笔记)M1使用hombrew安装qemu
  • (二十四)Flask之flask-session组件
  • (附源码)计算机毕业设计大学生兼职系统
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (一)SpringBoot3---尚硅谷总结
  • .aanva
  • .bat批处理(一):@echo off
  • .net 获取url的方法
  • .net(C#)中String.Format如何使用
  • .NET6 命令行启动及发布单个Exe文件
  • .net之微信企业号开发(一) 所使用的环境与工具以及准备工作
  • :not(:first-child)和:not(:last-child)的用法
  • ??在JSP中,java和JavaScript如何交互?
  • [ 转载 ] SharePoint 资料
  • [120_移动开发Android]008_android开发之Pull操作xml文件
  • [51nod1610]路径计数
  • [⑧ADRV902x]: Digital Pre-Distortion (DPD)学习笔记
  • [codevs] 1029 遍历问题
  • [ComfyUI进阶教程] animatediff视频提示词书写要点