command模块
- command模块是ansible的默认模块,也就是指定了-m command
- 只支持简单的命令执行
- 命令中不能出现变量
- 命令中不能出现特殊符号(<,>,|,:.&)
远程查看主机名
[root@localhost ~]# ansible all -m command -a 'hostname'
192.168.1.100 | CHANGED | rc=0 >>
web0
192.168.1.102 | CHANGED | rc=0 >>
web2
192.168.1.101 | CHANGED | rc=0 >>
web1
192.168.1.99 | CHANGED | rc=0 >>
localhost.localdomain
远程创建文件
ansible webservers -a 'touch /home/test.txt'
192.168.1.101 | CHANGED | rc=0 >>
192.168.1.100 | CHANGED | rc=0 >>
192.168.1.102 | CHANGED | rc=0 >>
[root@localhost ~]# ansible webservers -a 'ls /home/'
192.168.1.101 | CHANGED | rc=0 >>
test.txt
192.168.1.100 | CHANGED | rc=0 >>
test.txt
192.168.1.102 | CHANGED | rc=0 >>
test.txt
远程创建用户test
[root@localhost ~]# ansible webservers -m command -a 'useradd test'
192.168.1.101 | CHANGED | rc=0 >>
192.168.1.100 | CHANGED | rc=0 >>
192.168.1.102 | CHANGED | rc=0 >>
- cmd: 要在远程主机上执行的命令及其参数,是必需参数。
- chdir: 在执行命令前更改到指定目录。
- creates: 如果指定的文件存在,则不运行命令。
- removes: 如果指定的文件不存在,则不运行命令。
shell模块(万能模块)
远程查看时间并保存到指定文件
[root@localhost ~]# ansible webservers -m shell -a "date > /home/test.txt "
192.168.1.100 | CHANGED | rc=0 >>
192.168.1.102 | CHANGED | rc=0 >>
192.168.1.101 | CHANGED | rc=0 >>
[root@localhost ~]# ansible webservers -m shell -a "cat /home/test.txt "
192.168.1.101 | CHANGED | rc=0 >>
2025年 02月 17日 星期一 17:24:20 CST
192.168.1.100 | CHANGED | rc=0 >>
2025年 02月 17日 星期一 17:24:20 CST
192.168.1.102 | CHANGED | rc=0 >>
2025年 02月 17日 星期一 17:24:20 CST
远程执行复杂Linux命令
[root@localhost ~]# ansible webservers -m shell -a "mkdir -p /home/test/111;echo "hostname" > /home/test/111/ht.sh;chmod +x /home/test/111/ht.sh;/home/test/111/ht.sh "
192.168.1.102 | CHANGED | rc=0 >>
web2
192.168.1.101 | CHANGED | rc=0 >>
web1
192.168.1.100 | CHANGED | rc=0 >>
web0
[root@localhost ~]# ansible webservers -m shell -a "cat /home/test/111/ht.sh"
192.168.1.100 | CHANGED | rc=0 >>
hostname
192.168.1.101 | CHANGED | rc=0 >>
hostname
192.168.1.102 | CHANGED | rc=0 >>
hostname
copy模块
将数据推送到远程主机结点,无法拉取数据到本地
常用的参数
- src: 本地文件路径,指明你要复制的源文件。
- dest: 远程目标路径,指定文件要复制到的目标位置。
- owner: 设置目标文件的拥有者。
- group: 设置目标文件的所属用户组。
- mode: 设置目标文件的权限(如0644)。
- backup: 如果设置为yes,Ansible将在覆盖目标文件之前备份旧文件。
- force: 是否强制覆盖目标文件。默认为yes,表示如果文件存在,则覆盖它。如果设置为no,则不会覆盖目标文件。
- content: 允许你直接将内容写入文件,而不需要依赖本地源文件。
简单发送文件
[root@localhost home]# ansible webservers -m copy -a "src=/home/test.txt dest=/home/test.txt"
192.168.1.102 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test.txt",
"gid": 0,
"group": "root",
"md5sum": "a33a3609d7749c9366909df2760e0f55",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:home_root_t:s0",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1739787035.135853-15248-112730240381777/source",
"state": "file",
"uid": 0
}
192.168.1.100 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test.txt",
"gid": 0,
"group": "root",
"md5sum": "a33a3609d7749c9366909df2760e0f55",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:home_root_t:s0",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1739787034.8420439-15246-251065852174674/source",
"state": "file",
"uid": 0
}
192.168.1.101 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test.txt",
"gid": 0,
"group": "root",
"md5sum": "a33a3609d7749c9366909df2760e0f55",
"mode": "0644",
"owner": "root",
"secontext": "unconfined_u:object_r:home_root_t:s0",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1739787034.9700463-15247-182115174466719/source",
"state": "file",
"uid": 0
}
[root@localhost home]# ansible webservers -m copy -a "src=/home/test.log dest=/home/test.txt"
192.168.1.100 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/home/test.txt",
"secontext": "unconfined_u:object_r:home_root_t:s0",
"size": 13,
"state": "file",
"uid": 0
}
192.168.1.102 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/home/test.txt",
"secontext": "unconfined_u:object_r:home_root_t:s0",
"size": 13,
"state": "file",
"uid": 0
}
192.168.1.101 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test.txt",
"gid": 0,
"group": "root",
"mode": "0644",
"owner": "root",
"path": "/home/test.txt",
"secontext": "unconfined_u:object_r:home_root_t:s0",
"size": 13,
"state": "file",
"uid": 0
}
ansible的模块记录了文件属性,文件的MD5值,判断了文件是否变化,如果没有发生变化,不做处理,提升批量管理的效率
发送文件并且指定文件属性
[root@localhost home]# ansible webservers -m copy -a "src=/home/test.log dest=/home/test/111/ht.sh owner=test mode=600"
192.168.1.100 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test/111/ht.sh",
"gid": 0,
"group": "root",
"md5sum": "a33a3609d7749c9366909df2760e0f55",
"mode": "0600",
"owner": "test",
"secontext": "unconfined_u:object_r:user_home_t:s0",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1739787778.9725525-15369-213488798312190/source",
"state": "file",
"uid": 1000
}
192.168.1.102 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test/111/ht.sh",
"gid": 0,
"group": "root",
"md5sum": "a33a3609d7749c9366909df2760e0f55",
"mode": "0600",
"owner": "test",
"secontext": "unconfined_u:object_r:user_home_t:s0",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1739787778.9794927-15371-248776510729889/source",
"state": "file",
"uid": 1000
}
192.168.1.101 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "62459c2b6ddc2d955c0372d9327b60259510e928",
"dest": "/home/test/111/ht.sh",
"gid": 0,
"group": "root",
"md5sum": "a33a3609d7749c9366909df2760e0f55",
"mode": "0600",
"owner": "test",
"secontext": "unconfined_u:object_r:user_home_t:s0",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1739787778.972367-15370-236613693451300/source",
"state": "file",
"uid": 1000
}
[root@localhost home]# ansible webservers -m shell -a "ls -l /home/test/111/ht.sh"
192.168.1.101 | CHANGED | rc=0 >>
-rw-------. 1 test root 13 2月 17 18:23 /home/test/111/ht.sh
192.168.1.102 | CHANGED | rc=0 >>
-rw-------. 1 test root 13 2月 17 18:23 /home/test/111/ht.sh
192.168.1.100 | CHANGED | rc=0 >>
-rw-------. 1 test root 13 2月 17 18:23 /home/test/111/ht.sh
发送文件且做好备份
直接在命令中添加backup=yes参数
[root@localhost home]# ansible webservers -m copy -a "src=/home/test.log dest=/home/test/111/ht.sh backup=yes"
192.168.1.100 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/home/test/111/ht.sh.10759.2025-02-17@18:29:04~",
"changed": true,
"checksum": "133da17c9e6c9255dcc4b17123a2ffe9406ca633",
"dest": "/home/test/111/ht.sh",
"gid": 0,
"group": "root",
"md5sum": "8b32df0e95abe075b89b769f13661c5b",
"mode": "0600",
"owner": "test",
"secontext": "unconfined_u:object_r:user_home_t:s0",
"size": 25,
"src": "/root/.ansible/tmp/ansible-tmp-1739788142.9244893-15527-131926242226088/source",
"state": "file",
"uid": 1000
}
192.168.1.101 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/home/test/111/ht.sh.10780.2025-02-17@18:29:04~",
"changed": true,
"checksum": "133da17c9e6c9255dcc4b17123a2ffe9406ca633",
"dest": "/home/test/111/ht.sh",
"gid": 0,
"group": "root",
"md5sum": "8b32df0e95abe075b89b769f13661c5b",
"mode": "0600",
"owner": "test",
"secontext": "unconfined_u:object_r:user_home_t:s0",
"size": 25,
"src": "/root/.ansible/tmp/ansible-tmp-1739788142.9834116-15528-184526183865167/source",
"state": "file",
"uid": 1000
}
192.168.1.102 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/home/test/111/ht.sh.10688.2025-02-17@18:29:04~",
"changed": true,
"checksum": "133da17c9e6c9255dcc4b17123a2ffe9406ca633",
"dest": "/home/test/111/ht.sh",
"gid": 0,
"group": "root",
"md5sum": "8b32df0e95abe075b89b769f13661c5b",
"mode": "0600",
"owner": "test",
"secontext": "unconfined_u:object_r:user_home_t:s0",
"size": 25,
"src": "/root/.ansible/tmp/ansible-tmp-1739788142.9529815-15529-214010968136679/source",
"state": "file",
"uid": 1000
}
[root@localhost home]# ansible webservers -m shell -a "ls -l /home/test/111/"
192.168.1.102 | CHANGED | rc=0 >>
总用量 8
-rw-------. 1 test root 25 2月 17 18:29 ht.sh
-rw-------. 1 test root 13 2月 17 18:23 ht.sh.10688.2025-02-17@18:29:04~
192.168.1.100 | CHANGED | rc=0 >>
总用量 8
-rw-------. 1 test root 25 2月 17 18:29 ht.sh
-rw-------. 1 test root 13 2月 17 18:23 ht.sh.10759.2025-02-17@18:29:04~
192.168.1.101 | CHANGED | rc=0 >>
总用量 8
-rw-------. 1 test root 25 2月 17 18:29 ht.sh
-rw-------. 1 test root 13 2月 17 18:23 ht.sh.10780.2025-02-17@18:29:04~
[root@localhost home]# ansible webservers -m shell -a "cat /home/test/111/ht.sh"
192.168.1.100 | CHANGED | rc=0 >>
who are you?
are you ok?
192.168.1.102 | CHANGED | rc=0 >>
who are you?
are you ok?
192.168.1.101 | CHANGED | rc=0 >>
who are you?
are you ok?
[root@localhost home]# ansible webservers -m shell -a "cat /home/test/111/ht.sh.*"
192.168.1.101 | CHANGED | rc=0 >>
who are you?
192.168.1.100 | CHANGED | rc=0 >>
who are you?
192.168.1.102 | CHANGED | rc=0 >>
who are you?