您的位置:首页 > 汽车 > 时评 > Ansible——shell模块

Ansible——shell模块

2024/10/31 8:24:25 来源:https://blog.csdn.net/Lzcsfg/article/details/139512197  浏览:    关键词: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

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com