ansible常用模块详解

概述

ansible中的模块涉及到系统管理、文件操作、软件包、服务进程、用户组、网络、命令脚本、数据库、云 / 容器、定时任务、权限、校验、工具辅助等,这里只编写一些常用的

命令执行类模块

ping

ping模块通常用于检测控制机与被控制机之间的连通性

示例:

复制代码
# all表示所有主机
root@master:~# ansible all -m ping
10.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:文件不存在则不执行命令

示例:

复制代码
root@master:~# ansible web -m command -a 'hostname -I'
10.37.120.9 | CHANGED | rc=0 >>
10.37.120.9 172.17.0.1 100.95.185.192 fdbd:dc01:ff:324:7f74:8dda:726c:4312 
10.37.99.63 | CHANGED | rc=0 >>
10.37.99.63 172.17.0.1 100.117.144.128 fdbd:dc01:ff:318:71d3:f428:1bc5:b474 

shell

调用 /bin/sh,支持管道、重定向、&&、变量、通配符,高危,慎用。

核心参数同command:

  • cmd:要执行的命令
  • chdir:执行前切换目录
  • creates:文件存在则不执行命令
  • removes:文件不存在则不执行命令

示例:

复制代码
root@master:~# ansible web -m shell -a 'echo test > /root/test.txt'
10.37.120.9 | CHANGED | rc=0 >>

10.37.99.63 | CHANGED | rc=0 >>

root@master:~# ansible web -m shell -a 'cat /root/test.txt'
10.37.120.9 | CHANGED | rc=0 >>
test
10.37.99.63 | CHANGED | rc=0 >>
test

### 如果使用command会报错
root@master:~# ansible web -m command -a 'echo test > /root/test1.txt'
10.37.120.9 | CHANGED | rc=0 >>
test > /root/test1.txt
10.37.99.63 | CHANGED | rc=0 >>
test > /root/test1.txt
root@master:~# 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 | rc=1 >>
cat: /root/test1.txt: No such file or directoryThe command exited with a non-zero return code.
10.37.99.63 | FAILED | rc=1 >>
cat: /root/test1.txt: No such file or directoryThe command exited with a non-zero return code.

script

把本地机器的脚本自动上传远程并执行,无需手动拷贝。

参数:

  • chdir:远程执行目录
  • creates/removes:条件执行

示例:

复制代码
# 编写脚本
root@master:~# cat check.sh 
#!/bin/bash
hostname
hostname -I
pwd

## 使用ansible执行
root@master:~# 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"
    ]
}

文件目录操作模块

file

file通常用于创建、删除文件或者目录,修改文件权限,创建文件软连接或者硬连接。

核心参数:

  • path:路径,必须要写,
  • src:source源,源文件一般用于link(创建软链接)用于指定源文件
  • state:状态,具体要做什么,操作文件、目录、软链接
    • state=directory 创建目录
    • state=file(默认)更新文件,如果文件不存在也不创建
    • state=link 创建软链接
    • state=touch 创建文件
    • state=absent 删除文件、目录,如果是目录会递归删除
  • mode:创建并修改权限,建议mode="0600"
  • owner:指定用户
  • group:指定用户组

