Ansible-command模块和shell模块


ansible command与shell模块

两个模块都是用于执行linux命令的,这对于命令熟悉的工程师来说,用起来非常high。

shell模块与command模块差不多(command模块不能执行一些类似$HOME,>,<,|等符号,但shell可以)

https://docs.ansible.com/ansible/latest/modules/command_module.html

https://docs.ansible.com/ansible/latest/modules/shell_module.html

一、command模块

  • command模块用于在给的的节点上运行系统命令,比如echo hello。
  • 本质是调用Python模块执行Linux命令,客户端要有Python才能执行。
  • 它不会通过shell处理命令,因此不支持像$HOME这样的变量和,以及<, >, |, ;&等都是无效的。也就是在command模块中无法使用管道符

模块参数

名称 必选 备注
chdir no 运行command命令前先cd到这个目录
creates no 如果这个参数对应的文件存在,就不运行command
free_form yes 需要执行的脚本(没有真正的参数为free_form)
executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径。
removes no 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反
stdin(2.4后新增) no 将命令的stdin设置为指定的值
[root@manage01 ~]# ansible -m command 192.168.8.21 -a "ls /root"
192.168.8.21 | CHANGED | rc=0 >>
anaconda-ks.cfg
initial-setup-ks.cfg
nginx.service
nginx_study

[root@manage01 ~]# ansible -m command 192.168.8.21 -a "echo 'baism hello' > /tmp/baism_123"
192.168.8.21 | CHANGED | rc=0 >>
baism hello > /tmp/baism_123

[root@manage01 ~]# ansible -m command 192.168.8.21 -a "cat /tmp/baism_123"
192.168.8.21 | FAILED | rc=1 >>
cat: /tmp/baism_123: 没有那个文件或目录non-zero return code


发现没有/tmp/baism_123 证明上一条命令未能执行成功

注意事项

若要通过shell运行一个命令,比如<, >, |等,你实际上需要shell模块。 command模块更安全,因为它不受用户环境的影响 从版本2.4开始,executable参数被删除。如果您需要此参数,请改用shell模块。 对于Windows节点,请改用win_command模块。

二、shell模块

让远程主机在shell进程下执行命令,从而支持shell的特性,如管道等。与command模块几乎相同,但在执行命令的时候使用的是/bin/sh

模块参数

名称 必选 备注
chdir no 运行command命令前先cd到这个目录
creates no 如果这个参数对应的文件存在,就不运行command
executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径。
free_form yes 需要执行的脚本(没有真正的参数为free_form)
removes no 如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反
stdin(2.4后新增) no 将命令的stdin设置为指定的值
[root@manage01 ~]# ansible -m shell 192.168.8.21 -a "ls /root"
192.168.8.21 | CHANGED | rc=0 >>
anaconda-ks.cfg
initial-setup-ks.cfg
nginx.service
nginx_study


[root@manage01 ~]# ansible -m shell 192.168.8.21 -a "echo 'hello world' > /tmp/baishuming"
192.168.8.21 | CHANGED | rc=0 >>


[root@manage01 ~]# ansible -m shell 192.168.8.21 -a "cat /tmp/baishuming"
192.168.8.21 | CHANGED | rc=0 >>
hello world


注意shell模块不是什么命令都能使用,比如vim这样的交互命令,不建议大家去记忆哪些命令不可以,大家只要养成任何在生产环境里的命令都要先在测试环境里测试一下的习惯就好。

三、raw模块

最原始的方式运行命令(不依赖python,仅通过ssh实现)

raw模块主要用于执行一些低级的,脏的SSH命令,而不是通过command模块。 raw模块只适用于下列两种场景,第一种情况是在较老的(Python 2.4和之前的版本)主机上,另一种情况是对任何没有安装Python的设备(如路由器)。 在任何其他情况下,使用shell或command模块更为合适。 就像script模块一样,raw模块不需要远程系统上的python

名称 必选 备注
executable no 改变用来执行命令的shell,应该是可执行文件的绝对路径。
free_form yes 需要执行的脚本(没有真正的参数为free_form)
案列:清除yum缓存
[root@manage01 ~] ansible 192.168.8.21 -m raw -a "yum clean all"
192.168.1.134 | CHANGED | rc=0 >>
已加载插件:fastestmirror
正在清理软件源: c7-media epel
Cleaning up list of fastest mirrors
Other repos take up 180 M of disk space (use --verbose for details)
Shared connection to 192.168.1.134 closed