Ansible模块介绍——命令模块

@[toc]A

命令模块

  • command
  • shell
  • raw
  • script

应尽量避免使用这三个模块来执行命令,因为其他的模块大部分都具有幂等性,可以自动进行更改跟踪。command、shell、raw不具备幂等性。

**注:**幂等性:简单来讲,就是输入相同,输出相同,无论多少 次比如说,确认接口,如果传入订单号,返回确认OK,如果已经确认过了,再次调用确认接口,返回如 果还是确认OK,那么这个接口就是满足幂等性。

command、shell、raw、script的区别

command、shell模块:

  • 相同点:要求受管主机上安装python

  • 不同点:

    command可以在受管主机上执行 shell 命令,但是不支持环境变量和操作符(例如 ‘|’, ‘<’, ‘>’, ‘&’)

    shell模块调用的/bin/sh指令执行

raw模块:

  • 不需要受管主机上安装Python,直接使用远程 shell 运行命令,通常用于无法安装Python的系统(例如 网络设备等)。

script模块:

  • 在远程主机上执行脚本文件 ,和 raw 模块一样,不要求目标主机上已经装好 python。

command模块参数

名称必选备注
chdirno运行command命令前先cd到这个目录
createsno如果这个参数对应的文件存在,就不运行command
free_formyes需要执行的脚本(没有真正的参数为free_form)
executableno改变用来执行命令的shell,应该是可执行文件的绝对路径
removesno如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反
stdinno将命令的stdin设置为指定的值

free_form参数:必须参数,指定需要远程执行的命令。需要说明一点,free_form参数与其他参数(如果想要使用一个参数,那么则需要为这个参数赋值,也就是name=value模式)并不相同。比如,当我们想要在远程主机上执行 ls 命令时,我们并不需要写成free_form=ls这样写反而是错误的,因为并没有任何参数的名字是free_form,当我们想要在远程主机中执行ls命令时,直接写成ls即可。因为command模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为free_form

列出指定目录下的文件

[root@centos7 ~]# ansible web -m command -a "ls /root"
 172.20.21.120 | SUCCESS | rc=0 >>
 anaconda-ks.cfg
 test.sh
 whoami.rst  
 
[root@centos7 ~]# ansible test -m command -a "ls /root creates=test.sh"     当文件test.sh存在不执行前面命令
 172.20.21.120 | SUCCESS | rc=0 >>
 skipped, since test.sh exists
 
[root@centos7 ~]# ansible test -m command -a "ls /root removes=test.sh1"    当文件不存在不执行前面命令
 172.20.21.120 | SUCCESS | rc=0 >>
 skipped, since test.sh1 does not exist
在这个里面,首先更换目录到root目录中,然后查看test.sh是否存在,如果存在,那么命令不会执行;如果不存在,那么执行命令。
在这里也可以看到,命令是必须存在的,但是**没有参数名为free_form参数**。


切换目录执行命令
[root@centos7 ~]# ansible test -m command -a "cat test.sh chdir=/root"
 172.20.21.120 | SUCCESS | rc=0 >>
 \#!/bin/bash
 i=0
 echo $((i+1))
 
[root@centos7 ~]# ansible test -m command -a "sh test.sh chdir=/root"
 172.20.21.120 | SUCCESS | rc=0 >>
 1
 
无法使用管道符
[root@centos7 ~]# ansible test -m command -a "ls /root | grep test"
 172.20.21.120 | FAILED | rc=2 >>
 /root:
 anaconda-ks.cfg
 test.sh
initial-setup-ks.cfgls: 无法访问'|': 没有那个文件或目录
ls: 无法访问'grep': 没有那个文件或目录non-zero return code

shell模块

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

名称必选备注
chdirno运行command命令先cd到这个目录
createsno如果这个参数对应的文件存在,就不运行command
executableno改变用来执行命令的shell,应该是可执行文件的绝对路径。
free_formyes需要执行的脚本(没有真正的参数为free_form)
removesno如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反
stdinno将命令的stdin设置为指定的值

切换目录,执行命令并保持输出

[root@centos7 ~]# ansible test -m shell -a "sh test.sh > result chdir=/root"
 172.20.21.120 | SUCCESS | rc=0 >>

[root@centos7 ~]# ansible test -m shell -a "cat result chdir=/root"
 172.20.21.120 | SUCCESS | rc=0 >>

raw模块

  • raw模块主要执行一些低级的ssh命令,而不是通过command模块
  • raw模块只适用于下列两种场景,第一种情况是在较老的(Python 2.4和之前的版本)主机上,另一种情况是对任何没有安装Python的设备(如路由器)。 在任何其他情况下,使用shell或command模块更为合适。
  • 就像script模块一样,raw不需要远程系统上的python
名称必选备注
executableno改变用来执行命令的shell,应该是可执行文件的绝对路径。
free_formyes需要执行的脚本(没有真正的参数为free_form)
[root@centos7 ~]# ansible test -m raw -a "pwd"
 172.20.21.120 | SUCCESS | rc=0 >>
 /root
 Shared connection to 172.20.21.120 closed.

script模块

名称必选备注
chdirno运行command命令前先cd到这个目录
createsno如果这个参数对应的文件存在,就不运行command
decryptno此选项控制使用保管库的源文件的自动解密
free_formyes需要执行脚本的本地文件路径(没有真正的参数为free_form)
removesno如果这个参数对应的文件不存在,就不运行command,与creates参数的作用相反

在远程主机上执行脚本

[root@centos7 ~]# ansible test -m script -a "test.sh chdir=/tmp"
 172.20.21.120 | SUCCESS => {
   "changed": true, 
   "rc": 0, 
   "stderr": "Shared connection to 172.20.21.120 closed.\r\n", 
   "stdout": "/tmp\r\n", 
   "stdout_lines": [
     "/tmp"
   ]
 }

**注:**和shell模块的不同,shell模块是要求客户端上有这个脚本才能执行;script 是要求ansible服务端有这个脚本就可以了,执行的时候是不会拷贝这个脚本到客户端的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

阿瑾~

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值