示例:

  • 创建/tmp/test.txt文件

    root@master:~# ansible web -m file -a 'path=/tmp/test.txt state=touch mode=0600 owner=root'
    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
    }

    查看一下

    root@master:~# ansible web -m command -a 'stat /tmp/test.txt'
    10.37.120.9 | CHANGED | rc=0 >>
    File: /tmp/test.txt
    Size: 0 Blocks: 0 IO Block: 4096 regular empty file
    Device: fe02h/65026d Inode: 138238 Links: 1
    Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
    Access: 2026-07-10 11:06:51.634161945 +0800
    Modify: 2026-07-10 11:06:51.634161945 +0800
    Change: 2026-07-10 11:06:51.634161945 +0800
    Birth: -
    10.37.99.63 | CHANGED | rc=0 >>
    File: /tmp/test.txt
    Size: 0 Blocks: 0 IO Block: 4096 regular empty file
    Device: fe02h/65026d Inode: 138231 Links: 1
    Access: (0600/-rw-------) Uid: ( 0/ root) Gid: ( 0/ root)
    Access: 2026-07-10 11:06:51.652183477 +0800
    Modify: 2026-07-10 11:06:51.652183477 +0800
    Change: 2026-07-10 11:06:51.652183477 +0800
    Birth:

  • 创建目录 /tmp/a/s/d/f/g/

    root@master:~# ansible web -m file -a 'path=/tmp/a/s/d/f/g/ state=directory'
    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
    }

  • 创建软连接

    root@master:~# ansible web -m file -a 'path=/tmp/hosts src=/etc/hosts state=link'
    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
    }

    查看一下

    root@master:~# ansible web -m command -a 'stat /tmp/hosts'
    10.37.120.9 | CHANGED | rc=0 >>
    File: /tmp/hosts -> /etc/hosts
    Size: 10 Blocks: 0 IO Block: 4096 symbolic link
    Device: fe02h/65026d Inode: 138239 Links: 1
    Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
    Access: 2026-07-10 11:12:09.209070628 +0800
    Modify: 2026-07-10 11:12:09.209070628 +0800
    Change: 2026-07-10 11:12:09.209070628 +0800
    Birth: -
    10.37.99.63 | CHANGED | rc=0 >>
    File: /tmp/hosts -> /etc/hosts
    Size: 10 Blocks: 0 IO Block: 4096 symbolic link
    Device: fe02h/65026d Inode: 138328 Links: 1
    Access: (0777/lrwxrwxrwx) Uid: ( 0/ root) Gid: ( 0/ root)
    Access: 2026-07-10 11:12:09.221759696 +0800
    Modify: 2026-07-10 11:12:09.221759696 +0800
    Change: 2026-07-10 11:12:09.221759696 +0800
    Birth: -

copy

推送本地文件至远程,支持内容写入、权限、备份。

参数:

  • src:主控端文件位置
  • dest: 要将源文件复制到远程机器的绝对路径,必选项。
  • owner:文件复制过去后的所有者
  • group:文件复制过去后的所属组
  • mode:文件的权限设定,执行a+x这种方式
  • backup:backup=yes 会在覆盖前进行备份,文件内容有变化或区别,backup=no则直接覆盖
  • directory_mode:递归设定目录的权限。
  • content:直接写入文本(替代本地文件)

示例:

  • 将本地文件复制到远程

    准备文件root@master:~# cat check.sh

    #!/bin/bash
    hostname
    hostname -I
    pwd

    执行ansible命令

    root@master:~# ansible web -m copy -a 'src=/root/check.sh dest=/data00/check.sh backup=yes owner=root'
    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
    }

    查看一下

    root@master:~# ansible web -m command -a 'stat /data00/check.sh'
    10.37.120.9 | CHANGED | rc=0 >>
    File: /data00/check.sh
    Size: 37 Blocks: 8 IO Block: 4096 regular file
    Device: fe10h/65040d Inode: 12 Links: 1
    Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
    Access: 2026-07-10 11:19:01.251030921 +0800
    Modify: 2026-07-10 11:19:01.251031637 +0800
    Change: 2026-07-10 11:19:01.249954932 +0800
    Birth: -
    10.37.99.63 | CHANGED | rc=0 >>
    File: /data00/check.sh
    Size: 37 Blocks: 8 IO Block: 4096 regular file
    Device: fe10h/65040d Inode: 12 Links: 1
    Access: (0644/-rw-r--r--) Uid: ( 0/ root) Gid: ( 0/ root)
    Access: 2026-07-10 11:19:01.268908262 +0800
    Modify: 2026-07-10 11:19:01.268908977 +0800
    Change: 2026-07-10 11:19:01.267692999 +0800
    Birth: -

  • 使用content直接写入内容

    root@master:~# ansible web -m copy -a 'dest=/data00/check.sh backup=yes content=123'
    10.37.120.9 | CHANGED => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    # 可以看到这里已经备份了
    "backup_file": "/data00/check.sh.153008.2026-07-10@11: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-10@11: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文件将被保存

