Ansible shell
模块
一、简介
- 功能:
shell
模块用于在远程主机上通过 shell 解释器执行命令。与command
模块不同,shell
模块支持 shell 特性,如管道(|
)、重定向(>
)、环境变量(如$HOME
)、条件命令、脚本等。 - 使用场景:适用于需要利用 shell 解释器的复杂命令,或者需要执行带有 shell 特性的脚本和命令串。
二、基本用法
2.1 语法
ansible <pattern> -m shell -a "<command>"
<pattern>
:指定要操作的主机或主机组,例如all
、webservers
。-m shell
:指定使用shell
模块。-a "<command>"
:提供要通过 shell 执行的命令。
2.2 示例
-
在所有主机上执行带有环境变量的命令:
ansible all -m shell -a "echo $HOME"
- 解释:在所有主机上执行
echo $HOME
,输出当前用户的主目录路径。
- 解释:在所有主机上执行
-
执行带有管道的命令:
ansible all -m shell -a "ps aux | grep httpd"
- 解释:在所有主机上列出与
httpd
相关的进程信息。
- 解释:在所有主机上列出与
-
执行多条命令:
ansible all -m shell -a "mkdir -p /tmp/testdir && touch /tmp/testdir/testfile"
- 解释:在所有主机上创建一个目录
/tmp/testdir
,并在该目录下创建一个空文件testfile
。
- 解释:在所有主机上创建一个目录
-
执行脚本:
ansible all -m shell -a "/path/to/script.sh"
- 解释:在所有主机上执行指定路径的脚本
script.sh
。
- 解释:在所有主机上执行指定路径的脚本
三、输出结果
执行 shell
模块后的典型输出示例:
web1.example.com | CHANGED | rc=0 >>
/home/user
CHANGED
:表示命令执行成功并产生了输出。rc=0
:表示返回码为0
,命令执行成功。- 输出:
/home/user
是命令的标准输出。
如果命令执行失败,例如命令语法错误或权限不足,会返回类似如下的错误:
web1.example.com | FAILED | rc=2 >>
/bin/sh: 1: cannot create /root/testfile: Permission denied
FAILED
:表示命令执行失败。rc=2
:表示返回码为2
,通常表示权限问题。- 错误信息:显示具体的错误原因,如权限被拒绝。
四、常见选项
4.1 chdir
-
功能:指定命令执行前切换到的目录。
-
用法:
ansible all -m shell -a "chdir=/tmp ls -l"
- 解释:在所有主机上切换到
/tmp
目录,然后执行ls -l
命令。
- 解释:在所有主机上切换到
4.2 creates
-
功能:在指定的文件或目录存在时,跳过命令执行。
-
用法:
ansible all -m shell -a "creates=/tmp/somefile touch /tmp/somefile"
- 解释:只有在
/tmp/somefile
文件不存在时,才会创建该文件。
- 解释:只有在
4.3 removes
-
功能:在指定的文件或目录不存在时,跳过命令执行。
-
用法:
ansible all -m shell -a "removes=/tmp/somefile rm -f /tmp/somefile"
- 解释:只有在
/tmp/somefile
文件存在时,才会删除它。
- 解释:只有在
4.4 warn
-
功能:控制是否显示关于使用
shell
模块的警告。默认为yes
,可以设置为no
来禁用警告。 -
用法:
ansible all -m shell -a "warn=no echo 'Hello, world!'"
- 解释:在所有主机上执行命令,并且不会显示使用
shell
模块的警告信息。
- 解释:在所有主机上执行命令,并且不会显示使用
五、注意事项
- 安全性:由于
shell
模块执行的命令通过 shell 解释器,因此有可能受到 shell 注入攻击的威胁。使用shell
模块时应特别注意处理不受信任的输入。 - 模块适用性:
shell
模块非常强大,但除非需要使用 shell 的特性,否则应优先考虑使用更安全的command
模块。 - 返回码:
shell
模块会返回执行命令的标准输出、错误输出和返回码(rc
),这有助于判断命令执行的成功与否。