命令执行类模块

命令执行类模块
ping模块通常用于检测控制机与被控制机之间的连通性示例all表示所有主机rootmaster:~# ansible all -m ping10.37.120.9 | SUCCESS {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: false,“ping”: “pong”}10.37.99.63 | SUCCESS {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: false,“ping”: “pong”}command执行简单命令不支持管道、重定向、变量 $、、|、、速度最快无 shell 解析风险。核心参数cmd要执行的命令chdir执行前切换目录creates文件存在则不执行命令removes文件不存在则不执行命令示例rootmaster:~# ansible web -m command -a ‘hostname -I’10.37.120.9 | CHANGED | rc0 10.37.120.9 172.17.0.1 100.95.185.192 fdbd:dc01:ff:324:7f74:8dda:726c:431210.37.99.63 | CHANGED | rc0 10.37.99.63 172.17.0.1 100.117.144.128 fdbd:dc01:ff:318:71d3:f428:1bc5:b474shell调用 /bin/sh支持管道、重定向、、变量、通配符高危慎用。核心参数同commandcmd要执行的命令chdir执行前切换目录creates文件存在则不执行命令removes文件不存在则不执行命令示例rootmaster:~# ansible web -m shell -a ‘echo test /root/test.txt’10.37.120.9 | CHANGED | rc0 10.37.99.63 | CHANGED | rc0 rootmaster:~# ansible web -m shell -a ‘cat /root/test.txt’10.37.120.9 | CHANGED | rc0 test10.37.99.63 | CHANGED | rc0 test如果使用command会报错rootmaster:~# ansible web -m command -a ‘echo test /root/test1.txt’10.37.120.9 | CHANGED | rc0 test /root/test1.txt10.37.99.63 | CHANGED | rc0 test /root/test1.txtrootmaster:~# ansible web -m command -a ‘cat /root/test1.txt’[ERROR]: Task failed: Module failed: The command exited with a non-zero return code.Origin: adhoc ‘command’ task{‘action’: ‘command’, ‘args’: {‘_raw_params’: ‘cat /root/test1.txt’}, ‘timeout’: 0, ‘async_val’: 0, ‘poll’: 15}10.37.120.9 | FAILED | rc1 cat: /root/test1.txt: No such file or directoryThe command exited with a non-zero return code.10.37.99.63 | FAILED | rc1 cat: /root/test1.txt: No such file or directoryThe command exited with a non-zero return code.script把本地机器的脚本自动上传远程并执行无需手动拷贝。参数chdir远程执行目录creates/removes条件执行示例编写脚本rootmaster:~# cat check.sh#!/bin/bashhostnamehostname -Ipwd使用ansible执行rootmaster:~# ansible web -m script -a ‘chdir/data00 /root/check.sh’10.37.120.9 | CHANGED {“changed”: true,“rc”: 0,“stderr”: “Shared connection to 10.37.120.9 closed.\r\n”,“stderr_lines”: [“Shared connection to 10.37.120.9 closed.”],“stdout”: “node02\r\n10.37.120.9 172.17.0.1 100.95.185.192 fdbd:dc01:ff:324:7f74:8dda:726c:4312 \r\n/data00\r\n”,“stdout_lines”: [“node02”,10.37.120.9 172.17.0.1 100.95.185.192 fdbd:dc01:ff:324:7f74:8dda:726c:4312 ,“/data00”]}10.37.99.63 | CHANGED {“changed”: true,“rc”: 0,“stderr”: “Shared connection to 10.37.99.63 closed.\r\n”,“stderr_lines”: [“Shared connection to 10.37.99.63 closed.”],“stdout”: “node01\r\n10.37.99.63 172.17.0.1 100.117.144.128 fdbd:dc01:ff:318:71d3:f428:1bc5:b474 \r\n/data00\r\n”,“stdout_lines”: [“node01”,10.37.99.63 172.17.0.1 100.117.144.128 fdbd:dc01:ff:318:71d3:f428:1bc5:b474 ,“/data00”]}回到顶部文件目录操作模块filefile通常用于创建、删除文件或者目录修改文件权限创建文件软连接或者硬连接。核心参数path路径必须要写srcsource源源文件一般用于link创建软链接用于指定源文件state状态具体要做什么操作文件、目录、软链接statedirectory 创建目录statefile(默认)更新文件如果文件不存在也不创建statelink 创建软链接statetouch 创建文件stateabsent 删除文件、目录如果是目录会递归删除mode创建并修改权限建议mode“0600”owner指定用户group指定用户组示例创建/tmp/test.txt文件rootmaster:~# ansible web -m file -a ‘path/tmp/test.txt statetouch mode0600 ownerroot’10.37.120.9 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“dest”: “/tmp/test.txt”,“gid”: 0,“group”: “root”,“mode”: “0600”,“owner”: “root”,“size”: 0,“state”: “file”,“uid”: 0}10.37.99.63 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“dest”: “/tmp/test.txt”,“gid”: 0,“group”: “root”,“mode”: “0600”,“owner”: “root”,“size”: 0,“state”: “file”,“uid”: 0}查看一下rootmaster:~# ansible web -m command -a ‘stat /tmp/test.txt’10.37.120.9 | CHANGED | rc0 File: /tmp/test.txtSize: 0 Blocks: 0 IO Block: 4096 regular empty fileDevice: fe02h/65026d Inode: 138238 Links: 1Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2026-07-10 11:06:51.634161945 0800Modify: 2026-07-10 11:06:51.634161945 0800Change: 2026-07-10 11:06:51.634161945 0800Birth: -10.37.99.63 | CHANGED | rc0 File: /tmp/test.txtSize: 0 Blocks: 0 IO Block: 4096 regular empty fileDevice: fe02h/65026d Inode: 138231 Links: 1Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2026-07-10 11:06:51.652183477 0800Modify: 2026-07-10 11:06:51.652183477 0800Change: 2026-07-10 11:06:51.652183477 0800Birth:创建目录 /tmp/a/s/d/f/g/rootmaster:~# ansible web -m file -a ‘path/tmp/a/s/d/f/g/ statedirectory’10.37.120.9 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“gid”: 0,“group”: “root”,“mode”: “0755”,“owner”: “root”,“path”: “/tmp/a/s/d/f/g/”,“size”: 4096,“state”: “directory”,“uid”: 0}10.37.99.63 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“gid”: 0,“group”: “root”,“mode”: “0755”,“owner”: “root”,“path”: “/tmp/a/s/d/f/g/”,“size”: 4096,“state”: “directory”,“uid”: 0}创建软连接rootmaster:~# ansible web -m file -a ‘path/tmp/hosts src/etc/hosts statelink’10.37.120.9 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“dest”: “/tmp/hosts”,“gid”: 0,“group”: “root”,“mode”: “0777”,“owner”: “root”,“size”: 10,“src”: “/etc/hosts”,“state”: “link”,“uid”: 0}10.37.99.63 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“dest”: “/tmp/hosts”,“gid”: 0,“group”: “root”,“mode”: “0777”,“owner”: “root”,“size”: 10,“src”: “/etc/hosts”,“state”: “link”,“uid”: 0}查看一下rootmaster:~# ansible web -m command -a ‘stat /tmp/hosts’10.37.120.9 | CHANGED | rc0 File: /tmp/hosts - /etc/hostsSize: 10 Blocks: 0 IO Block: 4096 symbolic linkDevice: fe02h/65026d Inode: 138239 Links: 1Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2026-07-10 11:12:09.209070628 0800Modify: 2026-07-10 11:12:09.209070628 0800Change: 2026-07-10 11:12:09.209070628 0800Birth: -10.37.99.63 | CHANGED | rc0 File: /tmp/hosts - /etc/hostsSize: 10 Blocks: 0 IO Block: 4096 symbolic linkDevice: fe02h/65026d Inode: 138328 Links: 1Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2026-07-10 11:12:09.221759696 0800Modify: 2026-07-10 11:12:09.221759696 0800Change: 2026-07-10 11:12:09.221759696 0800Birth: -copy推送本地文件至远程支持内容写入、权限、备份。参数src主控端文件位置dest 要将源文件复制到远程机器的绝对路径必选项。owner文件复制过去后的所有者group文件复制过去后的所属组mode文件的权限设定执行ax这种方式backupbackupyes 会在覆盖前进行备份文件内容有变化或区别backupno则直接覆盖directory_mode:递归设定目录的权限。content直接写入文本替代本地文件示例将本地文件复制到远程准备文件rootmaster:~# cat check.sh#!/bin/bashhostnamehostname -Ipwd执行ansible命令rootmaster:~# ansible web -m copy -a ‘src/root/check.sh dest/data00/check.sh backupyes ownerroot’10.37.120.9 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“checksum”: “f458a04709a54eed4539d771bc761b2d79cdfbbb”,“dest”: “/data00/check.sh”,“gid”: 0,“group”: “root”,“md5sum”: “20f734e70a45e0df35c2cde454bb94c2”,“mode”: “0644”,“owner”: “root”,“size”: 37,“src”: “/root/.ansible/tmp/ansible-tmp-1783653540.5392613-1973974-7642431353431/.source.sh”,“state”: “file”,“uid”: 0}10.37.99.63 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“changed”: true,“checksum”: “f458a04709a54eed4539d771bc761b2d79cdfbbb”,“dest”: “/data00/check.sh”,“gid”: 0,“group”: “root”,“md5sum”: “20f734e70a45e0df35c2cde454bb94c2”,“mode”: “0644”,“owner”: “root”,“size”: 37,“src”: “/root/.ansible/tmp/ansible-tmp-1783653540.542557-1973973-858857181216/.source.sh”,“state”: “file”,“uid”: 0}查看一下rootmaster:~# ansible web -m command -a ‘stat /data00/check.sh’10.37.120.9 | CHANGED | rc0 File: /data00/check.shSize: 37 Blocks: 8 IO Block: 4096 regular fileDevice: fe10h/65040d Inode: 12 Links: 1Access: (0644/-rw-r–r–) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2026-07-10 11:19:01.251030921 0800Modify: 2026-07-10 11:19:01.251031637 0800Change: 2026-07-10 11:19:01.249954932 0800Birth: -10.37.99.63 | CHANGED | rc0 File: /data00/check.shSize: 37 Blocks: 8 IO Block: 4096 regular fileDevice: fe10h/65040d Inode: 12 Links: 1Access: (0644/-rw-r–r–) Uid: ( 0/ root) Gid: ( 0/ root)Access: 2026-07-10 11:19:01.268908262 0800Modify: 2026-07-10 11:19:01.268908977 0800Change: 2026-07-10 11:19:01.267692999 0800Birth: -使用content直接写入内容rootmaster:~# ansible web -m copy -a ‘dest/data00/check.sh backupyes content123’10.37.120.9 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},# 可以看到这里已经备份了“backup_file”: “/data00/check.sh.153008.2026-07-1011:21:34~”,“changed”: true,“checksum”: “40bd001563085fc35165329ea1ff5c5ecbdbbeef”,“dest”: “/data00/check.sh”,“gid”: 0,“group”: “root”,“md5sum”: “202cb962ac59075b964b07152d234b70”,“mode”: “0644”,“owner”: “root”,“size”: 3,“src”: “/root/.ansible/tmp/ansible-tmp-1783653694.0950441-1977803-183011264332546/.source.sh”,“state”: “file”,“uid”: 0}10.37.99.63 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“backup_file”: “/data00/check.sh.160197.2026-07-1011:21:34~”,“changed”: true,“checksum”: “40bd001563085fc35165329ea1ff5c5ecbdbbeef”,“dest”: “/data00/check.sh”,“gid”: 0,“group”: “root”,“md5sum”: “202cb962ac59075b964b07152d234b70”,“mode”: “0644”,“owner”: “root”,“size”: 3,“src”: “/root/.ansible/tmp/ansible-tmp-1783653694.092595-1977802-74590298560295/.source.sh”,“state”: “file”,“uid”: 0}fetch拉取远程文件到本地自动按主机名分目录存储仅支持文件不支持目录。核心参数src远程系统上要获取的文件。 这必须是一个文件而不是一个目录。 后续版本可能会支持递归提取。dest保存文件的目录。 例如如果dest目录是/backup在主机host.example.com上命名为/ etc/profile的src文件将被保存示例rootmaster:~# ansible web -m fetch -a ‘src/etc/hosts dest/data00’10.37.120.9 | CHANGED {“changed”: true,“checksum”: “ce9964c64b3d6c002d8a0fdc015009090fa5ccf0”,# 拉取到本地的这个目录下“dest”: “/data00/10.37.120.9/etc/hosts”,“file”: “/etc/hosts”,“md5sum”: “1b3869c148c86190b1b5c004a91adf0f”,“remote_checksum”: “ce9964c64b3d6c002d8a0fdc015009090fa5ccf0”,“remote_md5sum”: null}10.37.99.63 | CHANGED {“changed”: true,“checksum”: “a3f1671554da35a2b22a0a4c3d3f611528745891”,“dest”: “/data00/10.37.99.63/etc/hosts”,“file”: “/etc/hosts”,“md5sum”: “bea8ca6ca04563655de18130ddab5d22”,“remote_checksum”: “a3f1671554da35a2b22a0a4c3d3f611528745891”,“remote_md5sum”: null}lineinfile修改文件中的行,类似linux工具中的sed工具确保某一行文本存在于指定的文件中或者确保从文件中删除指定的文本即确保指定的文本不存在于文件中还可以根据正则表达式替换修改某一行文本参数path 必须参数指定要操作的文件。line : 使用此参数指定文本内容。regexp 使用正则表达式匹配对应的行当替换文本时如果有多行文本都能被匹配则只有最后面被匹配到的那行文本才会被替换当删除文本时如果有多行文本都能被匹配这么这些行都会被删除。state 当想要删除对应的文本时需要将state参数的值设置为absentabsent为缺席之意表示删除state的默认值为present。backrefs 默认是yesbackrefs为yes时如果没有匹配则文件保持不变。如果匹配了把匹配内容替被换为line内容backrefs为no时如果没有匹配,则添加一行line。如果匹配了则把匹配内容替被换为line内容。insertafter 借助insertafter参数可以将文本插入到“指定的行”之后insertafter参数的值可以设置为EOF或者正则表达式EOF为End Of File之意表示插入到文档的末尾默认情况下insertafter的值为EOF如果将insertafter的值设置为正则表达式表示将文本插入到匹配到正则的行之后如果正则没有匹配到任何行则插入到文件末尾当使用backrefs参数时此参数会被忽略。insertbefore 借助insertbefore参数可以将文本插入到“指定的行”之前insertbefore参数的值可以设置为BOF或者正则表达式BOF为Begin Of File之意表示插入到文档的开头如果将insertbefore的值设置为正则表达式表示将文本插入到匹配到正则的行之前如果正则没有匹配到任何行则插入到文件末尾当使用backrefs参数时此参数会被忽略。backup 是否在修改文件之前对文件进行备份。create 当要操作的文件并不存在时是否创建对应的文件。示例在指定文件中写入内容rootmaster:~# ansible web -m lineinfile -a ‘path/data00/check.sh line456’10.37.120.9 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“backup”: “”,“changed”: true,“msg”: “line added”}10.37.99.63 | CHANGED {“ansible_facts”: {“discovered_interpreter_python”: “/usr/local/bin/python3.13”},“backup”: “”,“changed”: true,“msg”: “line added”}查看一下rootmaster:~# ansible web -m command -a ‘cat /data00/check.sh’10.37.120.9 | CHANGED | rc0 12345610.37.99.63 | CHANGED | rc0 123456blockinfile插入 / 删除一段多行内容自带# BEGIN/END ANSIBLE MANAGED BLOCK标记只管理标记内内容。参数path 必须参数指定要操作的文件。block : 使用此参数指定文本块内容。state 当想要删除对应的文本时需要将state参数的值设置为absentabsent为缺席之意表示删除state的默认值为present。insertafter 借助insertafter参数可以将文本插入到“指定的行”之后insertafter参数的值可以设置为EOF或者正则表达式EOF为End Of File之意表示插入到文档的末尾默认情况下insertafter的值为EOF如果将insertafter的值设置为正则表达式表示将文本插入到匹配到正则的行之后如果正则没有匹配到任何行则插入到文件末尾当使用backrefs参数时此参数会被忽略。insertbefore 借助insertbefore参数可以将文本插入到“指定的行”之前insertbefore参数的值可以设置为B