示例:

复制代码
root@master:~# 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参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
  • backrefs :默认是yes,backrefs为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 :当要操作的文件并不存在时,是否创建对应的文件。

示例:

复制代码
# 在指定文件中写入内容
root@master:~# ansible web -m lineinfile -a 'path=/data00/check.sh line=456'
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"
}

# 查看一下
root@master:~# ansible web -m command -a 'cat /data00/check.sh'
10.37.120.9 | CHANGED | rc=0 >>
123
456
10.37.99.63 | CHANGED | rc=0 >>
123
456

blockinfile

插入 / 删除一段多行内容,自带# BEGIN/END ANSIBLE MANAGED BLOCK标记,只管理标记内内容。

参数:

  • path :必须参数,指定要操作的文件。
  • block : 使用此参数指定文本块内容。
  • state :当想要删除对应的文本时,需要将state参数的值设置为absent,absent为缺席之意,表示删除,state的默认值为present。
  • insertafter :借助insertafter参数可以将文本插入到"指定的行"之后,insertafter参数的值可以设置为EOF或者正则表达式,EOF为End Of File之意,表示插入到文档的末尾,默认情况下insertafter的值为EOF,如果将insertafter的值设置为正则表达式,表示将文本插入到匹配到正则的行之后,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
  • insertbefore :借助insertbefore参数可以将文本插入到"指定的行"之前,insertbefore参数的值可以设置为BOF或者正则表达式,BOF为Begin Of File之意,表示插入到文档的开头,如果将insertbefore的值设置为正则表达式,表示将文本插入到匹配到正则的行之前,如果正则没有匹配到任何行,则插入到文件末尾,当使用backrefs参数时,此参数会被忽略。
  • backup :是否在修改文件之前对文件进行备份。
  • create :当要操作的文件并不存在时,是否创建对应的文件。
  • marker:默认值# {mark} ANSIBLE MANAGED BLOCK,自定义标记行的模板。{mark} 是一个占位符,会被替换为 BEGIN 和 END

示例:

复制代码
root@master:~# ansible web -m blockinfile -a "path=/data00/check.sh block=123456789 marker='# {mark} ANSIBLE MANAGED BLOCK'"
10.37.120.9 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "msg": "Block inserted"
}
10.37.99.63 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "msg": "Block inserted"
}

synchronize

synchronize 模块是 Ansible 中对 rsync 工具的一个封装。它主要用于在控制节点和远程主机之间高效地同步文件和目录。

它利用 rsync 的增量传输算法,同步时只传输发生变化的部分,因此在处理大量文件或大文件时,效率远超 copy 等模块

参数:

  • src:定义要同步的源文件或目录。
  • dest:目标路径。定义同步的目标位置。
  • mode:定义同步方式。push(推送,默认)将本地文件推送到远程;pull(拉取)则将远程文件拉取到本地。
  • archive:默认值yes,开启归档模式。相当于 rsync 的 -a 选项,会保留权限、所有者、时间戳等文件属性。
  • compress:默认值为no,yes代表传输压缩。在传输过程中压缩数据,可节省带宽,但会消耗一些 CPU 资源。
  • delete:默认值为no,yes删除无关文件。删除目标端存在但源端不存在的文件,使目标完全与源一致。
  • rsync_opts:自定义 rsync 参数。可以传递额外的 rsync 命令行选项,如 --exclude。
  • recursive:默认值yes,递归目录。当 archive=yes 时自动启用。
  • dest_port:默认值为22,目标 SSH 端口。如果目标主机的 SSH 端口不是默认的 22,则需指定。
  • delay_updates:delay_updates 参数控制 rsync 的 --delay-updates 选项。启用后,rsync 会将更新的文件先放到一个临时目录,等所有文件都传输完成,再一次性重命名到目标位置,第一次pull时需要将此参数设置为no

