目录
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
。
示例:综合应用
假设有以下需求:
- 在所有的
webservers
主机上执行一些更新命令。 - 使用
sudo
权限。 - 需要在特定目录中执行命令。
- 有环境变量需要设置。
可以这样写:
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 message
shell: echo "Hello, World!"
示例 2:使用通配符和管道
- name: List all text files and count them
shell: ls *.txt | wc -l
示例 3:改变目录后执行命令
- name: List files in the /tmp directory
shell: ls -l
args:
chdir: /tmp
示例 4:仅当文件不存在时创建文件
- name: Create a file if it does not exist
shell: touch /tmp/myfile
args:
creates: /tmp/myfile
示例 5:仅当文件存在时删除文件
- name: Remove a file if it exists
shell: rm /tmp/myfile
args:
removes: /tmp/myfile
示例 6:使用特定的shell执行命令
- name: Use /bin/bash to run a command
shell: echo "Hello with Bash" | /bin/bash
args:
executable: /bin/bash
完整的Playbook示例
这是一个包含多种shell模块任务的完整Ansible Playbook示例:
---
- name: Example Playbook for using shell module
hosts: all
tasks:
- name: Echo Hello World
shell: echo "Hello, World!"
- name: List all text files and count them
shell: ls *.txt | wc -l
- name: List files in the /tmp directory
shell: ls -l
args:
chdir: /tmp
- name: Create a file if it does not exist
shell: touch /tmp/myfile
args:
creates: /tmp/myfile
- name: Remove a file if it exists
shell: rm /tmp/myfile
args:
removes: /tmp/myfile
- name: Use /bin/bash to run a command
shell: echo "Hello with Bash" | /bin/bash
args:
executable: /bin/bash