1. command模块

功能:在远程主机执行 shell 命令;为默认模块,可省略 -m 选项;

注意:不支持管道命令 |

command模块的常用参数如下:

参数 说明
chdir DIR 执行ansible时,切换到指定的目录
creates FILE 如果文件FILE存在,则不执行命令
removes FILE 如果文件FILE存在,则执行命令
  • 示例一:command模块基础用法,在远端主机执行命令:

    [root@xuzhichao ~]# ansible 192.168.20.22 -a "id"
    192.168.20.22 | CHANGED | rc=0 >>
    uid=0(root) gid=0(root) groups=0(root)
    
  • 示例二:在被控端主机切换到指定目录,执行命令:

    [root@xuzhichao ~]# ansible 192.168.20.22 -a "chdir=/tmp pwd"
    192.168.20.22 | CHANGED | rc=0 >>
    /tmp
    
  • 示例三:creates:指定的文件存在时,不执行对应命令:

    [root@xuzhichao ~]# ansible 192.168.20.22 -a "creates=/etc/passwd ls"
    192.168.20.22 | SUCCESS | rc=0 >>
    skipped, since /etc/passwd exists   <==跳过,未执行;
    
  • 示例四:removes:与creates相反,指定的文件存在,则执行对应命令:

    [root@xuzhichao ~]# ansible 192.168.20.22 -a "removes=/etc/passwd ls"
    192.168.20.22 | CHANGED | rc=0 >>
    49857.html
    anaconda-ks.cfg
    apache-tomcat-10.0.7.tar.gz
    echo-nginx-module
    favicon.ico
    index.html
    lvs_rs.sh
    nginx-1.20.1
    nginx-1.20.1.tar.gz
    redis-4.2.0.tgz
    route.txt
    valgrind-3.15.0-11.el7.x86_64.rpm
    wordpress-3.1-zh_CN.zip
    

2. shell模块

功能:在远程主机执行 Shell 命令,支持管道等特殊符号的操作,比command模块使用广泛;

shell模块的常用参数如下:

参数 说明
chdir DIR 执行ansible时,切换到指定的目录
creates FILE 如果文件FILE存在,则不执行命令
removes FILE 如果文件FILE存在,则执行命令
  • shell模块支持管道命令,在被控主机上创建用户和密码:

    [root@xuzhichao ~]# ansible 192.168.20.22 -m shell -a 'useradd xu1'
    192.168.20.22 | CHANGED | rc=0 >>
    
    [root@xuzhichao ~]# ansible 192.168.20.22 -m shell -a 'echo 123456 | passwd --stdin xu1'
    192.168.20.22 | CHANGED | rc=0 >>
    Changing password for user xu1.
    passwd: all authentication tokens updated successfully.
    

注意:调用bash执行命令 类似cat /tmp/stanley.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt这些复杂命令,即使使用shell也可能会失败,解决办法:写到脚本中,copy到远程,执行,再把需要的结果拉回执行命令的机器。

注意:虽然可以使用shell模块完成绝大多数操作,但是shell模块无法很好的保证ansible的幂等性,因此建议使用以下各个专用模块完成特定的功能,可以保证幂等性。