示例:

  • 将远程文件拉取到本地

    root@master:~# ansible web -m synchronize -a 'src=/etc dest=/data00/ mode=pull compress=yes archive=yes delay_updates=no'
    10.37.99.63 | CHANGED => {
    "changed": true,
    "cmd": "/usr/bin/rsync --compress --archive --rsh='/usr/bin/ssh -S none -o StrictHostKeyChecking=no -o UserKnownHostsFile=/dev/null' --out-format='<>%i %n%L' 10.37.99.63:/etc /data00/",
    #....省略万字内容
    }

软件包管理模块

yum

CentOS/RHEL 系统安装软件

核心参数:

  • name:服务名
  • state:进行的操作,安装、更新、删除
    • installed/present: 安装软件包,默认不更新(默认值)
    • removed/absen: 删除软件包,类似 yum removed,需要慎用
    • latest:安装或更新(安装最新版本)

示例:安装常用的软件htop,iotop、tree、sshpass

复制代码
root@master:/data00# ansible web -m yum -a 'name=htop,iotop,tree,sshpass state=latest'

apt

Ubuntu/Debian系统安装软件

核心参数:

  • name:服务名
  • update_cache:更新 apt 缓存
  • state:进行的操作,安装、更新、删除
    • installed/present: 安装软件包,默认不更新(默认值)
    • removed/absen: 删除软件包,类似 yum removed,需要慎用
    • latest:安装或更新(安装最新版本)

示例:安装常用的软件htop,iotop、tree、sshpass

复制代码
root@master:/data00# ansible web -m apt -a 'name=htop,iotop,tree,sshpass state=latest'  -e 'ansible_python_interpreter=/usr/bin/python3'

unarchive

支持 tar/zip,可解压本地包或远程 url 包。

核心参数:

  • src:指定要解压的归档文件路径。路径含义取决于 remote_src 的设置
  • desc:解压目标目录的绝对路径。注意:该目录必须已存在,模块不会自动创建
  • remote_src:控制源文件位置。no 表示文件在控制节点;yes 表示文件已在远程主机
  • owner:指定解压后的所属用户
  • group:指定解压后的所属组
  • mode:设置解压后文件和目录的权限。建议使用引号括起来的八进制数,如 '0755'

示例:

  • 压缩包在控制节点,解压到目标主机

    root@master:~# ansible web -m unarchive -a 'src=/root/jdk.tar.gz dest=/usr/local remote_src=no'

  • 压缩包在目标主机,直接解压

    root@master:~# ansible web -m unarchive -a 'src=/root/jdk.tar.gz dest=/usr/local remote_src=yes'

archive

压缩某个文件

参数:

  • path:要归档的源文件或目录路径。支持列表,可指定多个路径。
  • dest:目标归档文件的完整路径。如果 path 是多个,则此参数必须多个
  • format:归档格式。可选:gz (tar.gz)、bz2、xz、zip、tar。
  • remove:归档成功后,是否删除源文件,yes是,no否
  • owner:归档后的所属人
  • group:归档后的所属组
  • mode:归档后的权限

示例:

复制代码
ansible all -m archive -a "path=/var/log dest=/tmp/logs.tar.gz format=gz"

服务、进程模块

systemd

用于管理服务启动、停止、重启、开机自启动等

参数:

  • name:服务名称
  • enabled:指定服务是否开机自启动,yes代表开机自启动,no代表不是
  • state:表示服务的状态
    • started:启动
    • stopped:停止
    • restarted:重启
    • reloaded:重新加载

示例:

复制代码
root@master:~# ansible web -m systemd -a 'name=sshd enabled=yes state=started'
10.37.120.9 | SUCCESS => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": false,
    "enabled": true,
	# ... 省略万字内容
}

