[root@tdm1 ~]# ansible web -m ping
47.93.98.117 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
这样就说明我们主机是连通状态,后续的操作正常进行
该模块可以在远程主机上执行命令,并将结果返回给本机
[root@tdm1 ~]# ansible web -m command -a 'netstat -lntup'
47.93.98.117 | CHANGED | rc=0 >>
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 551/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 1091/sshd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 1087/master
tcp6 0 0 :::111 :::* LISTEN 551/rpcbind
tcp6 0 0 ::1:25 :::* LISTEN 1087/master
udp 0 0 127.0.0.1:323 0.0.0.0:* 535/chronyd
udp 0 0 0.0.0.0:719 0.0.0.0:* 551/rpcbind
udp 0 0 0.0.0.0:68 0.0.0.0:* 795/dhclient
udp 0 0 0.0.0.0:111 0.0.0.0:* 551/rpcbind
udp6 0 0 ::1:323 :::* 535/chronyd
udp6 0 0 :::719 :::* 551/rpcbind
udp6 0 0 :::111 :::* 551/rpcbind
命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过 shell 进行处理,比如 $HOME 和操作如 "<",">","|",";","&" 工作(需要使用( shell )模块实现这些功能)。注意,该命令不支持| 管道命令。下面来看一看该模块下常用的几个命令:
chdir # 在执行命令之前,先切换到该目录
executable # 切换 shell 来执行命令,需要使用命令的绝对路径
free_form # 要执行的 Linux 指令,一般使用 Ansible 的 -a 参数代替。
creates # 一个文件名,当这个文件存在,则该命令不执行,可以用来做判断
removes # 一个文件名,这个文件不存在,则该命令不执行
测试
[root@tdm1 ~]# ansible web -m command -a 'chdir=/root/ ls'
47.93.98.117 | CHANGED | rc=0 >>
abc.txt
root@tdm1
tdm2.txt
[root@tdm1 ~]# ansible web -m command -a 'creates=/root/abc.txt ls' #如果abc.txt文件在,则不执行ls命令
47.93.98.117 | SUCCESS | rc=0 >>
skipped, since /root/abc.txt exists
[root@tdm1 ~]# ansible web -m command -a 'removes=/root/abc.txt ls' #如果abc.txt文件在,则执行ls命令
47.93.98.117 | CHANGED | rc=0 >>
abc.txt
root@tdm1
tdm2.txt
shell模块可以在远程主机上调用shell解释器运行命令,支持shell各种功能
[root@tdm1 ~]# ansible web -m shell -a 'cat /etc/passwd | grep root'
47.93.98.117 | CHANGED | rc=0 >>
root:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/root:/sbin/nologin
该模块用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限登
src #被复制到远程主机的本地文件。可以是绝对路径,也可以是相对路径。如果路径是一个目录,则会递归复制,用法类似于 "rsync"
content #用于替换 "src",可以直接指定文件的值
dest #必选项,将源文件复制到的远程主机的绝对路径
backup #当文件内容发生改变后,在覆盖之前把源文件备份,备份文件包含时间信息
directory_mode #递归设定目录的权限,默认为系统默认权限
force #当目标主机包含该文件,但内容不同时,设为 "yes",表示强制覆盖;设为 "no",表示目标主机的目标位置不存在该文件才复制。默认为 "yes"
others #所有的 file 模块中的选项可以在这里使用
测试
1.复制文件
[root@tdm1 ~]# ansible web -m copy -a 'src=/root/hello dest=/root/'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/root/hello",
"gid": 0,
"group": "root",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"mode": "0644",
"owner": "root",
"size": 0,
"src": "/root/.ansible/tmp/ansible-tmp-1693292079.78-22690-71230918611926/source",
"state": "file",
"uid": 0
}
#查看
[root@tdm2 ~]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 29 14:54 hello
[root@tdm2 ~]#
2.给定内容生成文件,并制定权限
[root@tdm1 ~]# ansible web -m copy -a 'content="I am king\n" dest=/root/name mode=666'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"checksum": "339cdafdbfde0e371162aded48e32d135045751d",
"dest": "/root/name",
"gid": 0,
"group": "root",
"md5sum": "fe4c40566a6a19975af1a3353cce507d",
"mode": "0666",
"owner": "root",
"size": 10,
"src": "/root/.ansible/tmp/ansible-tmp-1693292971.49-30234-99806702984952/source",
"state": "file",
"uid": 0
}
验证生成的文件和权限
[root@tdm1 ~]# ansible web -m shell -a 'ls -l /root'
47.93.98.117 | CHANGED | rc=0 >>
total 4
-rw-rw-rw- 1 root root 10 Aug 29 15:09 name
文件已经生成,权限是666
3.关于覆盖
修改文件内容,选择覆盖备份
[root@tdm1 ~]# ansible web -m copy -a 'content="I am kingdom\n" backup=yes dest=/root/name'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"backup_file": "/root/name.17027.2023-08-29@15:14:18~",
"changed": true,
"checksum": "43c4a1712a4f91fd0e42aba43e3ce661862de578",
"dest": "/root/name",
"gid": 0,
"group": "root",
"md5sum": "dd519715b7ca2285dd844ec066763aed",
"mode": "0666",
"owner": "root",
"size": 13,
"src": "/root/.ansible/tmp/ansible-tmp-1693293257.56-32694-151196578742125/source",
"state": "file",
"uid": 0
}
查看一下备份情况和文件内容
[root@tdm1 ~]# ansible web -m shell -a 'ls -l /root'
47.93.98.117 | CHANGED | rc=0 >>
total 8
-rw-rw-rw- 1 root root 13 Aug 29 15:14 name
-rw-rw-rw- 1 root root 10 Aug 29 15:09 name.17027.2023-08-29@15:14:18~
[root@tdm1 ~]# ansible web -m shell -a 'cat /root/name'
47.93.98.117 | CHANGED | rc=0 >>
I am kingdom
该模块主要用于设置文件的属性:创建文件、创建链接文件、删除文件登。
force #需要在两种情况下强制创建软链接,一种是源文件不存在,但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项:yes|no
group #定义文件/目录的属组。后面可以加上mode:定义文件/目录的权限
owner #定义文件/目录的属主。后面必须跟上path:定义文件/目录的路径
recurse #递归设置文件的属性,只对目录有效,后面跟上src:被链接的源文件路径,只应用于state=link的情况
dest #被链接到的路径,只应用于state=link的情况
state #状态,有以下选项:
directory:如果目录不存在,就创建目录
file: 即使文件不存在,也不会被创建
link: 创建软链接
hard: 创建硬链接
touch: 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间
absent: 删除目录、文件或者取消链接文件
1.创建目录
[root@tdm1 ~]# ansible web -m file -a 'path=/root/app state=directory'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 0,
"group": "root",
"mode": "0755",
"owner": "root",
"path": "/root/app",
"size": 4096,
"state": "directory",
"uid": 0
}
#查看目录
[root@tdm1 ~]# ansible web -m shell -a 'ls -l /root'
47.93.98.117 | CHANGED | rc=0 >>
total 4
drwxr-xr-x 2 root root 4096 Aug 29 15:38 app
2.创建链接文件
[root@tdm1 ~]# ansible web -m file -a 'path=/root/bbb.txt src=/root/aaa.txt state=link'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"dest": "/root/bbb.txt",
"gid": 0,
"group": "root",
"mode": "0777",
"owner": "root",
"size": 13,
"src": "/root/aaa.txt",
"state": "link",
"uid": 0
}
#查看链接
[root@tdm1 ~]# ansible web -m shell -a 'ls -l /root'
47.93.98.117 | CHANGED | rc=0 >>
total 0
-rw-r--r-- 1 root root 0 Aug 29 16:31 aaa.txt
lrwxrwxrwx 1 root root 13 Aug 29 16:32 bbb.txt -> /root/aaa.txt
3.删除文件
[root@tdm1 ~]# ansible web -m file -a 'path=/root/bbb.txt state=absent'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"path": "/root/bbb.txt",
"state": "absent"
}
#查看
[root@tdm1 ~]# ansible web -m shell -a 'ls -l /root'
47.93.98.117 | CHANGED | rc=0 >>
total 0
该模块用于从远程主机获取(复制)文件到本地
dest #用来存放文件的目录
src #在远程拉去的文件,必须是一个file,不能是目录
测试
[root@tdm1 ~]# ansible web -m fetch -a 'src=/root/test.txt dest=/root'
47.93.98.117 | CHANGED => {
"changed": true,
"checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"dest": "/root/47.93.98.117/root/test.txt",
"md5sum": "d41d8cd98f00b204e9800998ecf8427e",
"remote_checksum": "da39a3ee5e6b4b0d3255bfef95601890afd80709",
"remote_md5sum": null
}
#查看
[root@tdm1 ~]# ll
total 4
drwxr-xr-x 3 root root 4096 Aug 29 16:49 47.93.98.117
[root@tdm1 ~]# cd 47.93.98.117/
[root@tdm1 47.93.98.117]# ll
total 4
drwxr-xr-x 2 root root 4096 Aug 29 16:49 root
[root@tdm1 47.93.98.117]# cd root/
[root@tdm1 root]# ll
total 0
-rw-r--r-- 1 root root 0 Aug 29 16:49 test.txt
该模块适用于管理cron计划任务的,使用的语法跟我们的crontab文件中的语法一致,可以指定选项
day= #日应该运行的工作( 1-31, *, */2, )
hour= # 小时 ( 0-23, *, */2, )
minute= #分钟( 0-59, *, */2, )
month= # 月( 1-12, *, /2, )
weekday= # 周 ( 0-6 for Sunday-Saturday,, )
job= #指明运行的命令是什么
name= #定时任务描述
reboot # 任务在重启时运行,不建议使用,建议使用 special_time
special_time #特殊的时间范围,参数:reboot(重启时),annually(每年),monthly(每月),weekly(每周),daily(每天),hourly(每小时)
state #指定状态,present 表示添加定时任务,也是默认设置,absent 表示删除定时任务
user # 以哪个用户的身份执行
1.添加计划任务
[root@tdm1 root]# ansible web -m cron -a 'name="restart nginx every 5 minutes" minute=*/5 job="/usr/local/nginx/sbin/nginx -s reload >>/dev/dull 2>&1"'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": [
"restart nginx every 5 minutes"
]
}
#查看
[root@tdm1 root]# ansible web -m shell -a 'crontab -l'
47.93.98.117 | CHANGED | rc=0 >>
#Ansible: restart nginx every 5 minutes
*/5 * * * * /usr/local/nginx/sbin/nginx -s reload >>/dev/dull 2>&1
2.删除计划任务
[root@tdm1 root]# ansible web -m shell -a 'crontab -l'
47.93.98.117 | CHANGED | rc=0 >>
#Ansible: restart nginx every 5 minutes
*/5 * * * * /usr/local/nginx/sbin/nginx -s reload >>/dev/dull 2>&1
[root@tdm1 root]# ansible web -m cron -a 'name="restart nginx every 5 minutes" minute=*/5 job="/usr/local/nginx/sbin/nginx -s reload >>/dev/dull 2>&1" state=absent'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"envs": [],
"jobs": []
}
#查看
[root@tdm1 root]# ansible web -m shell -a 'crontab -l'
47.93.98.117 | CHANGED | rc=0 >>
该模块用于安装软件
name= #所安装的包的名称
state= #present--->安装, latest--->安装最新的, absent---> 卸载软件。
update_cache #强制更新yum的缓存
conf_file #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_pgp_check #是否禁止GPG checking,只用于presentor latest。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
测试
[root@tdm1 root]# ansible web -m yum -a 'name="htop" state=present'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"changes": {
"installed": [
"htop"
]
},
"msg": "",
"rc": 0,
"results": [
"Loaded plugins: fastestmirror\nLoading mirror speeds from cached hostfile\nResolving Dependencies\n--> Running transaction check\n---> Package htop.x86_64 0:2.2.0-3.el7 will be installed\n--> Finished Dependency Resolution\n\nDependencies Resolved\n\n================================================================================\n Package Arch Version Repository Size\n================================================================================\nInstalling:\n htop x86_64 2.2.0-3.el7 epel 103 k\n\nTransaction Summary\n================================================================================\nInstall 1 Package\n\nTotal download size: 103 k\nInstalled size: 218 k\nDownloading packages:\nRunning transaction check\nRunning transaction test\nTransaction test succeeded\nRunning transaction\n Installing : htop-2.2.0-3.el7.x86_64 1/1 \n Verifying : htop-2.2.0-3.el7.x86_64 1/1 \n\nInstalled:\n htop.x86_64 0:2.2.0-3.el7 \n\nComplete!\n"
]
}
[root@tdm1 root]#
该模块用于服务程序的管理
arguments #命令行提供额外的参数
enabled #设置开机启动。
name= #服务名称
runlevel #开机启动的级别,一般不用指定。
sleep #在重启服务的过程中,是否等待。如在服务关闭以后等待2秒再启动。(定义在剧本中。)
state #有四种状态,分别为:started --->启动服务, stopped --->停止服务, restarted --->重启服务, reloaded --->重载配置
1.开启服务并设置自启动
[root@tdm1 ~]# ansible web -m service -a 'name="nfs" state=started enabled=true'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"enabled": true,
"name": "nfs",
"state": "started",
"status": {
。。。。。。
}
}
#查看
[root@tdm1 ~]# ansible web -m shell -a 'ps -ef | grep nfs'
47.93.98.117 | CHANGED | rc=0 >>
root 29020 2 0 17:41 ? 00:00:00 [nfsd4_callbacks]
root 29026 2 0 17:41 ? 00:00:00 [nfsd]
root 29027 2 0 17:41 ? 00:00:00 [nfsd]
root 29028 2 0 17:41 ? 00:00:00 [nfsd]
root 29029 2 0 17:41 ? 00:00:00 [nfsd]
root 29030 2 0 17:41 ? 00:00:00 [nfsd]
root 29031 2 0 17:41 ? 00:00:00 [nfsd]
root 29032 2 0 17:41 ? 00:00:00 [nfsd]
root 29033 2 0 17:41 ? 00:00:00 [nfsd]
root 29473 29472 0 17:42 pts/1 00:00:00 /bin/sh -c ps -ef | grep nfs
root 29475 29473 0 17:42 pts/1 00:00:00 /bin/sh -c ps -ef | grep nfs
2.关闭服务
[root@tdm1 ~]# ansible web -m service -a 'name="nfs" state=stopped'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"name": "nfs",
"state": "stopped",
......
}
}
#查看,nfs服务已经关闭
[root@tdm1 ~]# ansible web -m shell -a 'ps -ef | grep nfs'
47.93.98.117 | CHANGED | rc=0 >>
root 31181 31180 0 17:45 pts/1 00:00:00 /bin/sh -c ps -ef | grep nfs
root 31183 31181 0 17:45 pts/1 00:00:00 /bin/sh -c ps -ef | grep nfs
该模块主要用来管理用户账号
comment # 用户的描述信息
createhome # 是否创建家目录
force # 在使用 state=absent 时, 行为与 userdel –force 一致.
group # 指定基本组
groups # 指定附加组,如果指定为( groups= )表示删除所有组
home # 指定用户家目录
move_home # 如果设置为 home= 时, 试图将用户主目录移动到指定的目录
name # 指定用户名
non_unique # 该选项允许改变非唯一的用户ID值
password # 指定用户密码
remove # 在使用 state=absent 时, 行为是与 userdel –remove 一致
shell # 指定默认 shell
state # 设置帐号状态,不指定为创建,指定值为 absent 表示删除
system # 当创建一个用户,设置这个用户是系统用户。这个设置不能更改现有用户
uid # 指定用户的 uid
1.添加一个用户并制定uid
[root@tdm1 ~]# ansible web -m user -a 'name="tdm" uid=11111 shell="/sbin/nologin"'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"comment": "",
"create_home": true,
"group": 11111,
"home": "/home/tdm",
"name": "tdm",
"shell": "/sbin/nologin",
"state": "present",
"system": false,
"uid": 11111
}
#查看
[root@tdm1 ~]# ansible web -m shell -a 'cat /etc/passwd | grep tdm'
47.93.98.117 | CHANGED | rc=0 >>
tdm:x:11111:11111::/home/tdm:/sbin/nologin
2.删除账户
[root@tdm1 ~]# ansible web -m user -a 'name="tdm" state=absent'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"force": false,
"name": "tdm",
"remove": false,
"state": "absent"
}
#查看
[root@tdm1 ~]# ansible web -m shell -a 'cat /etc/passwd | grep tdm'
47.93.98.117 | FAILED | rc=1 >>
non-zero return code
该模块用于添加或删除组
gid= #设置组的 GID 号
name= #指定组的名称
state= #指定组的状态,默认为创建,设置值为 absent 为删除
system= #设置值为 yes,表示创建为系统组
1.创建组
[root@tdm1 ~]# ansible web -m group -a 'name="TDM" gid=22222'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"gid": 22222,
"name": "TDM",
"state": "present",
"system": false
}
#查看
[root@tdm1 ~]# ansible web -m shell -a 'cat /etc/group | grep TDM'
47.93.98.117 | CHANGED | rc=0 >>
TDM:x:22222:
2.删除组
[root@tdm1 ~]# ansible web -m group -a 'name="TDM" state=absent'
47.93.98.117 | CHANGED => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": true,
"name": "TDM",
"state": "absent"
}
#查看
[root@tdm1 ~]# ansible web -m shell -a 'cat /etc/group | grep TDM'
47.93.98.117 | FAILED | rc=1 >>
non-zero return code
该模块使用本机的脚本在被管理的机器上运行
[root@tdm1 ~]# vim /tmp/df.sh
#!/bin/bash
date >> /tmp/disk_total.log
df -lh >> /tmp/disk_total.log
[root@tdm1 ~]# chmod +x /tmp/df.sh
运行脚本并查看
[root@tdm1 ~]# ansible web -m script -a '/tmp/df.sh'
47.93.98.117 | CHANGED => {
"changed": true,
"rc": 0,
"stderr": "Shared connection to 47.93.98.117 closed.\r\n",
"stderr_lines": [
"Shared connection to 47.93.98.117 closed."
],
"stdout": "",
"stdout_lines": []
}
#查看
[root@tdm1 ~]# ansible web -m shell -a 'cat /tmp/disk_total.log'
47.93.98.117 | CHANGED | rc=0 >>
Tue Aug 29 18:14:30 CST 2023
Filesystem Size Used Avail Use% Mounted on
devtmpfs 868M 4.0K 868M 1% /dev
tmpfs 879M 0 879M 0% /dev/shm
tmpfs 879M 528K 878M 1% /run
tmpfs 879M 0 879M 0% /sys/fs/cgroup
/dev/vda1 40G 6.0G 32G 17% /
tmpfs 176M 0 176M 0% /run/user/0
该模块用来收集信息,通过调用facts组件来实现的。我们可以使用 setup 模块查机器的所有 facts 信息,可以使用 filter 来查看指定信息。整个facts信息被包装在一个 JSON 格式的数据结构中,ansible_facts 是最上层的值。facts 就是变量,内建变量 。每个主机的各种信息,cpu 颗数、内存大小等。会存在 facts 中的某个变量中
1.查看信息
[root@tdm1 ~]# ansible web -m setup -a 'filter="*mem*"'
47.93.98.117 | SUCCESS => {
"ansible_facts": {
"ansible_memfree_mb": 494,
"ansible_memory_mb": {
"nocache": {
"free": 1531,
"used": 225
},
"real": {
"free": 494,
"total": 1756,
"used": 1262
},
"swap": {
"cached": 0,
"free": 0,
"total": 0,
"used": 0
}
},
"ansible_memtotal_mb": 1756,
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
[root@tdm1 ~]#
通过命令查看的,对比是否一致
[root@tdm1 ~]# ansible web -m shell -a 'free -m'
47.93.98.117 | CHANGED | rc=0 >>
total used free shared buff/cache available
Mem: 1756 147 494 0 1114 1442
Swap: 0 0 0
参考大佬:https://zhanghaiyang.blog.csdn.net/article/details/122089769