Ansible配置及常用模块
一. Ansible 介绍
Ansible是一个配置管理系统configuration management system, python 语言是运维人员必须会的语言, ansible 是一个基于python 开发的自动化运维工具, 其功能实现基于ssh远程连接服务, ansible 可以实现批量系统配置,批量软件部署,批量文件拷贝,批量运行命令等功能, 除了ansible之外,还有saltstack 等批量管理软件.
Ansible能做什么?
ansible可以帮助运维人员完成一些批量任务,或者完成一些需要经常重复的工作。
比如:同时在100台服务器上安装nginx服务,并在安装后启动服务。
比如:将某个文件一次性拷贝到100台服务器上。
比如:每当有新服务器加入工作环境时,运维人员都要为新服务器部署某个服务,也就是说运维人员需要经常重复的完成相同的工作。
这些场景中运维人员都可以使用到ansible。
Ansible软件特点?
- 部署简单,只需在主控端部署Ansible环境,被控端无需做任何操作;
- 默认使用SSH协议对设备进行管理;
- 有大量常规运维操作模块,可实现日常绝大部分操作;
- 配置简单、功能强大、扩展性强;
- 支持API及自定义模块,可通过Python轻松扩展;
- 通过Playbooks来定制强大的配置、状态管理;
- 轻量级,无需在客户端安装agent,更新时,只需在操作机上进行一次更新即可;
- 提供一个功能强大、操作性强的Web管理界面和REST API接口——AWX平台。
Ansible是一种agentless(基于ssh),可实现批量配置、命令执行和控制,基于Python实现的自动化运维工具。Ansible的两个特性:
- 模块化:通过调用相关模块,完成指定任务,且支持任何语言编写的自定义模块;
- playbook:剧本,可根据需要一次执行完剧本中的所有任务或某些任务;
Ansible 架构
- 核心模块(core modules) 连接主机实现操作, 它依赖于具体的模块来做具体的事情。
- 插件(plugins) 完成模块功能的补充。
- 剧本(playbooks)ansible的配置文件,将多个任务定义在剧本中,由ansible自动执行。
- 主机清单(host inventory)定义ansible需要操作主机的范围。
最重要的一点: ansible是模块化的, 它所有的操作都依赖于模块, 不需要单独安装客户端(no agents),基于系统自带的sshd服务,sshd就相当于ansible的客户端, 不需要服务端(no sever),需要依靠大量的模块实现批量管理, 配置文件 /etc/ansible/ansible.cfg (前期不用配置)。
ansible任务执行模式
Ansible 系统由控制主机对被管节点的操作方式可分为两类,即adhoc
和playbook
:
- ad-hoc模式(点对点模式)
使用单个模块,支持批量执行单条命令。ad-hoc 命令是一种可以快速输入的命令,而且不需要保存起来的命令。就相当于bash中的一句话shell。 - playbook模式(剧本模式)
是Ansible主要管理方式,也是Ansible功能强大的关键所在。playbook通过多个task集合完成一类功能,如Web服务的安装部署、数据库服务器的批量备份等。可以简单地把playbook理解为通过组合多条ad-hoc操作的配置文件。
ansible任务执行过程
- 加载自己的配置文件,默认
/etc/ansible/ansible.cfg
; - 查找对应的主机配置文件,找到要执行的主机或者组;
- 加载自己对应的模块文件,如 command;
- 通过ansible将模块或命令生成对应的临时py文件(python脚本), 并将该文件传输至远程服务器;
- 对应执行用户的家目录的
.ansible/tmp/XXX/XXX.PY
文件; - 给文件 +x 执行权限;
- 执行并返回结果;
- 删除临时py文件,
sleep 0
退出;
二. Ansible语法及配置参数
语法格式:
ansible <pattern_goes_here> -m <module_name> -a <arguments>
也就是:
ansible 匹配模式 -m 模块 -a '需要执行的内容'
解释说明:
匹配模式:即哪些机器生效 (可以是某一台, 或某一组, 或all) , 默认模块为command , 执行常规的shell命令.
-m name, --module-name=name: 指定执行使用的模块。
-u username, --user=username: 指定远程主机以username运行命令。
-s, --sudo: 相当于linux系统下的sudo命令。
-u sudo_username, --sudo-user=sudo_username: 使用sudo, 相当于linux系统下的sudo命令。
-C, --check: 只检查不实际执行。
-e, 即extra_vars: 引用外部参数。
-i, 即inventory: 指定仓库列表, 默认/etc/ansible/hosts。
--list-host: 列出执行主机列。
###### ansible配置文件常用参数 ########
[defaults] #inventory = /etc/ansible/hosts # 主机列表配置文件 #library = /usr/share/my_modules/ # 库文件存放目录 #remote_tmp = ~/.ansible/tmp # 临时py命令文件存放在远程主机的目录路径 #local_tmp = ~/.ansible/tmp # 本机的临时命令执行目录 #forks = 5 # 默认并发数 #sudo_user = root # 默认sudo用户 #ask_sudo_pass = True # 每次执行ansible命令是否询问SSH密码 #ask_pass = True #remote_port = 22 # 默认ssh远程端口 #roles_path = /etc/ansible/roles # 默认角色存放路径 #host_key_checking = False # 检查对应服务器的host_key,推荐取消注释,实现第一次连接自动信任目标主机 #log_path = /var/log/ansible.log # ansible执行日志文件,推荐开启
#module_name = command # 默认使用的模块,可以修改为shell等 #private_key_file = /path/to/file # 配置远程ssh私钥存放路径 [privilege_escalation] # 普通用户提权配置 #become=True #become_method=sudo #become_user=root #become_ask_pass=False
三. Ansible常用模块
四. Ansible配置说明
1) 实验环境准备
主控节点 系统centos7.9 IP:192.168.200.21 受控节点1 系统centos7.9 IP:192.168.200.22 受控节点2 系统centos7.9 IP:192.168.200.23 受控节点3 系统centos7.9 IP:192.168.200.24 受控节点4 系统centos7.9 IP:192.168.200.25 受控节点5 系统centos8 IP:192.168.200.51 受控节点6 系统centos8 IP:192.168.200.52 受控节点7 系统centos8 IP:192.168.200.53 设置主控节点到受控节点的ssh无密码信任关系 (ansible应用环境下, 主控节点必须要设置ssh无密码跳转到受控节点的信任关系) 添加主控节点到受控节点的认证! 首先主控节点必须要生成公私密钥对, 否则不能进行免密信任关系设置!! ssh-keygen -t rsa #一直回车即可 ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.200.22 #回车, 输入远程登录的密码即可 ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.200.23 ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.200.24 ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.200.25 ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.200.51 ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.200.52 ssh-copy-id -i /root/.ssh/id_rsa.pub -p22 root@192.168.200.53 如果受控节点数量比较多的话, 可以使用expect进行远程ssh连接的免密信任关系
2) Ansible安装部署
Ansible有两种安装方式: yum 和 pip 安装方式 Ansible在epel的yum中有提供,所以配置好epel源,直接使用yum命令安装即可. CentOS系统, 可以使用默认的yum源直接安装ansible [root@server01 ~]# yum install -y ansible 配置文件目录:/etc/ansible/ 执行文件目录:/usr/bin/ Lib库依赖目录:/usr/lib/pythonX.X/site-packages/ansible/ Help文档目录:/usr/share/doc/ansible-X.X.X/ Man文档目录:/usr/share/man/man1/ ================================================ pip安装方式 # yum -y install python-pip python-devel # pip install ansible ================================================ ansible程序文件 /usr/bin/ansible: 命令行工具 ansible命令通用格式: ansible <host-pattern> [options] [-m module_name] [-a args] /usr/bin/ansible-doc: 帮助文档 /usr/bin/ansible-playbook: 剧本执行工具 /etc/ansible/ansible.cfg: 主配置文件 /etc/ansible/hosts: 管理的主机清单 /etc/ansible/roles: 角色存放处 查看ansible命令帮助 [root@server01 ~]# ansible -h 查看支持的模块 [root@server01 ~]# ansible -l [root@server01 ~]# ansible-doc -l |grep shell #查看shell模块 shell Execute shell commands on targets vmware_vm_shell Run commands in a VMware guest operating system win_shell Execute shell commands on target hosts 查看ansible的支持的模块个数 [root@server01 ~]# ansible-doc -l |wc -l 3387 查看ansible版本 [root@server01 ~]# ansible --version ansible 2.9.27 config file = /etc/ansible/ansible.cfg configured module search path = [u'/root/.ansible/plugins/modules', u'/usr/share/ansible/plugins/modules'] ansible python module location = /usr/lib/python2.7/site-packages/ansible executable location = /usr/bin/ansible python version = 2.7.5 (default, Jun 28 2022, 15:30:04) [GCC 4.8.5 20150623 (Red Hat 4.8.5-44)]
3) Ansible清单
inventory文件通常用于定义要管理主机的认证信息, 例如ssh登录用户名、密码以及key相关信息。默认inventory文件为/etc/hostsweb-nodes, ansible模块操作命令中可以省去默认inventory (即可以省去"-i /etc/hostsweb-nodes"), 如果inventory文件定义了其他路径,则在ansible模块操作命令中不能省去, 要加上"-i inventory路径".如何配置Inventory文件?
主控节点:
- 支持主机名通配以及正则表达式,例如web[1:3].oldboy.com;
- 支持基于非标准的ssh端口,例如web1.oldboy.com:6666;
- 支持指定变量,可对个别主机的特殊配置,如登陆用户,密码等;
受控节点
- 支持嵌套组,例如[game:children],那么在game模块下面的组都会被game所包含;
- 支持指定变量,例如[game:vars]在下面指定变量;
ansible的inventory清单文件(/etc/ansible/hosts)中配置说明:
[ ] 中的名字代表组名
主机(hosts)部分可以使用域名、主机名、IP地址表示, 一般此类配置中多使用IP地址;
组名下的主机地址就是ansible可以管理的地址;
下面是/etc/ansible/hosts 文件中清单的配置示例:
[root@server01 ~]# cat /etc/ansible/hosts #可以使用受控节点的ip, 下面表示centos7_test组包括192.168.200.22~25四台机器 #被管理的机器IP D段如果是连续的就可以写为下面的方式,如果是单个的,需要单独写 [centos7_test] 192.168.200.[22:25] #192.168.200.200 #www.dingmr.com [centos8_test] 192.168.200.[51:53] #也可以使用受控节点的主机名, 前提是主控节点要能跟受控节点的主机名正常通信 #[servers] #server02 #server03 简单测试,可设置是否生效 查看ansible清单里所有节点的uptime情况 [root@server01 ~]# ansible all -m command -a "uptime" 192.168.200.23 | CHANGED | rc=0 >> 04:43:04 up 48 min, 1 user, load average: 0.00, 0.01, 0.05 192.168.200.24 | CHANGED | rc=0 >> 04:43:04 up 48 min, 1 user, load average: 0.00, 0.01, 0.05 192.168.200.22 | CHANGED | rc=0 >> 04:43:04 up 48 min, 1 user, load average: 0.00, 0.01, 0.05 192.168.200.25 | CHANGED | rc=0 >> 04:43:04 up 48 min, 1 user, load average: 0.00, 0.01, 0.05 192.168.200.53 | CHANGED | rc=0 >> 04:43:04 up 48 min, 1 user, load average: 0.00, 0.00, 0.00 192.168.200.52 | CHANGED | rc=0 >> 04:43:05 up 48 min, 1 user, load average: 0.00, 0.00, 0.00 192.168.200.51 | CHANGED | rc=0 >> 04:43:05 up 48 min, 1 user, load average: 0.00, 0.00, 0.00 查看ansible清单里centos7_test组的节点的主机名 [root@server01 ~]# ansible centos7_test -m command -a "hostname" 192.168.200.23 | CHANGED | rc=0 >> server03 192.168.200.25 | CHANGED | rc=0 >> server05 192.168.200.24 | CHANGED | rc=0 >> server04 192.168.200.22 | CHANGED | rc=0 >> server02
ansible 命令详解
命令的具体格式如下: ansible <host-pattern> [-f forks] [-m module_name] [-a args] 也可以通过ansible -h来查看帮助,下面我们列出一些比较常用的选项,并解释其含义: -a MODULE_ARGS #模块的参数,如果执行默认COMMAND的模块,即是命令参数,如: “date”,“pwd”等等 -k,--ask-pass #ask for SSH password。登录密码,提示输入SSH密码而不是假设基于密钥的验证 --ask-su-pass #ask for su password。su切换密码 -K,--ask-sudo-pass #ask for sudo password。提示密码使用sudo,sudo表示提权操作 --ask-vault-pass #ask for vault password。假设我们设定了加密的密码,则用该选项进行访问 -B SECONDS #后台运行超时时间 -C #模拟运行环境并进行预运行,可以进行查错测试 -c CONNECTION #连接类型使用 -f FORKS #并行任务数,默认为5 -i INVENTORY #指定主机清单的路径,默认为/etc/ansible/hosts --list-hosts #查看有哪些主机组 -m MODULE_NAME #执行模块的名字,默认使用 command 模块,所以如果是只执行单一命令可以不用 -m参数 -o #压缩输出,尝试将所有结果在一行输出,一般针对收集工具使用 -S #用 su 命令 -R SU_USER #指定 su 的用户,默认为 root 用户 -s #用 sudo 命令 -U SUDO_USER #指定 sudo 到哪个用户,默认为 root 用户 -T TIMEOUT #指定 ssh 默认超时时间,默认为10s,也可在配置文件中修改 -u REMOTE_USER #远程用户,默认为 root 用户 -v #查看详细信息,同时支持-vvv,-vvvv可查看更详细信息
4) Ansible 常用模块
#ansible-doc -l #查看所有模块
#ansible-doc -s MODULE_NAME #查看指定模块的详细帮助
ping模块:检查指定节点机器是否还能连通,用法很简单,不涉及参数,主机如果在线,则回复pong 。
command模块:可以直接在远程主机上执行命令,并将结果返回本主机。
shell模块:可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。
service模块:该模块用于服务程序的管理。
cron模块:用于管理计划任务
cory模块:用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
file模块:用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
fetch模块:用于从远程某主机获取(复制)文件到本地。
yum模块:该模块主要用于软件的安装。
apt模块:这个模块是ubuntu作为远端受控节点OS的时候,用的最多的模块。Apt是Ubuntu/Debian的包管理工具。
service模块:该模块用于服务程序的管理。
user和group模块:该模块主要是用来管理用户账号和添加、删除组。
script模块:该模块用于将本机的脚本在被管理端的机器上运行。
pip模块:用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements
synchronize模块:这个模块是使用rsync同步文件,将主控方目录推送到指定受控节点的目录下
get_url模块:该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)
hostname模块:修改远程受控节点的主机名的模块
stat模块:获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息
mount模块:在远程受控节点上挂载文件系统。
find模块:帮助在被管理的受控主机中查找符合条件的文件,就像 find 命令一样
selinux模块:管理远程受控节点的selinux的模块
1. ping模块
检查指定节点机器是否还能连通,用法很简单,不涉及参数. 主机如果在线,则回复pong. 测试连通性的模块
#查看所有机器的连通性 [root@server01 ~]# ansible all -m ping 192.168.200.25 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.200.22 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.200.24 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.200.23 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": false, "ping": "pong" } 192.168.200.53 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } 192.168.200.51 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } 192.168.200.52 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } #查看centos8_test组机器的连通性 [root@server01 ~]# ansible centos8_test -m ping 192.168.200.53 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } 192.168.200.52 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" } 192.168.200.51 | SUCCESS => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": false, "ping": "pong" }
2、command模块
#这个模块可以直接在远程主机上执行命令,并将结果返回本主机。 #命令模块接受命令名称,后面是空格分隔的列表参数。给定的命令将在所有选定的节点上执行。它不会通过shell进行处理,比如$HOME和操作如"<",">","|",";","&" 工作(需要使用(shell)模块实现这些功能)。注意,该命令不支持| 管道命令。 command模块包含如下选项: creates:一个文件名,当该文件存在,则该命令不执行 free_form:要执行的linux指令 chdir:在执行指令之前,先切换到该指定的目录 removes:一个文件名,当该文件不存在,则该选项不执行 executable:切换shell来执行指令,该执行路径必须是一个绝对路径 示例: #查看centos8_test组所有机器的时间 [root@server01 ~]# ansible centos8_test -m command -a 'date' 192.168.200.53 | CHANGED | rc=0 >> 2023年 07月 13日 星期四 05:04:43 CST 192.168.200.51 | CHANGED | rc=0 >> 2023年 07月 13日 星期四 05:04:43 CST 192.168.200.52 | CHANGED | rc=0 >> 2023年 07月 13日 星期四 05:04:43 CST #先切换到/tmp/ 目录,再执行“ls”命令 [root@server01 ~]# ansible centos8_test -m command -a 'chdir=/tmp ls -l' 192.168.200.53 | CHANGED | rc=0 >> 总用量 0 drwx------ 2 root root 41 7月 13 05:08 ansible_command_payload_b_9t9s29 drwx------ 2 root root 41 7月 12 02:38 ansible_command_payload_skhplam1 drwx------ 3 root root 17 7月 13 03:54 systemd-private-05dfb89a051841c79ab0a3b7ed833f9c-chronyd.service-bHNPf1 drwx------ 2 root root 6 7月 13 03:54 vmware-root_865-3980167289 drwx------ 2 root root 6 7月 12 02:39 vmware-root_881-4013198953 drwx------ 2 root root 6 7月 12 02:30 vmware-root_882-2688685109 drwx------ 2 root root 6 7月 12 02:26 vmware-root_891-3988228581 drwx------ 2 root root 6 7月 12 02:41 vmware-root_904-2697008433 192.168.200.51 | CHANGED | rc=0 >> 总用量 16 drwx------ 2 root root 41 7月 12 02:38 ansible_command_payload_9pryhft6 drwx------ 2 root root 41 7月 13 05:08 ansible_command_payload_un5g2bs1 -rw-r--r-- 1 dm dm 158 7月 12 01:41 hosts srwxrwxrwx 1 mysql mysql 0 7月 13 03:54 mysql.sock -rw------- 1 mysql mysql 5 7月 13 03:54 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 13 03:54 mysqlx.sock -rw------- 1 mysql mysql 5 7月 13 03:54 mysqlx.sock.lock drwxr-xr-x 3 root root 18 7月 4 18:59 pear srw-rw-rw- 1 www www 0 7月 13 03:54 php-cgi.sock drwx------ 3 root root 17 7月 13 03:54 systemd-private-1eaaba22d3e942b493053a834a9cb2dd-chronyd.service-aM6ouy drwxrwxrwt 16 root root 4096 7月 12 01:59 tmp drwx------ 2 root root 6 7月 13 03:54 vmware-root_845-4021653450 drwx------ 2 root root 6 7月 11 23:52 vmware-root_849-4013723217 drwx------ 2 root root 6 7月 4 17:49 vmware-root_852-2689078282 drwx------ 2 root root 6 7月 5 14:24 vmware-root_867-3988621819 drwx------ 2 root root 6 7月 12 02:39 vmware-root_874-2689078315 drwx------ 2 root root 6 7月 4 17:51 vmware-root_881-4013198953 drwx------ 2 root root 6 7月 4 17:54 vmware-root_891-3988228581 192.168.200.52 | CHANGED | rc=0 >> 总用量 16 drwx------ 2 root root 41 7月 12 02:38 ansible_command_payload_enoeeht4 drwx------ 2 root root 41 7月 13 05:08 ansible_command_payload_n_28gtsr -rw-r--r-- 1 dm dm 158 7月 12 01:41 hosts srwxrwxrwx 1 mysql mysql 0 7月 13 03:54 mysql.sock -rw------- 1 mysql mysql 5 7月 13 03:54 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 13 03:54 mysqlx.sock -rw------- 1 mysql mysql 5 7月 13 03:54 mysqlx.sock.lock drwxr-xr-x 3 root root 18 7月 4 18:56 pear srw-rw-rw- 1 www www 0 7月 13 03:54 php-cgi.sock drwx------ 3 root root 17 7月 13 03:54 systemd-private-a0a3d0621bce4f60a69dd5204cd65bac-chronyd.service-xHmMsH drwxrwxrwt 16 root root 4096 7月 12 01:59 tmp drwx------ 2 root root 6 7月 4 17:51 vmware-root_845-4021653450 drwx------ 2 root root 6 7月 13 03:54 vmware-root_860-2722763268 drwx------ 2 root root 6 7月 5 14:24 vmware-root_862-2731217798 drwx------ 2 root root 6 7月 4 17:53 vmware-root_863-3980167256 drwx------ 2 root root 6 7月 4 17:54 vmware-root_872-2697532841 drwx------ 2 root root 6 7月 12 02:39 vmware-root_882-2688685109 drwx------ 2 root root 6 7月 11 23:52 vmware-root_885-4021784556 #如果/tmp/hosts文件存在,则不执行“ls”命令 [root@server01 ~]# ansible centos8_test -m command -a 'creates=/tmp/hosts ls' 192.168.200.53 | CHANGED | rc=0 >> anaconda-ks.cfg modify_hostname_and_ips_8.sh sys_opt_centos8.sh 192.168.200.51 | SUCCESS | rc=0 >> skipped, since /tmp/hosts exists 192.168.200.52 | SUCCESS | rc=0 >> skipped, since /tmp/hosts exists #说明:53这台机器上不存在hosts文件 所以执行了ls命令 #如果/tmp/hosts存在,则执行“cat /tmp/hosts”命令 [root@server01 ~]# ansible centos8_test -m command -a 'removes=/tmp/hosts cat /tmp/hosts' 192.168.200.53 | SUCCESS | rc=0 >> skipped, since /tmp/hosts does not exist 192.168.200.52 | CHANGED | rc=0 >> 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 192.168.200.51 | CHANGED | rc=0 >> 127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 ::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
3、shell模块
#shell模块可以在远程主机上调用shell解释器运行命令,支持shell的各种功能,例如管道等。 [root@server01 ~]# ansible centos7_test -m shell -a 'netstat -lntup |grep 80' 192.168.200.25 | FAILED | rc=1 >> non-zero return code 192.168.200.23 | FAILED | rc=1 >> non-zero return code 192.168.200.24 | FAILED | rc=1 >> non-zero return code 192.168.200.22 | CHANGED | rc=0 >> tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 1131/nginx: master
4、service模块
该模块用于服务程序的管理。 其主要选项如下: arguments:给命令行提供一些选项 enabled:是否开机启动 yes|no name:必选项,服务名称 pattern:定义一个模式,如果通过status指令来查看服务的状态时,没有响应,就会通过ps指令在进程中根据该模式进行查找,如果匹配到,则认为该服务依然在运行 runlevel:运行级别 sleep:如果执行了restarted,在则stop和start之间沉睡几秒钟 state:对当前服务执行启动,停止、重启、重新加载等操作(started,stopped,restarted,reloaded) #重启firewalld服务,并设为开机自启 [root@server01 ~]# ansible 192.168.200.22 -m service -a 'name=firewalld state=restarted enabled=yes' 192.168.200.22 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "enabled": true, "name": "firewalld", "state": "started", "status": { "ActiveEnterTimestamp": "四 2023-07-13 05:36:00 CST", "ActiveEnterTimestampMonotonic": "6111124540", "ActiveExitTimestampMonotonic": "0", "ActiveState": "active", "After": "dbus.service polkit.service basic.target system.slice", "AllowIsolate": "no", "AmbientCapabilities": "0", "AssertResult": "yes", "AssertTimestamp": "四 2023-07-13 05:36:00 CST", "AssertTimestampMonotonic": "6110815255", "Before": "network-pre.target multi-user.target shutdown.target", "BlockIOAccounting": "no", "BlockIOWeight": "18446744073709551615", "BusName": "org.fedoraproject.FirewallD1", "CPUAccounting": "no", "CPUQuotaPerSecUSec": "infinity", "CPUSchedulingPolicy": "0", "CPUSchedulingPriority": "0", "CPUSchedulingResetOnFork": "no", "CPUShares": "18446744073709551615", "CanIsolate": "no", "CanReload": "yes", "CanStart": "yes", "CanStop": "yes", "CapabilityBoundingSet": "18446744073709551615", "CollectMode": "inactive", "ConditionResult": "yes", "ConditionTimestamp": "四 2023-07-13 05:36:00 CST", "ConditionTimestampMonotonic": "6110815255", "Conflicts": "shutdown.target iptables.service ip6tables.service ebtables.service ipset.service", "ControlGroup": "/system.slice/firewalld.service", "ControlPID": "0", "DefaultDependencies": "yes", "Delegate": "no", "Description": "firewalld - dynamic firewall daemon", "DevicePolicy": "auto", "Documentation": "man:firewalld(1)", "EnvironmentFile": "/etc/sysconfig/firewalld (ignore_errors=yes)", "ExecMainCode": "0", "ExecMainExitTimestampMonotonic": "0", "ExecMainPID": "3079", "ExecMainStartTimestamp": "四 2023-07-13 05:36:00 CST", "ExecMainStartTimestampMonotonic": "6110816308", "ExecMainStatus": "0", "ExecReload": "{ path=/bin/kill ; argv[]=/bin/kill -HUP $MAINPID ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }", "ExecStart": "{ path=/usr/sbin/firewalld ; argv[]=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS ; ignore_errors=no ; start_time=[四 2023-07-13 05:36:00 CST] ; stop_time=[n/a] ; pid=3079 ; code=(null) ; status=0/0 }", "FailureAction": "none", "FileDescriptorStoreMax": "0", "FragmentPath": "/usr/lib/systemd/system/firewalld.service", "GuessMainPID": "yes", "IOScheduling": "0", "Id": "firewalld.service", "IgnoreOnIsolate": "no", "IgnoreOnSnapshot": "no", "IgnoreSIGPIPE": "yes", "InactiveEnterTimestampMonotonic": "0", "InactiveExitTimestamp": "四 2023-07-13 05:36:00 CST", "InactiveExitTimestampMonotonic": "6110816374", "JobTimeoutAction": "none", "JobTimeoutUSec": "0", "KillMode": "mixed", "KillSignal": "15", "LimitAS": "18446744073709551615", "LimitCORE": "18446744073709551615", "LimitCPU": "18446744073709551615", "LimitDATA": "18446744073709551615", "LimitFSIZE": "18446744073709551615", "LimitLOCKS": "18446744073709551615", "LimitMEMLOCK": "65536", "LimitMSGQUEUE": "819200", "LimitNICE": "0", "LimitNOFILE": "4096", "LimitNPROC": "14988", "LimitRSS": "18446744073709551615", "LimitRTPRIO": "0", "LimitRTTIME": "18446744073709551615", "LimitSIGPENDING": "14988", "LimitSTACK": "18446744073709551615", "LoadState": "loaded", "MainPID": "3079", "MemoryAccounting": "no", "MemoryCurrent": "18446744073709551615", "MemoryLimit": "18446744073709551615", "MountFlags": "0", "Names": "firewalld.service", "NeedDaemonReload": "no", "Nice": "0", "NoNewPrivileges": "no", "NonBlocking": "no", "NotifyAccess": "none", "OOMScoreAdjust": "0", "OnFailureJobMode": "replace", "PermissionsStartOnly": "no", "PrivateDevices": "no", "PrivateNetwork": "no", "PrivateTmp": "no", "ProtectHome": "no", "ProtectSystem": "no", "RefuseManualStart": "no", "RefuseManualStop": "no", "RemainAfterExit": "no", "Requires": "basic.target system.slice", "Restart": "no", "RestartUSec": "100ms", "Result": "success", "RootDirectoryStartOnly": "no", "RuntimeDirectoryMode": "0755", "SameProcessGroup": "no", "SecureBits": "0", "SendSIGHUP": "no", "SendSIGKILL": "yes", "Slice": "system.slice", "StandardError": "null", "StandardInput": "null", "StandardOutput": "null", "StartLimitAction": "none", "StartLimitBurst": "5", "StartLimitInterval": "10000000", "StartupBlockIOWeight": "18446744073709551615", "StartupCPUShares": "18446744073709551615", "StatusErrno": "0", "StopWhenUnneeded": "no", "SubState": "running", "SyslogLevelPrefix": "yes", "SyslogPriority": "30", "SystemCallErrorNumber": "0", "TTYReset": "no", "TTYVHangup": "no", "TTYVTDisallocate": "no", "TasksAccounting": "no", "TasksCurrent": "18446744073709551615", "TasksMax": "18446744073709551615", "TimeoutStartUSec": "1min 30s", "TimeoutStopUSec": "1min 30s", "TimerSlackNSec": "50000", "Transient": "no", "Type": "dbus", "UMask": "0022", "UnitFilePreset": "enabled", "UnitFileState": "enabled", "WantedBy": "multi-user.target", "Wants": "network-pre.target", "WatchdogTimestamp": "四 2023-07-13 05:36:00 CST", "WatchdogTimestampMonotonic": "6111124458", "WatchdogUSec": "0" } } #停止firewalld服务 [root@server01 ~]# ansible 192.168.200.22 -m service -a "name=firewalld state=stopped" 192.168.200.22 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/bin/python" }, "changed": true, "name": "firewalld", "state": "stopped", "status": { "ActiveEnterTimestamp": "四 2023-07-13 05:36:37 CST", "ActiveEnterTimestampMonotonic": "6147747107", "ActiveExitTimestamp": "四 2023-07-13 05:36:36 CST", "ActiveExitTimestampMonotonic": "6146721718", "ActiveState": "active", "After": "dbus.service polkit.service basic.target system.slice", "AllowIsolate": "no", "AmbientCapabilities": "0", "AssertResult": "yes", "AssertTimestamp": "四 2023-07-13 05:36:37 CST", "AssertTimestampMonotonic": "6147553383", "Before": "network-pre.target multi-user.target shutdown.target", "BlockIOAccounting": "no", "BlockIOWeight": "18446744073709551615", "BusName": "org.fedoraproject.FirewallD1", "CPUAccounting": "no", "CPUQuotaPerSecUSec": "infinity", "CPUSchedulingPolicy": "0", "CPUSchedulingPriority": "0", "CPUSchedulingResetOnFork": "no", "CPUShares": "18446744073709551615", "CanIsolate": "no", "CanReload": "yes", "CanStart": "yes", "CanStop": "yes", "CapabilityBoundingSet": "18446744073709551615", "CollectMode": "inactive", "ConditionResult": "yes", "ConditionTimestamp": "四 2023-07-13 05:36:37 CST", "ConditionTimestampMonotonic": "6147553383", "Conflicts": "shutdown.target iptables.service ip6tables.service ebtables.service ipset.service", "ControlGroup": "/system.slice/firewalld.service", "ControlPID": "0", "DefaultDependencies": "yes", "Delegate": "no", "Description": "firewalld - dynamic firewall daemon", "DevicePolicy": "auto", "Documentation": "man:firewalld(1)", "EnvironmentFile": "/etc/sysconfig/firewalld (ignore_errors=yes)", "ExecMainCode": "0", "ExecMainExitTimestampMonotonic": "0", "ExecMainPID": "3355", "ExecMainStartTimestamp": "四 2023-07-13 05:36:37 CST", "ExecMainStartTimestampMonotonic": "6147554037", "ExecMainStatus": "0", "ExecReload": "{ path=/bin/kill ; argv[]=/bin/kill -HUP $MAINPID ; ignore_errors=no ; start_time=[n/a] ; stop_time=[n/a] ; pid=0 ; code=(null) ; status=0/0 }", "ExecStart": "{ path=/usr/sbin/firewalld ; argv[]=/usr/sbin/firewalld --nofork --nopid $FIREWALLD_ARGS ; ignore_errors=no ; start_time=[四 2023-07-13 05:36:37 CST] ; stop_time=[n/a] ; pid=3355 ; code=(null) ; status=0/0 }", "FailureAction": "none", "FileDescriptorStoreMax": "0", "FragmentPath": "/usr/lib/systemd/system/firewalld.service", "GuessMainPID": "yes", "IOScheduling": "0", "Id": "firewalld.service", "IgnoreOnIsolate": "no", "IgnoreOnSnapshot": "no", "IgnoreSIGPIPE": "yes", "InactiveEnterTimestamp": "四 2023-07-13 05:36:37 CST", "InactiveEnterTimestampMonotonic": "6147552822", "InactiveExitTimestamp": "四 2023-07-13 05:36:37 CST", "InactiveExitTimestampMonotonic": "6147554093", "JobTimeoutAction": "none", "JobTimeoutUSec": "0", "KillMode": "mixed", "KillSignal": "15", "LimitAS": "18446744073709551615", "LimitCORE": "18446744073709551615", "LimitCPU": "18446744073709551615", "LimitDATA": "18446744073709551615", "LimitFSIZE": "18446744073709551615", "LimitLOCKS": "18446744073709551615", "LimitMEMLOCK": "65536", "LimitMSGQUEUE": "819200", "LimitNICE": "0", "LimitNOFILE": "4096", "LimitNPROC": "14988", "LimitRSS": "18446744073709551615", "LimitRTPRIO": "0", "LimitRTTIME": "18446744073709551615", "LimitSIGPENDING": "14988", "LimitSTACK": "18446744073709551615", "LoadState": "loaded", "MainPID": "3355", "MemoryAccounting": "no", "MemoryCurrent": "18446744073709551615", "MemoryLimit": "18446744073709551615", "MountFlags": "0", "Names": "firewalld.service", "NeedDaemonReload": "no", "Nice": "0", "NoNewPrivileges": "no", "NonBlocking": "no", "NotifyAccess": "none", "OOMScoreAdjust": "0", "OnFailureJobMode": "replace", "PermissionsStartOnly": "no", "PrivateDevices": "no", "PrivateNetwork": "no", "PrivateTmp": "no", "ProtectHome": "no", "ProtectSystem": "no", "RefuseManualStart": "no", "RefuseManualStop": "no", "RemainAfterExit": "no", "Requires": "basic.target system.slice", "Restart": "no", "RestartUSec": "100ms", "Result": "success", "RootDirectoryStartOnly": "no", "RuntimeDirectoryMode": "0755", "SameProcessGroup": "no", "SecureBits": "0", "SendSIGHUP": "no", "SendSIGKILL": "yes", "Slice": "system.slice", "StandardError": "null", "StandardInput": "null", "StandardOutput": "null", "StartLimitAction": "none", "StartLimitBurst": "5", "StartLimitInterval": "10000000", "StartupBlockIOWeight": "18446744073709551615", "StartupCPUShares": "18446744073709551615", "StatusErrno": "0", "StopWhenUnneeded": "no", "SubState": "running", "SyslogLevelPrefix": "yes", "SyslogPriority": "30", "SystemCallErrorNumber": "0", "TTYReset": "no", "TTYVHangup": "no", "TTYVTDisallocate": "no", "TasksAccounting": "no", "TasksCurrent": "18446744073709551615", "TasksMax": "18446744073709551615", "TimeoutStartUSec": "1min 30s", "TimeoutStopUSec": "1min 30s", "TimerSlackNSec": "50000", "Transient": "no", "Type": "dbus", "UMask": "0022", "UnitFilePreset": "enabled", "UnitFileState": "enabled", "WantedBy": "multi-user.target", "Wants": "network-pre.target", "WatchdogTimestamp": "四 2023-07-13 05:36:37 CST", "WatchdogTimestampMonotonic": "6147747076", "WatchdogUSec": "0" } }
5、cron模块
cron模块用于管理cron计划任务,可以指定以下选项
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 # 以哪个用户的身份执行
#添加计划任务 [root@server01 ~]# ansible centos8_test -m cron -a 'name="ntp time" minute=*/5 job="/sbin/nepdate ntp1.aliyun.com &>1 /dev/null"' 192.168.200.53 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [ "ntp time" ] } 192.168.200.51 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [ "ntp time" ] } 192.168.200.52 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [ "ntp time" ] } #查看添加的计划任务 [root@server01 ~]# ansible centos8_test -m shell -a 'crontab -l' 192.168.200.53 | CHANGED | rc=0 >> 5 * * * * ntpdate ntp1.aliyun.com #Ansible: ntp time */5 * * * * /sbin/nepdate ntp1.aliyun.com &>1 /dev/null 192.168.200.52 | CHANGED | rc=0 >> 5 * * * * ntpdate ntp1.aliyun.com #Ansible: ntp time */5 * * * * /sbin/nepdate ntp1.aliyun.com &>1 /dev/null 192.168.200.51 | CHANGED | rc=0 >> 5 * * * * ntpdate ntp1.aliyun.com #Ansible: ntp time */5 * * * * /sbin/nepdate ntp1.aliyun.com &>1 /dev/null #删除计划任务 [root@server01 ~]# ansible centos8_test -m cron -a 'name="ntp time" minute=5 job="/sbin/nepdate ntp1.aliyun.com &>1 /dev/null" state=absent' 192.168.200.53 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [] } 192.168.200.51 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [] } 192.168.200.52 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "envs": [], "jobs": [] } #再次查看,该计划任务已被删除 [root@server01 ~]# ansible centos8_test -m shell -a 'crontab -l' 192.168.200.53 | CHANGED | rc=0 >> 5 * * * * ntpdate ntp1.aliyun.com 192.168.200.52 | CHANGED | rc=0 >> 5 * * * * ntpdate ntp1.aliyun.com 192.168.200.51 | CHANGED | rc=0 >> 5 * * * * ntpdate ntp1.aliyun.com
6、copy模块
用于将文件复制到远程主机,同时支持给定内容生成文件和修改权限等
相关参数如下:
src:指定源文件路径,可以是相对路径,也可以是绝对路径,可以是目录(并非是必须的,可以使用content,直接生成文件内容). src即是要复制到远程主机的文件在本地的地址,可以是绝对路径,也可以是相对路径。如果路径是一个目录,它将递归复制。在这种情况下,如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制,类似于rsync。
dest:指定目标文件路径,只能是绝对路径,如果src是目录,此项必须是目录. 这个是必选项!
owner:指定属主;
group:指定属组;
mode:指定权限,可以以数字指定比如0644;
content:代替src,直接往dest文件中写内容,可以引用变量,也可以直接使用inventory中的主机变量. 写后会覆盖原文件内容!
backup:在覆盖之前将原文件备份,备份文件包含时间信息。有两个选项:yes|no
force: 如果目标主机包含该文件,但内容不同,如果设置为yes,则强制覆盖,如果为no,则只有当目标主机的目标位置不存在该文件时,才复制。默认为yes ;
directory_mode:递归的设定目录的权限,默认为系统默认权限;
others:所有的file模块里的选项都可以在这里使用;
#复制文件 [root@server01 ~]# ansible centos8_test -m copy -a 'src=/etc/hosts dest=/tmp/hosts' 192.168.200.53 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "54fb6627dbaa37721048e4549db3224d", "mode": "0644", "owner": "root", "size": 158, "src": "/root/.ansible/tmp/ansible-tmp-1690724098.11-4587-2775042185651/source", "state": "file", "uid": 0 } 192.168.200.52 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "54fb6627dbaa37721048e4549db3224d", "mode": "0644", "owner": "root", "size": 158, "src": "/root/.ansible/tmp/ansible-tmp-1690724098.13-4585-253101546416108/source", "state": "file", "uid": 0 } 192.168.200.51 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "7335999eb54c15c67566186bdfc46f64e0d5a1aa", "dest": "/tmp/hosts", "gid": 0, "group": "root", "md5sum": "54fb6627dbaa37721048e4549db3224d", "mode": "0644", "owner": "root", "size": 158, "src": "/root/.ansible/tmp/ansible-tmp-1690724098.13-4583-85825220255066/source", "state": "file", "uid": 0 } #查看 [root@server01 ~]# ansible centos8_test -m shell -a 'ls -l /tmp' 192.168.200.53 | CHANGED | rc=0 >> 总用量 4 drwx------ 2 root root 41 7月 30 21:35 ansible_command_payload_wglrvobz -rw-r--r-- 1 root root 158 7月 30 21:34 hosts drwx------ 3 root root 17 7月 29 21:48 systemd-private-0c3bc5ecac1e4ece9ad802daf96ef848-chronyd.service-8dWGVb drwx------ 2 root root 6 7月 27 03:09 vmware-root_845-4021653450 192.168.200.52 | CHANGED | rc=0 >> 总用量 12 drwx------ 2 root root 41 7月 30 21:35 ansible_command_payload_ddj6juu5 -rw-r--r-- 1 root root 158 7月 30 21:34 hosts srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysql.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysqlx.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysqlx.sock.lock srw-rw-rw- 1 www www 0 7月 29 21:48 php-cgi.sock drwx------ 3 root root 17 7月 29 21:48 systemd-private-9a3853516f1d4d839d8c26ec94d612f1-chronyd.service-deZAnL drwx------ 2 root root 6 7月 29 21:48 vmware-root_845-4021653450 drwx------ 2 root root 6 7月 26 23:50 vmware-root_849-4013723217 192.168.200.51 | CHANGED | rc=0 >> 总用量 12 drwx------ 2 root root 41 7月 30 21:35 ansible_command_payload_ujgsdqf7 -rw-r--r-- 1 root root 158 7月 30 21:34 hosts srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysql.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysqlx.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysqlx.sock.lock srw-rw-rw- 1 www www 0 7月 29 21:48 php-cgi.sock drwx------ 3 root root 17 7月 29 21:48 systemd-private-4828da971c0f47aabfef2bf0a50bbd61-chronyd.service-UTsulM drwx------ 2 root root 6 7月 29 21:48 vmware-root_835-3988097475 drwx------ 2 root root 6 7月 27 03:09 vmware-root_879-4013723248 #给指定内容生成文件并制定权限 [root@server01 ~]# ansible centos8_test -m copy -a 'content="I am keer\n" dest=/tmp/name mode=666' 192.168.200.53 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "0421570938940ea784f9d8598dab87f07685b968", "dest": "/tmp/name", "gid": 0, "group": "root", "md5sum": "497fa8386590a5fc89090725b07f175c", "mode": "0666", "owner": "root", "size": 10, "src": "/root/.ansible/tmp/ansible-tmp-1690724300.86-4713-167400725166561/source", "state": "file", "uid": 0 } 192.168.200.52 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "0421570938940ea784f9d8598dab87f07685b968", "dest": "/tmp/name", "gid": 0, "group": "root", "md5sum": "497fa8386590a5fc89090725b07f175c", "mode": "0666", "owner": "root", "size": 10, "src": "/root/.ansible/tmp/ansible-tmp-1690724300.88-4711-187455787656263/source", "state": "file", "uid": 0 } 192.168.200.51 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "0421570938940ea784f9d8598dab87f07685b968", "dest": "/tmp/name", "gid": 0, "group": "root", "md5sum": "497fa8386590a5fc89090725b07f175c", "mode": "0666", "owner": "root", "size": 10, "src": "/root/.ansible/tmp/ansible-tmp-1690724300.88-4709-165367920973227/source", "state": "file", "uid": 0 } #查看 [root@server01 ~]# ansible centos8_test -m shell -a 'ls -l /tmp' 192.168.200.53 | CHANGED | rc=0 >> 总用量 8 drwx------ 2 root root 41 7月 30 21:39 ansible_command_payload_026aao9a -rw-r--r-- 1 root root 158 7月 30 21:34 hosts -rw-rw-rw- 1 root root 10 7月 30 21:38 name drwx------ 3 root root 17 7月 29 21:48 systemd-private-0c3bc5ecac1e4ece9ad802daf96ef848-chronyd.service-8dWGVb drwx------ 2 root root 6 7月 27 03:09 vmware-root_845-4021653450 192.168.200.51 | CHANGED | rc=0 >> 总用量 16 drwx------ 2 root root 41 7月 30 21:39 ansible_command_payload_q2ivm6mt -rw-r--r-- 1 root root 158 7月 30 21:34 hosts srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysql.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysqlx.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysqlx.sock.lock -rw-rw-rw- 1 root root 10 7月 30 21:38 name srw-rw-rw- 1 www www 0 7月 29 21:48 php-cgi.sock drwx------ 3 root root 17 7月 29 21:48 systemd-private-4828da971c0f47aabfef2bf0a50bbd61-chronyd.service-UTsulM drwx------ 2 root root 6 7月 29 21:48 vmware-root_835-3988097475 drwx------ 2 root root 6 7月 27 03:09 vmware-root_879-4013723248 192.168.200.52 | CHANGED | rc=0 >> 总用量 16 drwx------ 2 root root 41 7月 30 21:39 ansible_command_payload_po5d1_yq -rw-r--r-- 1 root root 158 7月 30 21:34 hosts srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysql.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysqlx.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysqlx.sock.lock -rw-rw-rw- 1 root root 10 7月 30 21:38 name srw-rw-rw- 1 www www 0 7月 29 21:48 php-cgi.sock drwx------ 3 root root 17 7月 29 21:48 systemd-private-9a3853516f1d4d839d8c26ec94d612f1-chronyd.service-deZAnL drwx------ 2 root root 6 7月 29 21:48 vmware-root_845-4021653450 drwx------ 2 root root 6 7月 26 23:50 vmware-root_849-4013723217 [root@server01 ~]# ansible centos8_test -m shell -a 'cat /tmp/name' 192.168.200.53 | CHANGED | rc=0 >> I am keer 192.168.200.51 | CHANGED | rc=0 >> I am keer 192.168.200.52 | CHANGED | rc=0 >> I am keer #把文件内容修改下,然后选择覆盖备份 [root@server01 ~]# ansible centos8_test -m copy -a 'content="I am keerya\n" backup=yes dest=/tmp/name mode=666' 192.168.200.53 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "backup_file": "/tmp/name.5041.2023-07-30@21:42:31~", "changed": true, "checksum": "064a68908ab9971ee85dbc08ea038387598e3778", "dest": "/tmp/name", "gid": 0, "group": "root", "md5sum": "8ca7c11385856155af52e560f608891c", "mode": "0666", "owner": "root", "size": 12, "src": "/root/.ansible/tmp/ansible-tmp-1690724550.69-4883-262491921972264/source", "state": "file", "uid": 0 } 192.168.200.52 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "backup_file": "/tmp/name.6872.2023-07-30@21:42:31~", "changed": true, "checksum": "064a68908ab9971ee85dbc08ea038387598e3778", "dest": "/tmp/name", "gid": 0, "group": "root", "md5sum": "8ca7c11385856155af52e560f608891c", "mode": "0666", "owner": "root", "size": 12, "src": "/root/.ansible/tmp/ansible-tmp-1690724550.72-4881-89782013861375/source", "state": "file", "uid": 0 } 192.168.200.51 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "backup_file": "/tmp/name.6810.2023-07-30@21:42:31~", "changed": true, "checksum": "064a68908ab9971ee85dbc08ea038387598e3778", "dest": "/tmp/name", "gid": 0, "group": "root", "md5sum": "8ca7c11385856155af52e560f608891c", "mode": "0666", "owner": "root", "size": 12, "src": "/root/.ansible/tmp/ansible-tmp-1690724550.71-4879-69019826385114/source", "state": "file", "uid": 0 } #查看 [root@server01 ~]# ansible centos8_test -m shell -a 'cat /tmp/name' 192.168.200.53 | CHANGED | rc=0 >> I am keerya 192.168.200.52 | CHANGED | rc=0 >> I am keerya 192.168.200.51 | CHANGED | rc=0 >> I am keerya [root@server01 ~]# ansible centos8_test -m shell -a 'ls /tmp' 192.168.200.53 | CHANGED | rc=0 >> ansible_command_payload_fyx6jpfw hosts name name.5041.2023-07-30@21:42:31~ systemd-private-0c3bc5ecac1e4ece9ad802daf96ef848-chronyd.service-8dWGVb vmware-root_845-4021653450 192.168.200.51 | CHANGED | rc=0 >> ansible_command_payload_p26_gcid hosts mysql.sock mysql.sock.lock mysqlx.sock mysqlx.sock.lock name name.6810.2023-07-30@21:42:31~ php-cgi.sock systemd-private-4828da971c0f47aabfef2bf0a50bbd61-chronyd.service-UTsulM vmware-root_835-3988097475 vmware-root_879-4013723248 192.168.200.52 | CHANGED | rc=0 >> ansible_command_payload_u8grdiiq hosts mysql.sock mysql.sock.lock mysqlx.sock mysqlx.sock.lock name name.6872.2023-07-30@21:42:31~ php-cgi.sock systemd-private-9a3853516f1d4d839d8c26ec94d612f1-chronyd.service-deZAnL vmware-root_845-4021653450 vmware-root_849-4013723217 #将vimrc文件拷贝到centos8_test组中,并重新设置其权限和所属主、组 [root@server01 ~]# ansible centos8_test -m copy -a 'src=/etc/vimrc dest=/tmp/vim owner=dm group=dm mode="u=rw,g=r,o=r"' 192.168.200.53 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "7f25563e6bb7e8619d3c51af73161c5f3557ede4", "dest": "/tmp/vim", "gid": 1000, "group": "dm", "md5sum": "feace0072ee0aaa5f5aeee8c778e33f1", "mode": "0644", "owner": "dm", "size": 2780, "src": "/root/.ansible/tmp/ansible-tmp-1690725014.15-5393-171139289216756/source", "state": "file", "uid": 1000 } 192.168.200.51 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "7f25563e6bb7e8619d3c51af73161c5f3557ede4", "dest": "/tmp/vim", "gid": 1000, "group": "dm", "md5sum": "feace0072ee0aaa5f5aeee8c778e33f1", "mode": "0644", "owner": "dm", "size": 2780, "src": "/root/.ansible/tmp/ansible-tmp-1690725014.17-5389-14684100862718/source", "state": "file", "uid": 1000 } 192.168.200.52 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "checksum": "7f25563e6bb7e8619d3c51af73161c5f3557ede4", "dest": "/tmp/vim", "gid": 1000, "group": "dm", "md5sum": "feace0072ee0aaa5f5aeee8c778e33f1", "mode": "0644", "owner": "dm", "size": 2780, "src": "/root/.ansible/tmp/ansible-tmp-1690725014.17-5391-211016008261242/source", "state": "file", "uid": 1000 } #查看 [root@server01 ~]# ansible centos8_test -m shell -a "ls -l /tmp" 192.168.200.53 | CHANGED | rc=0 >> 总用量 20 drwx------ 2 root root 41 7月 30 21:50 ansible_command_payload_t9azjz1z -rw-r--r-- 1 root root 158 7月 30 21:34 hosts -rw-rw-rw- 1 root root 12 7月 30 21:42 name -rw-rw-rw- 1 root root 10 7月 30 21:38 name.5041.2023-07-30@21:42:31~ drwx------ 3 root root 17 7月 29 21:48 systemd-private-0c3bc5ecac1e4ece9ad802daf96ef848-chronyd.service-8dWGVb -rw-r--r-- 1 dm dm 2780 7月 30 21:50 vim -rw-r--r-- 1 dm dm 2780 7月 30 21:49 vimrc drwx------ 2 root root 6 7月 27 03:09 vmware-root_845-4021653450 192.168.200.51 | CHANGED | rc=0 >> 总用量 28 drwx------ 2 root root 41 7月 30 21:50 ansible_command_payload_jvjx9e8o -rw-r--r-- 1 root root 158 7月 30 21:34 hosts srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysql.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysqlx.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysqlx.sock.lock -rw-rw-rw- 1 root root 12 7月 30 21:42 name -rw-rw-rw- 1 root root 10 7月 30 21:38 name.6810.2023-07-30@21:42:31~ srw-rw-rw- 1 www www 0 7月 29 21:48 php-cgi.sock drwx------ 3 root root 17 7月 29 21:48 systemd-private-4828da971c0f47aabfef2bf0a50bbd61-chronyd.service-UTsulM -rw-r--r-- 1 dm dm 2780 7月 30 21:50 vim -rw-r--r-- 1 dm dm 2780 7月 30 21:49 vimrc drwx------ 2 root root 6 7月 29 21:48 vmware-root_835-3988097475 drwx------ 2 root root 6 7月 27 03:09 vmware-root_879-4013723248 192.168.200.52 | CHANGED | rc=0 >> 总用量 28 drwx------ 2 root root 41 7月 30 21:50 ansible_command_payload_3zpdl2qu -rw-r--r-- 1 root root 158 7月 30 21:34 hosts srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysql.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysql.sock.lock srwxrwxrwx 1 mysql mysql 0 7月 29 21:48 mysqlx.sock -rw------- 1 mysql mysql 5 7月 29 21:48 mysqlx.sock.lock -rw-rw-rw- 1 root root 12 7月 30 21:42 name -rw-rw-rw- 1 root root 10 7月 30 21:38 name.6872.2023-07-30@21:42:31~ srw-rw-rw- 1 www www 0 7月 29 21:48 php-cgi.sock drwx------ 3 root root 17 7月 29 21:48 systemd-private-9a3853516f1d4d839d8c26ec94d612f1-chronyd.service-deZAnL -rw-r--r-- 1 dm dm 2780 7月 30 21:50 vim -rw-r--r-- 1 dm dm 2780 7月 30 21:49 vimrc drwx------ 2 root root 6 7月 29 21:48 vmware-root_845-4021653450 drwx------ 2 root root 6 7月 26 23:50 vmware-root_849-4013723217
7、file模块
用于设置文件的属性,比如创建文件、创建链接文件、删除文件等
参数如下:
force: 需要在两种情况下强制创建软链接,一种是源文件不存在但之后会建立的情况下;另一种是目标软链接已存在,需要先取消之前的软链,然后创建新的软链,有两个选项: yes|no
group: 定义文件/目录的属组
mode: 定义文件/目录的权限
owner: 定义文件/目录的属主
path: 必选项,定义文件/目录的路径
recurse: 递归的设置文件的属性,只对目录有效
src: 要被链接的源文件的路径,只应用于state=link的情况
dest: 被链接到的路径,只应用于state=link的情况
state: 表示file的状态, 主要分为:
directory: 如果目录不存在,创建目录;
file: 即使文件不存在,也不会被创建;
link: 创建软链接;
hard: 创建硬链接;
touch: 如果文件不存在,则会创建一个新的文件,如果文件或目录已存在,则更新其最后修改时间;
absent: 删除目录、文件或者取消链接文件;
#创建目录 [root@server01 ~]# ansible centos8_test -m file -a 'path=/tmp/test state=directory' 192.168.200.53 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/test", "size": 6, "state": "directory", "uid": 0 } 192.168.200.51 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/test", "size": 6, "state": "directory", "uid": 0 } 192.168.200.52 | CHANGED => { "ansible_facts": { "discovered_interpreter_python": "/usr/libexec/platform-python" }, "changed": true, "gid": 0, "group": "root", "mode": "0755", "owner": "root", "path": "/tmp/test", "size": 6, "state": "directory", "uid": 0 } #查看创建的目录 [root@server01 ~]# ansible centos8_test -m shell -a 'ls /tmp' 192.168.200.53 | CHANGED | rc=0 >> ansible_command_payload__6x5g91u hosts name name.5041.2023-07-30@21:42:31~ systemd-private-0c3bc5ecac1e4ece9ad802daf96ef848-chronyd.service-8dWGVb test vim vimrc vmware-root_845-4021653450 192.168.200.51 | CHANGED | rc=0 >> ansible_command_payload_ml0r26nu hosts mysql.sock mysql.sock.lock mysqlx.sock mysqlx.sock.lock name name.6810.2023-07-30@21:42:31~ php-cgi.sock systemd-private-4828da971c0f47aabfef2bf0a50bbd61-chronyd.service-UTsulM test vim vimrc vmware-root_835-3988097475 vmware-root_879-4013723248 192.168.200.52 | CHANGED | rc=0 >> ansible_command_payload_enji0ano hosts mysql.sock mysql.sock.lock mysqlx.sock mysqlx.sock.lock name name.6872.2023-07-30@21:42:31~ php-cgi.sock systemd-private-9a3853516f1d4d839d8c26ec94d612f1-chronyd.service-deZAnL test vim vimrc vmware-root_845-4021653450 vmware-root_849-4013723217 #创建文件并将权限设为600 属主和属组设为dm [root@server01 ~]# ansible centos8_test -m file -a 'path=/tmp/test state=touch mode=600 owner=dm group=dm' #创建目录,并将权限设为755 属主和属组设为dm [root@server01 ~]# ansible centos8_test -m file -a 'path=/tmp/test1 state=touch mode=755 owner=dm group=dm' #删除test1目录 [root@server01 ~]# ansible centos8_test -m file -a 'path=/tmp/test1 state=absent' #创建链接文件 [root@server01 ~]# ansible centos8_test -m file -a 'src=/tmp/hosts dest=/tmp/hosts1 state=link' #删除链接文件 [root@server01 ~]# ansible centos8_test -m file -a 'path=/tmp/hosts1 state=absent'
8、fetch模块
用于从远程某主机获取(复制)文件到本地。
dest:用来存放文件的目录
src:在远程拉取的文件,并且必须是一个file,不能是目录
flat: 允许覆盖将目标文件添加到主机名/path/to/file的默认行为。默认为no!! 如果设置为yes, 将不会显示类似192.168.200.53/tmp/信息. (即在dest的本机存放目录下不会创建远程节点ip命名的目录)
#将远程主机组的hosts文件拷贝到本机tmp目录下 需要注意的是要注意,文件保存的路径是我们设置的接收目录下的被管制主机ip目录下 [root@server01 ~]# ansible centos8_test -m fetch -a 'src=/tmp/hosts dest=/tmp' #如果不想要从远程节点拉取过来的文件在本机存放目录里已远程节点ip命名的目录里面可以在后面加flat=yes [root@server01 ~]# ansible centos8_test -m fetch -a 'src=/tmp/vimrc dest=/tmp/vimrc flat=yes'
9、yum模块
该模块主要用于软件的安装
name= #所安装的包的名称
update_cache #强制更新yum的缓存
conf_file #指定远程yum安装时所依赖的配置文件(安装本地已有的包)。
disable_gpg_check #是否禁止GPG checking,只用于presentor latest。
disablerepo #临时禁止使用yum库。 只用于安装或更新时。
enablerepo #临时使用的yum库。只用于安装或更新时。
state:表示是安装还是卸载的状态, 其中present、installed、latest 表示安装, absent 、removed表示卸载删除; present默认状态, laster表示安装最新版本.
#安装ftp软件包 [root@server01 ~]# ansible centos7_test -m yum -a 'name=ftp state=installed' #卸载ftp软件包 [root@server01 ~]# ansible centos7_test -m yum -a 'name=ftp state=removed'
10、apt模块
这个模块是ubuntu作为远端受控节点OS的时候,用的最多的模块。Apt是Ubuntu/Debian的包管理工具。
deb: 用于安装远程机器上的.deb后缀的软件包(optional)
install_recommends: 这个参数可以控制远程电脑上是否只是下载软件包,还是下载后安装,默认参数为true,设置为false的时候只下载软件包,不安装
update_cache: 当这个参数为yes的时候等于apt-get update(optional)
name: apt要下载的软件包名字,支持name=git=1.6 这种制定版本的模式
state: 状态(present,absent,latest),表示是安装还是卸载. 其中present、installed、latest 表示安装, absent 、removed表示卸载删除; present默认状态, laster表示安装最新版本.
在安装foo软件包前更新然后安装foo # ansible web-nodes -m apt -a 'name=foo update_cache=yes' 移除foo软件包 # ansible web-nodes -m apt -a 'name=foo state=absent' 安装foo软件包 # ansible web-nodes -m apt -a 'name=foo state=present' 安装foo 1.0软件包 # ansible web-nodes -m apt -a 'name=foo=1.00 state=present' 安装nginx最新的名字为squeeze-backport发布包,并且安装前执行更新 # ansible web-nodes -m apt -a 'name=nginx state=latest default_release=squeeze-backports update_cache=yes' 只下载openjdk-6-jdk最新的软件包,不安装 # ansible web-nodes -m apt -a 'name=openjdk-6-jdk state=latest install_recommends=no' 安装所有软件包到最新版本 # ansible web-nodes -m apt -a 'upgrade=dist' 更新apt-get的list # ansible web-nodes -m apt -a 'update_cache=yes' 3600秒后停止update_cache # ansible web-nodes -m apt -a 'update_cache=yes cache_valid_time=3600' 安装远程节点上的/tmp/mypackage.deb软件包 # ansible web-nodes -m apt -a 'deb=/tmp/mypackage.deb'
11、service模块或systemd模块
该模块用于服务程序的管理。
管理服务的模块, service管理的服务必须是yum安装的服务, 即默认的系统服务脚本。编译安装的服务不好使用service模块管理.
name: 服务名称;
state: started/stopped/restarted/reloaded;
enabled: true/false;
runlevel: 运行级别;
sleep: 如果执行了restarted,在stop和start之间沉睡几秒;
arguments: 给命令行提供一些选项;
#重启服务并设为开机自启 [root@server01 ~]# ansible centos7_test -m service -a 'name=firewalld state=restarted enabled=true' #重启服务 [root@server01 ~]# ansible centos7_test -m systemd -a 'name=firewalld state=restarted'
service模块适用于service管理程序的情况,如果是centos7系统,使用systemctl管理程序的话,可以使用systemd模块。systemctl可以控制程序启/停,reload,开机启动,观察程序状态(status)等。systemd模块的主要参数如下:
name: 服务名称,例如crond.service,最好带上后缀 .service
state: 需要的操作,started/stopped/restarted/reloaded
enabled:是否需要开机启动
daemon_reload:systemd 读取配置文件,每次修改了文件,最好都运行一次,确保应用了
12、user和group模块
该模块主要是用来管理用户账号和添加、删除组。
user模块是请求的是useradd, userdel, usermod三个指令,goup模块请求的是groupadd, groupdel, groupmod 三个指令。
user模块
home: 指定用户的家目录, 需要与createhome配合使用。
groups: 指定用户的属组。
uid: 指定用的uid。
password: 设定用户密码, password参数需要接受md5加密后的值. 特别注意: 指定password参数时, 不能使用明文密码, 因为后面这一串密码会被直接传送到被管理主机的/etc/shadow文件中, 所以需要先将密码字符串进行加密处理, 然后将得到的字符串放到password中即可。
name: 指定用户名。
system: 是否为系统用户。 表示默认创建为普通用户, 而非系统用户, 指定是用yes. 也就是说yes是默认创建为普通用户, 而非系统用户;
update_password: 修改用户密码, 其中always: 新密码和旧密码不同时进行修改; on_create: 为新创建的用户指定密码.
createhome: 创建家目录, 其中yes表示默认项, 即创建用户默认是有家目录的; no表示创建用户时不创建家目录.
remove: 其中yes是删除用户家目录, 需要指定此参数; no是默认项, 删除用户时默认不删除用户的家目录. 当state=absent时, remove=yes则表示连同家目录一起删除, 等价于userdel -r。
state: 用户状态是创建还是删除. (present, absent) ;默认为present; 其中present表示添加用户; absent表示删除用户
shell: 指定用户的shell环境。
generate_ssh_key: 是否为相关用户生成SSH密钥。 这不会覆盖现有的SSH密钥。
ssh_key_bits: 可选择指定要创建的SSH密钥中的位数。
ssh_key_passphrase: 设置SSH密钥的密码。 如果没有提供密码, SSH密钥将默认没有密码。
ssh_key_file: 指定SSH密钥文件名(可选). 如果这是一个相对的文件名, 那么它将是相对于用户的主目录。
ssh_key_type: 指定要生成的SSH密钥的类型(可选). 可用的SSH密钥类型将取决于目标主机上的实现。
使用bash shell添加用户haha,将组"管理员"和"开发人员"附加到用户组 [root@ansible-server ~]# ansible web-nodes -m user -a "name=haha shell=/bin/bash groups=admins,developers append=yes" 增加用户anhui (先对密码做明文到密文的处理) [root@ansible-server ~]# echo "anhui@123" | openssl passwd -1 -stdin $1$rj74jCVy$NDW80bgY0DUTuHUlSunVv1 [root@ansible-server ~]# ansible web-nodes -m user -a 'name=anhui system=yes password=$1$rj74jCVy$NDW80bgY0DUTuHUlSunVv1 state=present' 删除用户anhui [root@ansible-server ~]# ansible web-nodes -m user -a 'name=anhui remove=yes state=absent' 更新用户kevin的密码 (先对新密码kevin@bj123做明文到密文的处理) [root@ansible-server ~]# echo "kevin@bj123"| openssl passwd -1 -stdin $1$5X5bH5.J$RwE6o6g6bX953W7vAaizv/ [root@ansible-server ~]# ansible web-nodes -m user -a 'name=kevin update_password=always password=$1$5X5bH5.J$RwE6o6g6bX953W7vAaizv/' 在~/.ssh/id_rsa中为用户bobo创建一个2048位的SSH密钥 [root@ansible-server ~]# ansible web-nodes -m user -a 'name=bobo generate_ssh_key=yes ssh_key_bits=2048 ssh_key_file=.ssh/id_rsa' [root@ansible-server ~]# ansible web-nodes -m group -a "name=yang gid=888" [root@ansible-server ~]# ansible web-nodes -m user -a "name=yang uid=888 group=888 shell=/sbin/nologin create_home=no"
group模块
gid: 指定用的gid。
name: 指定用户名。
state: 是创建还是删除, (present,absent);
system: 如果是,则表示创建的组是系统组;
[root@ansible-server ~]# ansible web-nodes -m group -a "name=huoqiu state=present" [root@ansible-server ~]# ansible web-nodes -m group -a "name=chenzun gid=897 state=present" [root@ansible-server ~]# ansible web-nodes -m group -a "name=huoqiu state=absent"
13、script模块
该模块用于将本机的脚本在被管理端的机器上运行。
[root@server01 ~]# ansible all -m script -a "/opt/test.sh"
14、setup模块
用于收集远程受控主机的一些基本信息.
filter参数:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息
ansible_all_ipv4_addresses:仅显示ipv4的信息。
ansible_devices:仅显示磁盘设备信息。
ansible_distribution:显示是什么系统,例:centos,suse等。
ansible_distribution_major_version:显示是系统主版本。
ansible_distribution_version:仅显示系统版本。
ansible_machine:显示系统类型,例:32位,还是64位。
ansible_eth0:仅显示eth0的信息。
ansible_hostname:仅显示主机名。
ansible_kernel:仅显示内核版本。
ansible_lvm:显示lvm相关信息。
ansible_memtotal_mb:显示系统总内存。
ansible_memfree_mb:显示可用系统内存。
ansible_memory_mb:详细显示内存情况。
ansible_swaptotal_mb:显示总的swap内存。
ansible_swapfree_mb:显示swap内存的可用内存。
ansible_mounts:显示系统磁盘挂载情况。
ansible_processor:显示cpu个数(具体显示每个cpu的型号)。
ansible_processor_vcpus:显示cpu个数(只显示总的个数).
#不加过滤参数, 就会将受控主机的所有信息都打印出来 [root@server01 ~]# ansible all -m setup #获取受控主机的IPV4地址 [root@server01 ~]# ansible all -m setup -a 'filter=ansible_all_ipv4_addresses' #获取受控主机的内存信息 [root@server01 ~]# ansible all -m setup -a 'filter=ansible_memory_mb' #将获取的信息保存到本地主机上 [root@server01 ~]# ansible all -m setup -a 'filter=ansible_memory_mb' --tree /tmp/facts
15、pip模块
用于管理Python库依赖项,为了使用pip模块,必须提供参数name或者requirements
chdir: 执行pip命令前cd进入的目录
name:要安装的Python库的名称或远程包的URL。
requirements:一个pip requirements.txt文件的路径,它应该是远程系统的本地文件,如果使用chdir选项,则可以将文件指定为相对路径。
version:指定的Python库的安装版本。
extra_args:额外的参数传递给pip (后面使用双引号)。
executable:显式可执行文件或可执行文件的路径名,用于为系统中安装的特定版本的Python运行pip。 例如pip-3.3,如果系统中安装了Python 2.7和3.3,并且想要为Python 3.3安装运行pip。 它不能与“virtualenv”参数一起指定(在2.1中添加)。 默认情况下,它将采用适用于python解释器的版本。 pip3在python 3上,pip2或pip在python 2上。
virtualenv:要安装到的virtualenv目录的可选路径。 它不能与’executable’参数一起指定(在2.1中添加)。 如果virtualenv不存在,则将在安装软件包之前创建它。 可选的virtualenv_site_packages,virtualenv_command和virtualenv_python选项会影响virtualenv的创建。
virtualenv_command:用于创建虚拟环境的命令或路径名。 例如pyvenv,virtualenv,virtualenv2,~/bin /virtualenv,/usr/local/bin/virtualenv。
virtualenv_python:用于创建虚拟环境的Python可执行文件。 例如python3.5,python2.7。 未指定时,将使用用于运行ansible模块的Python版本。 当virtualenv_command使用pyvenv或-m venv模块时,不应使用此参数。
state:状态(present,absent,latest, forcereinstall),表示是安装还是卸载的状态. 其中present表示默认安装; lastest表示最新版本安装; absent表示卸载和删除; forcereinstall表示强制重新安装, "forcereinstall"选项仅适用于可ansible 2.1及更高版本.
安装bottle python包 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle' [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle state=present' #默认的present状态可以省略不写 卸载bottle python包 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle state=absent' 在0.4.6版安装bottle python包 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle version=0.4.6 state=present' 使用远程协议(bzr +,hg +,git +,svn +)安装MyApp。 不必在extra_args中提供'-e'选项。 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=svn+http://myrepo/svn/MyApp#egg=MyApp' 使用远程协议(bzr +,hg +,git +)安装MyApp。 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=git+http://myrepo/app/MyApp' 从本地压缩包安装MyApp [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=file:///path/to/MyApp.tar.gz' 将bottle安装到指定的virtualenv中,继承全局安装的模块 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle virtualenv=/my_app/venv virtualenv_site_packages=yes' 使用Python 2.7将bottle安装到指定的virtualenv中 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle virtualenv=/my_app/venv virtualenv_command=virtualenv-2.7' 在用户主目录中安装bottle (extra_args后面使用双引号) [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle extra_args="--user"' 安装指定的python requirements [root@ansible-server ~]# ansible web-nodes -m pip -a 'requirements=/my_app/requirements.txt' 在指定的virtualenv中安装指定的python requirements [root@ansible-server ~]# ansible web-nodes -m pip -a 'requirements=/my_app/requirements.txt virtualenv=/my_app/venv' 安装指定的python requirements和自定义pip源URL [root@ansible-server ~]# ansible web-nodes -m pip -a 'requirements=/my_app/requirements.txt extra_args="-i https://example.com/pypi/simple"' 专门为Python 3.3安装bottle,使用'pip-3.3'可执行文件 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle executable=pip-3.3' 安装 bottle,如果已安装,强制重新安装 [root@ansible-server ~]# ansible web-nodes -m pip -a 'name=bottle state=forcereinstall'
16、synchronize模块
这个模块是使用rsync同步文件,将主控方目录推送到指定受控节点的目录下
delete: 删除不存在的文件,delete=yes 使两边的内容一样(即以推送方为主),默认no
src: 要同步到目的地的源主机上的路径; 路径可以是绝对的或相对的。如果路径使用”/”来结尾,则只复制目录里的内容,如果没有使用”/”来结尾,则包含目录在内的整个内容全部复制
dest:目的地主机上将与源同步的路径; 路径可以是绝对的或相对的。
dest_port:默认目录主机上的端口 ,默认是22,走的ssh协议。
mode: push或pull,默认push,一般用于从本机向远程主机上传文件,pull 模式用于从远程主机上取文件。
rsync_opts:通过传递数组来指定其他rsync选项。
#将受控主机上的/tmp目录同步到受控节点的/tmp目录下,不一样的就删除! 默认delete=no [root@server01 ~]# ansible all -m synchronize -a 'src=/tmp/ dest=/tmp/ delete=yes' 注意命令中要加"/", 如果不加"/", 则主控节点的/tmp目录就同步到受控节点的/tmp目录下即, 即/tmp/tmp #将主控节点上/tmp目录同步到受控节点的/tmp目录下. 但是222文件排除在外! rsync_opts可以进行多次传递. [root@server01 /tmp]# ansible all -m synchronize -a 'src=/tmp/ dest=/tmp/ rsync_opts="--no-motd" rsync_opts="--exclude=222"' #强制两边同步保持一致! 跟主控节点源目录保持一致! [root@server01 /tmp]# ansible all -m synchronize -a 'src=/tmp/ dest=/tmp/ rsync_opts="--no-motd" rsync_opts="--exclude=222" delete=yes' #从远程受控节点上将/etc/passwd文件拉取到主控节点的/tmp目录下 [root@server01 ~]# ansible all -m synchronize -a 'src=/etc/passwd dest=/tmp/ rsync_opts="-avpgolr" mode=pull'
17、get_url模块
该模块主要用于从http、ftp、https服务器上下载文件(类似于wget)
sha256sum: 下载完成后进行sha256 check;
timeout: 下载超时时间, 默认10s
url: 下载的URL
url_password、url_username: 主要用于需要用户名密码进行验证的情况
dest: 将文件下载到哪里的绝对路径。如果dest是目录, 则使用服务器提供的文件名, 或者如果没有提供, 将使用远程服务器上的URL的基本名称。
headers: 以格式“key: value, key: value”为请求添加自定义HTTP标头
[root@ansible-server ~]# ansible web-nodes -m get_url -a "url=http://lan.Okay686.com/RDPWrap-v1.6.1.zip dest=/usr/local/src/" [root@ansible-server ~]# ansible web-nodes -m get_url -a "url=http://10.0.8.50/ops.sh dest=/opt/shell.sh mode=0440" [root@ansible-server ~]# ansible web-nodes -m get_url -a 'url=http://10.0.8.50/ops.sh dest=/opt/shell.sh headers="key:value,key:value"' [root@ansible-server ~]# ansible web-nodes -m get_url -a 'url=http://10.0.8.50/ops.sh dest=/opt/shell.sh checksum=sha256:b5bb9d8014a0f9b1d61e21e796d78dccdf1352f23cd32812f4850b878ae4944c'
18、unarchive模块
用于解压文件,模块包含如下选项:
copy: 在解压文件之前,是否先将文件复制到远程主机,默认为yes。若为no,则要求目标主机上压缩包必须存在。
creates: 指定一个文件名,当该文件存在时,则解压指令不执行
dest: 远程主机上的一个路径,即文件解压的绝对路径。 必须是一个目录路径!
group: 解压后的目录或文件的属组;
list_files: 如果为yes,则会列出压缩包里的文件,默认为no,2.0版本新增的选项;
mode: 解压后文件的权限;
src: 如果copy为yes,则需要指定压缩文件的源路径;
owner: 解压后文件或目录的属主;
经测试, 该模块解压时识别zip, tgz , tar.gz, tar.bz2 格式的压缩包, gzip格式的测试时不支持.
将/usr/local/src/nginx.tgz解压缩到/data/www中 [root@ansible-server ~]# ansible web-nodes -m unarchive -a "src=/usr/local/src/nginx.tgz dest=/data/www/" 解压远程受控节点上已存在的文件 [root@ansible-server ~]# ansible web-nodes -m unarchive -a "src=/root/file.zip dest=/usr/local remote_src=yes" 解压文档需要下载的文件(2.0中添加) [root@ansible-server ~]# ansible web-nodes -m unarchive -a "src=https://example.com/example.zip dest=/usr/local/bin remote_src=yes"
18、hostname模块
修改远程受控节点的主机名的模块
使用hostname模块修改远程节点的主机名时, 最好指明远程单节点ip地址进行设置主机名了. 因为不同节点的主机名不一样
[root@server01 ~]# ansible 192.168.200.50 -m hostname -a 'name="test"'
19、stat模块
获取远程文件的状态信息,包括atime,ctime,mtime,md5,uid,gid等信息
[root@server01 ~]# ansible all -m stat -a 'path=/tmp/passwd'
20、mount模块
在远程受控节点上挂载文件系统。
present: 开机挂载,仅将挂载配置写入/etc/fstab(不常用)
mounted: 挂载设备,并将配置写入/etc/fstab
unmounted: 卸载设备,不会清除/etc/fstab写入的配置
absent: 卸载设备,会清理/etc/fstab写入的配置
mount已经使用path代替了原来的name参数,但是name参数还是可以使用的.
将受控节点的/dev/sd0设备挂载到/mnt/data目录上, 文件格式为ext4, 只读属性 [root@ansible-server ~]# ansible web-nodes -m mount -a "path=/mnt/data src=/dev/sd0 fstype=ext4 ots=ro state=present" 仅将挂载的配置写入/etc/fstab,并不会执行挂载操作 [root@ansible-server ~]# ansible web-nodes -m mount -a "src=172.16.60.220:/data path=/data fstype=nfs opts=defaults state=present" 临时挂载设备,并将挂载信息写入/etc/fstab [root@ansible-server ~]# ansible web-nodes -m mount -a "src=172.16.60.220:/data path=/data fstype=nfs opts=defaults state=mounted" 临时卸载,不会清理/etc/fstab [root@ansible-server ~]# ansible web-nodes -m mount -a "src=172.16.60.220:/data path=/data fstype=nfs opts=defaults state=unmounted" 卸载,不仅临时卸载,同时会清理/etc/fstab [root@ansible-server ~]# ansible web-nodes -m mount -a "src=172.16.60.220:/data path=/data fstype=nfs opts=defaults state=absent"
21、find模块
帮助在被管理的受控主机中查找符合条件的文件,就像 find 命令一样
常用选项:
paths: 必须参数,指定在哪个目录中查找文件,可以指定多个路径,路径间用逗号隔开,此参数有别名,使用别名 path 或者别名 name 可以代替 paths。
recurse: 默认情况下,只会在指定的目录中查找文件,也就是说,如果目录中还包含目录,ansible 并不会递归的进入子目录查找对应文件,如果想要递归的查找文件,需要使用 recurse 参数,当 recurse 参数设置为 yes 时,表示在指定目录中递归的查找文件。
hidden: 默认情况下,隐藏文件会被忽略,当 hidden 参数的值设置为 yes 时,才会查找隐藏文件。
file_type: 默认情况下,ansible 只会根据条件查找”文件”,并不会查找”目录”或”软链接”等文件类型,如果想要指定查找的文件类型,可以通过 file_type 指定文件类型,可指定的文件类型有 any、directory、file、link 四种。
patterns: 使用此参数指定需要查找的文件名称,支持使用 shell(比如通配符)或者正则表达式去匹配文件名称,默认情况下,使用 shell 匹配对应的文件名,如果想要使用 python 的正则去匹配文件名,需要将 use_regex 参数的值设置为 yes。
use_regex:默认情况下,find 模块不会使用正则表达式去解析 patterns 参数中对应的内容,当 use_regex 设置为 yes 时,表示使用 python 正则解析 patterns 参数中的表达式,否则,使用 glob 通配符解析 patterns 参数中的表达式。
contains:使用此参数可以根据文章内容查找文件,此参数的值为一个正则表达式,find 模块会根据对应的正则表达式匹配文件内容。
age: 使用此参数可以根据时间范围查找文件,默认以文件的 mtime 为准与指定的时间进行对比,比如,如果想要查找 mtime 在3天之前的文件,那么可以设置 age=3d,如果想要查找 mtime 在3天以内的文件,可以设置 age=-3d,这里所说的3天是按照当前时间往前推3天,可以使用的单位有秒(s)、分(m)、时(h)、天(d)、星期(w)。
age_stamp: 文件的时间属性中有三个时间种类,atime、ctime、mtime,当我们根据时间范围查找文件时,可以指定以哪个时间种类为准,当根据时间查找文件时,默认以 mtime 为准。
size: 使用此参数可以根据文件大小查找文件,比如,如果想要查找大于3M的文件,那么可以设置 size=3m,如果想要查找小于50k的文件,可以设置 size=-50k,可以使用的单位有 t、g、m、k、b。
get_checksum: 当有符合查找条件的文件被找到时,会同时返回对应文件的 sha1校验码,如果要查找的文件比较大,那么生成校验码的时间会比较长
在受控主机的 /data目录中查找文件内容中包含wang字符串的文件,隐藏文件会被忽略,不会进行递归查找。 [root@ansible-server ~]# ansible web-nodes -m find -a "paths=/data contains=".*wang.*"" 在受控主机的的 /data目录以及其子目录中查找文件内容中包含wang字符串的文件,隐藏文件会被忽略。 [root@ansible-server ~]# ansible web-nodes -m find -a "paths=/data contains=".*wang.*" recurse=yes" 在受控主机的的 /data目录中查找以 .sh 结尾的文件,包括隐藏文件,但是不包括目录或其他文件类型,不会进行递归查找。 [root@ansible-server ~]# ansible web-nodes -m find -a 'paths=/data patterns="*.sh" file_type=any hidden=yes' 在受控主机的的 /data目录中查找以 .sh 结尾的文件,只不过patterns对应的表达式为正则表达式,查找范围包括隐藏文件,包括所有文件类型, 但是不会进行递归查找,不会对/data目录的子目录进行查找。 [root@ansible-server ~]# ansible web-nodes -m find -a 'paths=/data patterns=".*\.sh" use_regex=yes file_type=any hidden=yes' 在受控主机的的 /data目录中以及其子目录中查找 mtime 在1天以内的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。 [root@ansible-server ~]# ansible web-nodes -m find -a "path=/data age=-1d recurse=yes" 在受控主机的的 /data目录中以及其子目录中查找大于 2g 的文件,不包含隐藏文件,不包含目录或软链接文件等文件类型。 [root@ansible-server ~]# ansible web-nodes -m find -a "paths=/data size=2g recurse=yes" 在受控主机的的 /data目录中以及其子目录中查找以 .sh 结尾的文件,并且返回符合条件文件的 sha1 校验码,包括隐藏文件 [root@ansible-server ~]# ansible web-nodes -m find -a "paths=/data patterns=*.sh get_checksum=yes hidden=yes recurse=yes"
22、selinux模块
管理远程受控节点的selinux的模块
[root@server01 ~]# ansible all -m selinux -a 'state=disabled'