用户模块

user

远程批量管理用户,例如创建、删除用户,修改用户密码等

参数:

  • name:指定用户名
  • uid:用户id
  • shell:指定命令解释器
  • create_home:是否创建家目录,no表示不创建,yes表示创建
  • state:管理用户的动作
    • present:添加用户
    • adsent:删除用户
  • password:设置密码

示例:

  • 所有机器创建虚拟用户web_www

    root@master:~# ansible all -m user -a 'name=web_www state=present create_home=no shell=/sbin/nologin'
    10.37.120.9 | CHANGED => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "comment": "",
    "create_home": false,
    "group": 2003,
    "groups": "",
    "home": "/home/web_www",
    "name": "web_www",
    "shell": "/sbin/nologin",
    "state": "present",
    "system": false,
    "uid": 2002
    }
    10.37.99.63 | CHANGED => {
    "ansible_facts": {
    "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "comment": "",
    "create_home": false,
    "group": 2003,
    "groups": "",
    "home": "/home/web_www",
    "name": "web_www",
    "shell": "/sbin/nologin",
    "state": "present",
    "system": false,
    "uid": 2002
    }

    root@master:~# ansible all -m command -a 'id web_www'
    10.37.120.9 | CHANGED | rc=0 >>
    uid=2002(web_www) gid=2003(web_www) groups=2003(web_www)
    10.37.99.63 | CHANGED | rc=0 >>
    uid=2002(web_www) gid=2003(web_www) groups=2003(web_www)

  • 创建www用户,并设置密码为www

    root@master:~# ansible all -m user -a "name=www state=present shell=/bin/bash password={{ 'www' | password_hash('sha512', '1') }}"

group

group是批量管理用户组的模块

核心参数:

  • name:用户组名
  • state:管理用户组的动作
    • present:添加用户组
    • adsent:删除用户组
  • gid:用户组的id

示例:

复制代码
root@master:~# ansible web -m group -a 'name=test gid=11111 state=present'
10.37.120.9 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "gid": 11111,
    "name": "test",
    "state": "present",
    "system": false
}
10.37.99.63 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "gid": 11111,
    "name": "test",
    "state": "present",
    "system": false
}

定时任务模块

cron

设置Linux系统的定时任务

参数:

  • name:定时任务的名称
  • minute:指定分钟
  • hour:指定小时
  • day:指定天
  • month:指定月份
  • week:指定周几
  • job:要执行的命令或脚本(即 cron 中的命令行部分)。
  • state:处理任务的动作
    • present:表示新增任务
    • absent:表示删除匹配的任务

示例:

