ansible笔记(6):常用模块之命令类模块

  • A+
所属分类:ansible  运维技术

在本博客中,ansible是一个系列文章,我们会尽量以通俗易懂的方式总结ansible的相关知识点。

ansible系列博文直达链接:ansible轻松入门系列

"ansible系列"中的每篇文章都建立在前文的基础之上,所以,请按照顺序阅读这些文章,否则有可能在阅读中遇到障碍。

  

前文中,我们介绍了一些常用的文件类操作的模块,这篇文章中我们会介绍一些常用的命令类操作的模块。

  

command模块

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

 

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

 

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

free_form参数 :必须参数,指定需要远程执行的命令,需要说明一点,free_form参数与其他参数并不相同,在之前的模块示例中,如果想要使用一个参数,那么则需要为这个参数赋值,举个例子,之前的示例模块中,大多都有path参数,当我们需要指定要操作的文件时,通常需要对path参数赋值,比如,path=/testdir/test,表示我们想要操作/testdir/test文件,但是free_form参数则不同,"free_form"并不是一个"实际存在"的参数名,比如,当我们想要在远程主机上执行ls命令时,我们并不需要写成"free_form=ls" ,这样写反而是错误的,因为并没有任何参数的名字是free_form,当我们想要在远程主机中执行ls命令时,直接写成ls即可,这就是free_form参数的含义,因为command模块的作用是执行命令,所以,任何一个可以在远程主机上执行的命令都可以被称为free_form,如果你还是不明白,看下面的小示例就行了。

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

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

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

 

对应上述参数的ad-hoc示例命令如下:

 

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

 

chdir参数表示执行命令之前,会先进入到指定的目录中,所以如下命令表示查看test70主机上/testdir目录中的文件列表

 

如下命令表示/testdir/test文件如果存在于远程主机中,则不执行对应命令,如果不存在,才执行"echo test"命令

 

如下命令表示/testdir/test文件如果不存在于远程主机中,则不执行对应命令,如果存在,才执行"echo test"命令

 
 

   

shell模块

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

 

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

此处我们介绍一些shell模块的常用参数。

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模块中的作用都是相同的,此处不再举例。

 

使用shell模块可以在远程服务器上执行命令,它支持管道与重定向等符号。

 

如果你想要执行的命令需要csh解析,那么可以指定使用csh在远程主机上执行对应的命令,比如在如下示例中,我们使用csh的语法定义了一个数字类型的变量TestNum,然后将TestNum变量的值重定向到了/testdir/TestNumFile,在bash中,@符号不能用于定义变量,所以,可以使用executable指定需要的shell类型。

   

   

script模块

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

 

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

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

 

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

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

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

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

 

上述参数对应的ad-hoc示例命令如下:

 

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

 

如下命令表示,如果test70主机中的/opt/testfile文件已经存在,ansible主机中的/testdir/atest.sh脚本将不会在test70主机中执行,反之则执行。

 

如下命令表示,如果test70主机中的/opt/testfile文件不存在,ansible主机中的/testdir/atest.sh脚本将不会在test70主机中执行,反之则执行。

 

  

weinxin
我的微信公众号
关注"实用运维笔记"微信公众号,当博客中有新文章时,可第一时间得知哦~
朱双印

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

目前评论:9   其中:访客  6   博主  3

    • avatar 小土豆 4

      到此一游

      • avatar echo 6

        打卡

          • avatar 朱双印 Admin

            @echo 6,加油~

              • avatar echo 6

                @朱双印 那如果要 文件存在时 才执行命令呢,有这样参数?

            • avatar 小布布 1

              您好,有个问题想请教您。
              1、ansible批量执行命令的时候,希望的效果是使用远端服务器的$HOSTNAME变量,在远端创建一个目录。但实际操作中,使用的变量却是ansible服务器的HOSTNAME变量,求教怎么办?
              [root@nis-client ~]# echo $HOSTNAME
              nis-client
              [root@nis-client ~]# ansible A -m command -a “mkdir /root/pp/a/b/$HOSTNAME”
              [WARNING]: Consider using file module with state=directory rather than running
              mkdir

              192.168.113.155 | SUCCESS | rc=0 >>

              2、批量执行较长运行时间的命令时,如何将命令挂到远端服务器的后台使用,我用了nohup 或者 &都不行,求教如何处理。

                • avatar 朱双印 Admin

                  @小布布 1,当使用playbook时,可以使用{{ansible_hostname}}获取到主机名,因为它会先获取到facts的信息,但是在ad-hoc命令中无法使用这个变量,我暂时也没有办法在AD-hoc命令中直接获取到远程主机的环境变量,有一种笨办法,在ansible主机上写一个简单的.sh脚本,使用script模块执行,通过脚本获取到远程主机的本地变量,但是当执行script模块时还需要注意,script模块并不会读取远程主机的/etc/profile和~/.bash_profile中的环境变量配置,因为ansible使用no-login的方式,只会读取远程主机的 ~/.bashrc 或 /etc/bashrc 或 /etc/profile.d/*.sh 这些文件,所以如果你想要脚本能够读取到远程主机中的自定义的变量,需要把自定义变量写在上述能读取到的文件中,比如写在/etc/profile.d/的sh文件中,这样这样比较便于管理,规范,而且无论登录或非登录都可以读取到,比如JAVA_HOME这种变量
                  2,如果你是觉得ansible主机上的命令一直卡着,那么你可以在ansible主机上打开screen,在screen中进程中执行ansible命令,如果你是怕执行时间过长,ssh连接断开,那么你可以设置远程主机的连接时长。

                    • avatar 小布布 1

                      @朱双印 好的,谢谢您的指导,我回去测试一下。

                      • avatar drgcaosheng 4

                        @朱双印 是不是tmux也可以进行与screen相同的效果。