ansible常用命令模块

一、概述


command 模块可以帮助我们在远程主机上执行命令。


注意:使用 command 模块在远程主机中执行命令时,不会经过远程主机的 shell 处理,在使用 command 模块时,如果需要执行的命令中含有重定向、管道符等操作时,这些符号也会失效,比如”<”, “>”, “|”, “;” 和 “&” 这些符号,如果你需要这些功能,可以参考后面介绍的 shell 模块。还有一点需要注意,如果远程节点是 windows 操作系统,则需要使用 win_command 模块。


执行 ansible 时,不加 -m 默认使用 command ,可以在 /etc/ansible/ansible.cfg 中修改。

 

# default module name for /usr/bin/ansible
#module_name = command

 

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

chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。

 

creates参数 :看到 creates,你可能会从字面上理解这个参数,但是使用这个参数并不会帮助我们创建文件,它的作用是当指定的文件存在时,就不执行对应命令,比如,如果 /testdir/test文件存在,就不执行我们指定的命令。

removes参数 :与 creates 参数的作用正好相反,它的作用是当指定的文件不存在时,就不执行对应命令,比如,如果 /testdir/tests 文件不存在,就不执行我们指定的命令,此参数并不会帮助我们删除文件。

 

三、示例

[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "ls"
ansible-demo3 | SUCCESS | rc=0 >>
anaconda-ks.cfg
CentOS7-Base-163.repo
Centos-7.repo

 

上面命令表示在 ansible-demo3 主机上执行 ls 命令,因为使用的是 root 用户,所以默认情况下,ls 出的结果是 ansible-demo3 主机中 root 用户家目录中的文件列表。

 

[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "chdir=/testdir ls"
ansible-demo3 | SUCCESS | rc=0 >>
testfile1
testfile2

chdir 参数表示执行命令之前,会先进入到指定的目录中,所以上面命令表示查看 ansible-demo3 主机上 /testdir 目录中的文件列表,返回显示有2个文件。

 

[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "creates=/testdir/testfile1 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
skipped, since /testdir/testfile1 exists

[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "creates=/testdir/testfile3 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
test

 

上面命令表示 /testdir/testfile1 文件存在于远程主机中,则不执行对应命令。/testdir/testfile3 不存在,才执行”echo test”命令。

 

[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "removes=/testdir/testfile1 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
test

[root@ansible-manager ~]# ansible ansible-demo3 -m command -a "removes=/testdir/testfile3 echo test"
ansible-demo3 | SUCCESS | rc=0 >>
skipped, since /testdir/testfile3 does not exist

 

上面命令表示 /testdir/testfile3 文件不存在于远程主机中,则不执行对应命令。/testdir/testfile1 存在,才执行”echo test”命令。

四、总结
本节介绍了 Ansible 常用模块之 command 模块,并举例说明如何使用,下节我们介绍 shell 模块。 

 

一、概述

shell 模块可以帮助我们在远程主机上执行命令。与 command 模块不同的是,shell 模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh 程序处理。

 

二、常用参数
free_form参数 :必须参数,指定需要远程执行的命令,但是并没有具体的一个参数名叫free_form,具体解释参考 command 模块。

chdir参数 : 此参数的作用就是指定一个目录,在执行对应的命令之前,会先进入到 chdir 参数指定的目录中。

creates参数 :使用此参数指定一个文件,当指定的文件存在时,就不执行对应命令,可参考command 模块中的解释。

removes参数 :使用此参数指定一个文件,当指定的文件不存在时,就不执行对应命令,可参考 command 模块中的解释。

executable参数:默认情况下,shell 模块会调用远程主机中的 /bin/sh 去执行对应的命令,通常情况下,远程主机中的默认 shell 都是 bash。如果你想要使用其他类型的 shell 执行命令,则可以使用此参数指定某种类型的 shell 去执行对应的命令。

 

指定 shell 文件时,需要使用绝对路径。

 

三、示例
shell 模块中 chdir、creates、removes 参数的作用与 command 模块中的作用都是相同的,此处不再举例。

[root@ansible-manager ~]# ansible ansible-demo3 -m shell -a "chdir=/testdir echo mytest > test"
ansible-demo3 | SUCCESS | rc=0 >>

 

使用 shell 模块可以在远程服务器上执行命令,它支持管道与重定向等符号。上面命令打印出mytest并写入test文件。

 

 

[root@ansible-manager ~]# ansible ansible-demo3 -m shell -a "chdir=/testdir ls"
ansible-demo3 | SUCCESS | rc=0 >>
test
testfile1
testfile2

 

上面命令列出了 /testdir 下面的文件,多了个 test 文件。

 

[root@ansible-manager ~]# ansible ansible-demo3 -m shell -a "chdir=/testdir cat test"
ansible-demo3 | SUCCESS | rc=0 >>
mytest

 

上面命令列出了 test 文件的内容。

由于 command 比较安全有可预知性,所以我们平时用的时候,最好用 command。需要用到 shell 特性的时候,再用 shell。

四、总结
本节介绍了 Ansible 常用模块之 shell 模块,并举例说明如何使用,下节我们介绍 script 模块。

 

一、概述

script 模块可以帮助我们在远程主机上执行 ansible 管理主机上的脚本,也就是说,脚本一直存在于 ansible 管理主机本地,不需要手动拷贝到远程主机后再执行

二、常用参数
free_form参数 :必须参数,指定需要执行的脚本,脚本位于 ansible 管理主机本地,并没有具体的一个参数名叫 free_form,具体解释请参考 command 模块。

chdir参数 : 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到 chdir 参数指定的目录中。

creates参数 :使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考 command 模块中的解释。

removes参数 :使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考 command 模块中的解释。

三、示例

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

 

其中 testscript.sh 脚本为打印 ‘testscript’ 字符串。

 

[root@ansible-manager ~]# cat /testdir/testscript.sh
echo 'testscript'

 

上面命令表示 ansible 主机中的 /testdir/testscript.sh 脚本将在 ansible-demo3 主机中执行,执行此脚本之前,会先进入到 ansible-demo3 主机中的 /opt 目录

[root@ansible-manager ~]# ansible ansible-demo3 -m script -a "creates=/testdir/testfile1 /testdir/testscript.sh"
ansible-demo3 | SKIPPED

上面命令表示,ansible-demo3 主机中的 /testdir/testfile1文件已经存在,ansible 主机中的 /testdir/testscript.sh 脚本将不会在 ansible-demo3 主机中执行。

[root@ansible-demo3 ~]# ls /testdir/
test testfile1 testfile2

 

由于 testfile1 已经存在,则 SKIPPED。

[root@ansible-manager ~]# ansible ansible-demo3 -m script -a "removes=/testdir/testfile1 /testdir/testscript.sh"
ansible-demo3 | SUCCESS => {
"changed": true, 
"rc": 0, 
"stderr": "Shared connection to ansible-demo3 closed.\r\n", 
"stdout": "testscript\r\n", 
"stdout_lines": [
"testscript"
]
}

 

上面命令表示,ansible-demo3 主机中的 /testdir/testfile1 文件存在,ansible 主机中的 /testdir/testscript.sh 脚本则会在 ansible-demo3 主机中执行。

四、总结
本节介绍了 Ansible 常用模块之 script 模块,并举例说明如何使用,下节我们介绍 copy 模块。

 

三、script模块
模块介绍
script模块可以帮助我们在远程主机上执行ansible主机上的脚本,也就是说,脚本一直存在于ansible主机本地,不需要手动拷贝到远程主机后再执行。

学习此模块之前,请先参考本文中的command模块。

模块参数
此处我们介绍一些script模块的常用参数,你可以先对这些参数有一个大概了解,然后再看小示例。

参数 含义
free_form参数 必须参数,指定需要执行的脚本,脚本位于ansible主机本地,并没有具体的一个参数名叫free_form,具体解释参考command模块。
chdir参数 此参数的作用就是指定一个远程主机中的目录,在执行对应的脚本之前,会先进入到chdir参数指定的目录中。
creates参数 使用此参数指定一个远程主机中的文件,当指定的文件存在时,就不执行对应脚本,可参考command模块中的解释。
removes参数 使用此参数指定一个远程主机中的文件,当指定的文件不存在时,就不执行对应脚本,可参考command模块中的解释。
模型示例
上述参数对应的ad-hoc示例命令如下:

如下命令表示ansible主机中的/testdir/redhat-test.sh脚本将在testB主机中执行,执行此脚本之前,会先进入到testB主机中的/opt目录

脚本内容

[root@server4 ~]# cd /testdir/
[root@server4 testdir]# cat redhat-test.sh 
#!/bin/bash
echo "hello ansible"

 

执行命令:

[root@server4 testdir]ansible testB -m script -a "chdir=/opt /testdir/redhat-test.sh"

关于ansbile工具的shell、command、script、raw模块的区别和使用场景

command模块 [执行远程命令]

[root@node1 ansible]# ansible testservers -m command -a 'uname -n'

 

script模块 [在远程主机执行主控端的shell/python脚本 ] (使用相对路径)

[root@node1 ansible]# ansible testservers -m script -a '/etc/ansible/test.sh

 

shell模块 [执行远程主机的shell/python脚本]

[root@node1 ansible]# ansible testservers -m shell -a 'bash /root/test.sh'


raw模块 [类似于command模块、支持管道传递]

[root@node1 ansible]# ansible testservers -m raw -a "ifconfig eth0 |sed -n 2p |awk '{print \$2}' |awk -F: '{print \$2}'"

 

 

 

 

Ansible可以执行命令的模块有三个:

  command

  shell

  raw

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

command、shell、raw不具备幂等性。

 

command、shell模块:

  要求受管主机上安装Python。command可以在受管主机上执行shell命令,但是不支持环境变量和操作符(例如 '|', '<', '>', '&'),shell模块调用的/bin/sh指令执行。

 

raw模块:

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

  

posted @ 2020-09-28 18:00  chengxuyonghu  阅读(513)  评论(0编辑  收藏  举报