复制代码
# 每天凌晨2点备份日志
root@master:~# ansible all -m cron -a "name='nginx backup' minute=0 hour=2 job='/bin/sh /data/sh/log_backup.sh >> /var/log/backup.log' state=present"
10.37.120.9 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "envs": [],
    "jobs": [
        "nginx backup"
    ]
}
10.37.99.63 | CHANGED => {
    "ansible_facts": {
        "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": true,
    "envs": [],
    "jobs": [
        "nginx backup"
    ]
}

其它常用模块

mount

该模块可实现mount命令进行挂载,并修改/etc/fstab实现永久挂载

参数:

  • src:源地址,需要挂载的设备或文件信息
  • path:挂载点,目标挂载点
  • fstype:指定文件系统,xfs,ext4,nfs...mount命令的-t选项
  • state:进行操作
    • absent:立即卸载,并删除/etc/fstab里的配置
    • umounted:立即卸载,但是不会删除/etc/fstab里的配置
    • present:不会立即挂载,但会修改/etc/fstab里的信息
    • mounted:立即挂载,并修改/etc/fstab里的信息
    • remounted:重新挂载

debug

使用 Ansible 最痛苦的就是远程命令没有生效,但又看不到报错信息,Debug 就是为了解决这个烦恼。

参数:

  • msg:要打印的自定义消息。支持使用 {{ }} 模板来引用变量。

  • var:指定要打印的变量名(注意:不包含 {{ }} 包裹)。Ansible 会自动输出该变量的完整结构和值。

  • 控制输出所需的详细程度级别。只有 Ansible 的 -v 级别大于或等于此值时,消息才会显示。数值范围 0-4。

    root@master:~# ansible web -m debug -a "msg=当前正在部署nginx"
    10.37.120.9 | SUCCESS => {
    "msg": "当前正在部署nginx"
    }
    10.37.99.63 | SUCCESS => {
    "msg": "当前正在部署nginx"
    }

setup

setup 模块是 Ansible 的核心模块之一,专门用于收集被管理主机的系统信息(Facts)。

这些 Facts 信息非常丰富,涵盖了操作系统、网络、硬件、软件等方方面面。它是实现自动化运维中"智能决策"的基础。

参数:

  • filter:按名称过滤。只返回匹配指定模式(支持 fnmatch 风格通配符)的 Facts。例如,只获取网络相关信息。
  • gather_subset:按类别过滤。指定要收集的 Facts 类别。可选项包括 all、network、hardware、virtual、min 等
  • fact_path:自定义 Facts 路径。指定一个目录,setup 模块会读取该目录下的文件(如 .fact 文件),将其内容作为自定义 Facts 一并收集
  • gather_timeout:超时设置。设置收集 Facts 的超时时间(秒),适用于网络较慢的环境

示例:

  • 获取所有的系统信息

    会返回一个特别庞大的json串

    root@master:~# ansible all -m setup

  • 过滤系统信息,获取IP

    root@master:~# ansible all -m setup -a 'filter=ansible_locally_reachable_ips'
    10.37.120.9 | SUCCESS => {
    "ansible_facts": {
    "ansible_locally_reachable_ips": {
    "ipv4": [
    "10.37.120.9",
    "10.96.0.1",
    "10.96.0.10",
    "10.96.1.170",
    "10.96.3.164",
    "10.96.3.191",
    "100.95.185.192",
    "127.0.0.0/8",
    "127.0.0.1",
    "172.17.0.1"
    ],
    "ipv6": [
    "::1",
    "fdbd:dc01:ff:324:7f74:8dda:726c:4312",
    "fe80::216:3eff:fe6e:be29",
    "fe80::d03d:73ff:fed7:397c",
    "fe80::ecee:eeff:feee:eeee"
    ]
    },
    "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": false
    }
    10.37.99.63 | SUCCESS => {
    "ansible_facts": {
    "ansible_locally_reachable_ips": {
    "ipv4": [
    "10.37.99.63",
    "10.96.0.1",
    "10.96.0.10",
    "10.96.1.170",
    "10.96.3.164",
    "10.96.3.191",
    "100.117.144.128",
    "127.0.0.0/8",
    "127.0.0.1",
    "172.17.0.1"
    ],
    "ipv6": [
    "::1",
    "fdbd:dc01:ff:318:71d3:f428:1bc5:b474",
    "fe80::216:3eff:fe0f:60d7",
    "fe80::ecee:eeff:feee:eeee"
    ]
    },
    "discovered_interpreter_python": "/usr/local/bin/python3.13"
    },
    "changed": false
    }

get_url

get_url 模块是 Ansible 中用于从 HTTP、HTTPS 或 FTP 服务器下载文件到远程主机的核心模块。

核心参数:

  • url:要下载的文件的完整 URL 地址(支持 http、https、ftp)。
  • dest:下载目标路径。如果是一个目录,则使用 URL 中的文件名;如果是一个文件路径,则直接保存为指定文件名。
  • headers:自定义 HTTP 头,以字典格式传递。可用于添加认证 Token 或 Cookie。
  • timeout:超时时间

示例:

复制代码
ansible node1 -m get_url -a "url=https://example.com/file.tar.gz dest=/tmp/"