1、ansible管理命令
- Ansible命令行执行方式有Ad-Hoc、Ansible-playbook两种方式:
- Ad-Hoc主要用于临时命令的执行。
- Ansibel-playbook可以理解为Ad-Hoc的集合,通过一定的规则编排在一起。
- 两者的操作也极其简便,且提供了如with_items、failed_when、changed_when、until、ignore_errors等丰富的逻辑条件和Dry-run的Check Mode。但在Chceck Mode下并不真正执行命令,即将执行的操作不会对端服务器产生任何影响,只模拟命令的执行过程是否能正常执行。
- Ansible管理命令有:
- ansible:这个命令是日常工作中使用率非常高的命令之一,主要用于临时一次性操作。
- ansible-doc:Ansible模块文档说明,针对每个模块都有详细的用法说明和应用案例介绍。
- ansible-galaxy:可以简单的理解为Github或PIP的功能,是Ansible官方一个分享role的功能平台。可以通过ansible-galaxy命令很简单的实现role的分享和安装。
- ansible-playbook:是日常应用中使用频率最高的命令,其工作机制是,通过读取预先编写好的playbook文件实现批量管理。
- ansible-pull:Ansible的另一种工作模式(pull模式),Ansible默认使用push模式。
- ansible-vault:主要用于配置文件加密。
- ansible-console:让用户可以在ansible-console虚拟出来的终端上像Shell一样使用Ansible内置的各种命令。
1.1、ansible命令
- Ad-Hoc是官方对Ansible命令的一种称谓。一般称之为“临时操作”或Ansible命令。
- Ad-Hoc是相对Ansible-playbook而言的,Ansible提供两种完成任务方式:
- 一种是Ad-Hoc命令集,即ansible命令。解决一些简单或者平时工作中临时遇到的任务,相当于Linux系统命令行下的Shell命令。
- 另一种是ansible-playbook命令。解决复杂或需固化下来的任务,相当于Linux系统的Shell Scripts。
- 需要使用Ad-Hoc的场景
- 情景1:节假日将至,我们需要关闭所有不必要的服务器,并对所有服务器进行节前健康检查。
- 情景2:临时更新Apache&Nginx的配置文件,且需同时将其分发至所有需更新该配置的Web服务器。
- 需要使用Ansible-playbook的场景
- 情景1:新购置的服务器安装完系统后需做一系列固化的初始化工作,诸如:定制防火墙策略、添加NTP时间同步配置、添加EPEL源等。
- 情景2:业务侧每周定期对生产环境发布更新程序代码。
- Ansible的命令使用格式如下:
ansible <host-pattern> [options]
- <host-pattern>是Inventory中定义的主机或主机组,可以为ip、hostname、Inventory中的group组名、具有“.”或“*”或“:”等特殊字符的匹配型字符串。<>表示该选项是必须项,不可忽略。
- [options]是Ansible的参数选项,[]表示该选项中的参数任选其一。
- -i INVENTORY, --inventory INVENTORY:指定主机清单文件(默认/etc/ansible/hosts),或以逗号分隔的主机列表。
- -m MODULE_NAME, --module-name MODULE_NAME:指定要使用的模块(default=command)。
- -a MODULE_ARGS, --args MODULE_ARGS:模块参数。
- -f FORKS, --forks FORKS:并发管控主机的数量(default=5)。
- --list-hosts:列出符合条件的主机列表,不执行任何操作。
- -M MODULE_PATH, --module-path MODULE_PATH:指定模块存放路径,默认/usr/share/ansible,也可以通过ANSIBLE_LIBRARY设定默认路径。
- -l SUBSET, --limit SUBSET:指定运行的主机。
- -C, --check:检查语法。测试执行,不会做任何更改。
- -v, --verbose:输出更详细的执行过程信息,-vvv可得到执行过程所有信息。
- -o, --one-line:标准输出至一行。
- -t TREE, --tree TREE:输出信息至TREE目录下,结果文件以远程主机名命名。
- -b, --become:使用在远程主机上切换到root用户去执行命令(不提示密码)。要在远程主机提升sudo权限(例如centoshh ALL=(ALL) NOPASSWD:ALL)。
- -u REMOTE_USER, --user REMOTE_USER:指定远程主机以此用户运行命令。(default=None)。
- -K, --ask-become-pass:用户的密码(--sudo时使用)
- --private-key PRIVATE_KEY_FILE, --key-file PRIVATE_KEY_FILE:指定密钥文件。
ansible <host-pattern> -m MODULE_NAME -a MODULE_ARGS -f FORKS -b
- ansible命令主要使用场景:
- 非固化需求
- 临时一次性操作
- 二次开发接口调用
- Ansible的返回结果都非常友好,一般会用3种颜色来表示执行结果:红色、绿色、橘黄色。
- 红色表示执行过程有异常,一般会中止剩余所有的任务。
- 绿色和橘黄色表示执行过程没有异常,所有任务均正常执行,但橘黄色表示命令执行结束后目标有状态的变化。
- 不仅ansible命令的执行结果如此设置,Ansible系列命令均如此设置,所以判断Ansible系列命令的执行结果是否正常是一件非常容易的事情,只要看颜色即可。
示例1:
- 针对特定主机做变更。
//--limit:通过--limit参数限定主机做变更。
]# ansible all -i /etc/ansible/hosts -m shell -a "pwd" --limit "10.1.1.12"
//指定IP:通过指定具体IP限定主机做变更。
]# ansible 10.1.1.12 -m shell -a "pwd"
//用“,”或“:”作分隔符,指定多台机器做变更。
]# ansible 10.1.1.12,10.1.1.13 -m shell -a "pwd"
]# ansible 10.1.1.12:10.1.1.13 -m shell -a "pwd"
//通过“*”泛匹配,更灵活地针对多台主机做变更。
]# ansible 10.1.1.* -m shell -a "pwd"
示例2:
]# ansible all -i /etc/ansible/hosts -m ping
10.1.1.12 | SUCCESS => { #10.1.1.12是执行命令的主机,Success表示命令执行成功,“>>{}”表示详细返回结果
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false, #“"changed":false”表示没有对主机做变更。
"ping": "pong" #“"ping":"pong"”表示执行了ping命令返回结果为pong。
}
...
1.2、Ansible-playbook命令
- ansible-playbook:是日常应用中使用频率最高的命令,其工作机制是,通过读取预先编写好的playbook文件实现批量管理。
- Ansible-playbook的命令使用格式如下:
ansible-playbook playbook.yml
- Ansible-playbook的参数:
- -i INVENTORY, --inventory INVENTORY:指定主机清单文件,或以逗号分隔的主机列表。
- -b, --become:使用在远程主机上切换到root用户去执行命令(不提示密码)。要在远程主机提升sudo权限(例如centoshh ALL=(ALL) NOPASSWD:ALL)。
- -f FORKS, --forks FORKS:并发管控主机的数量(default=5)。
- -C, --check:测试执行,不会做任何更改。
- --syntax-check:检查Playbook中的语法,但不执行。
- --list-hosts:列出匹配的主机列表,不执行任何操作。
- --list-tasks:列出所有要执行的任务。
- --list-tags:列出所有可用的tags。
- -t TAGS, --tags TAGS:只执行指定的tags任务。
- --skip-tags SKIP_TAGS:跳过指定的tags任务。
- --start-at-task START_AT_TASK:从第几条任务开始执行。
- --step:逐步执行Playbook定义的任务,并经人工确认后继续执行下一步任务。
- -e EXTRA_VARS, --extra-vars EXTRA_VARS:在Playbook中引入外部变量。
- -D,--diff:当更新的文件数及内容较少时,该选项可显示这些文件不同的地方,该选项结合-C用会有较好的效果。
- --ask-vault-pass:使用加密playbook文件时提示输入密码。
- --force-handlers:即使任务失败,也要运行处理程序
- --flush-cache:清除缓存。
- --version:显示程序版本号,配置文件位置,配置模块搜索路径,模块位置,可执行位置和退出
- --become-user BECOME_USER:以此用户运行操作(default=root)
1.3、ansible-galaxy命令
- ansible-galaxy:可以简单的理解为Github或PIP的功能,是Ansible官方一个分享role的功能平台。可以通过ansible-galaxy命令很简单的实现role的分享和安装。
- ansible-galaxy命令可以根据下载量和关注量等信息,查找和安装优秀的Roles。
- Roles下载地址:https://galaxy.ansible.com
//执行各种角色和收集相关的操作。
]# ansible-galaxy -h
usage: ansible-galaxy [-h] [--version] [-v] TYPE ...
positional arguments:
TYPE
collection 管理Ansible Galaxy集合。
role 管理Ansible Galaxy角色。
]# ansible-galaxy role -h
usage: ansible-galaxy role [-h] ROLE_ACTION ...
positional arguments:
ROLE_ACTION
info 查看指定role的详细信息。
list 列出本地已下载的Roles。
init 使用role的基本结构初始化新role。
search 通过标签、平台、作者或关键字搜索Galaxy数据库。
install 从file(s)、URL(s)或Ansible Galaxy安装role(s)
remove 删除本地已下载的Roles。
delete 从Galaxy中移除角色。它不会删除或更改实际的GitHub存储库。
import 导入一个角色
setup 管理Galaxy和给定源代码之间的集成。
]# ansible-galaxy collection -h
usage: ansible-galaxy collection [-h] COLLECTION_ACTION ...
positional arguments:
COLLECTION_ACTION
init 使用集合的基本结构初始化新的集合。
build 构建一个Ansible集合神器,可以发布到Ansible Galaxy。
publish 向Ansible Galaxy发布一个收藏品。
install 从file(s)、URL(s)或Ansible Galaxy安装集合
1.4、ansible-pull命令
- ansible-pull:Ansible的另一种工作模式:pull模式(Ansible默认使用push模式)。
- 适用于以下场景:
- 有数量巨大的机器需要配置,即使使用高并发线程依旧要花费很多时间;
- 要在刚启动的、没有网络连接的主机上运行Ansible。
- ansible-pull命令使用格式如下:
ansible-pull [options] [playbook.yml]
- [options]是参数选项。
- -o, --only-if-changed:只有在存储库已更新时才运行剧本(playbook )。
- -C CHECKOUT, --checkout CHECKOUT:检验branch(分支)/tag(标记)/commit(提交)。存储库模块默认是branch。
- -d DEST, --directory DEST:从存储库下载到目录
- -i INVENTORY, --inventory INVENTORY:指定主机清单文件(默认/etc/ansible/hosts),或以逗号分隔的主机列表。
- -U URL, --url URL:剧本库的URL
- --check:测试执行,不会做任何更改。
- --diff:当更改(小)文件和模板时,显示这些文件的差异。
- -m MODULE_NAME, --module-name MODULE_NAME:存储库模块名,可用值有git(默认)、subversion、hg、bzr。
- -f, --force:即使无法更新存储库,也要运行剧本
- --list-hosts:列出将管控的主机列表,不执行任何操作。
- -u REMOTE_USER, --user REMOTE_USER:以此用户连接远程主机(default=None)。
- 通过ansible-pull结合Git和crontab一并实现,其原理是:通过crontab定期拉取指定的Git版本到本地,并以指定模式自动运行预先制订好的指令。
*/20 * * * * root /usr/local/bin/ansible-pull -o -C 2.1.0 -d /srv/www/king-gw/ -i /etc/ansible/hosts \
-U git://git.kingifa.com/king-gw-ansiblepull >> /var/log/ansible-pull.log 2>&1
- ansible-pull通常在配置大批量机器的场景下会使用,灵活性稍有欠缺,但效率几乎可以无限提升,对运维人员的技术水平和前瞻性规划有较高要求。
1.5、ansible-doc命令
- ansible-doc是Ansible模块说明文档,针对每个模块都有详细的用法说明及应用案例介绍,和Linux系统的man命令类似。
- ansible-doc命令使用格式如下:
ansible-doc [options] [module...]
- 常用参数
//列出支持的模块
ansible-doc -l
//查看模块功能说明
ansible-doc MODULE_NAME
//查看模块的参数
ansible-doc -s MODULE_NAME
1.6、ansible-vault命令
- ansible-vault主要用于配置文件加密,如编写的Playbook配置文件中包含敏感信息,不希望其他人随意查看,ansible-vault可加密/解密这个配置文件。
- ansible-vault命令使用格式如下:
]# ansible-vault --help
usage: ansible-vault {create,decrypt,edit,view,encrypt,encrypt_string,rekey} ...
positional arguments:
encrypt 加密YAML文件
encrypt_string 加密字符串
create 创建新的vault加密文件
edit 编辑vault加密文件
view 查看vault加密文件
rekey 重新为vault加密文件密钥
decrypt 解密
示例:
//加密a.yml文件
ansible-vault encrypt a.yml
//解密a.yml文件
ansible-vault decrypt a.yml
1.7、ansible-console命令
- ansible-console为用户提供的一款交互式工具,用户可以在ansible-console虚拟出来的终端上像Shell一样使用Ansible内置的各种命令,这为习惯于使用Shell交互方式的用户提供了良好的使用体验。
- ansible-console主要是针对1.X版本中ansible-shell工具而研发的,目前官网还没有对ansible-console进行详细的用法说明,最新版本的Ansible软件包也没有对应的man文档说明。
2、Ansible常用模块
2.1、ansible-doc命令
- ansible-doc是Ansible模块说明文档,针对每个模块都有详细的用法说明及应用案例介绍,和Linux系统的man命令类似。
- ansible-doc命令使用格式如下:
ansible-doc [options] [module...]
- 常用用法
//列出支持的模块
ansible-doc -l
//查看模块功能说明
ansible-doc MODULE_NAME
//查看模块的参数(模块的参数,带等号的是必选的,不带的是可选的)
ansible-doc -s MODULE_NAME
2.2、ping模块
- 判断远程主机是否在线。
示例:
]# ansible all -i /etc/ansible/hosts -m ping
10.1.1.12 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
...
2.3、command模块
- command模块是Ansible默认模块,主要在远程主机执行Linux基础命令,但不用shell解析。
- command模块不支持变量(如$HOME)、重定向、管道符等,比如“<”,“>”,“|”,“;”和“&”这些符号不会生效。如果需要这些功能,可以使用[shell]模块。
- 常用参数:
- chdir:执行命令前,切换到此目录。(type: path,[Default: (null)])
- creates:当文件名或(从2.0开始)glob模式存在时,不执行该命令(type: path,[Default: (null)])
- removes:当文件名或(从2.0开始)glob模式不存在时,不执行该命令(type: path,[Default: (null)])
- warn:启用或禁用任务警告。如果设定了false,不会告警。(type: bool,[Default: True])
- free_from:需要执行的脚本,一般使用Ansible的-a参数代替。( [Default: (null)],type: str)
示例:
ansible all -m command -a "ls chdir=/"
//如果a.txt文件存在,该命令就不执行
ansible all -m command -a "ls chdir=/ creates=a.txt"
//如果a.txt文件不存在,该命令就不执行
ansible all -m command -a "ls chdir=/ removes=a.txt"
//禁止告警
ansible all -m command -a "mkdir /test/aaa warn=false"
2.4、shell模块
- shell模块与command模块类似,可以在远程主机上执行命令。但与command模块不同的是,shell模块在远程主机中执行命令时,会经过远程主机上的 /bin/sh程序处理。
- 常用参数:
- chdir:执行命令前,切换到此目录。(type: path,[Default: (null)])
- creates:当文件名或(从2.0开始)glob模式存在时,不执行该命令(type: path,[Default: (null)])
- removes:当文件名或(从2.0开始)glob模式不存在时,不执行该命令(type: path,[Default: (null)])
- warn:启用或禁用任务警告。如果设定了false,不会告警。(type: bool,[Default: True])
- free_from:需要执行的脚本,一般使用Ansible的-a参数代替。( [Default: (null)],type: str)
- executable:切换其他shell来执行命令,需要使用命令的绝对路径,例如/bin/bash
示例:
ansible all -m shell -a "ls chdir=/"
//如果a.txt文件存在,该命令就不执行
ansible all -m shell -a "ls chdir=/ creates=a.txt"
//如果a.txt文件不存在,该命令就不执行
ansible all -m shell -a "ls chdir=/ removes=a.txt"
//禁止告警
ansible all -m shell -a "mkdir /test/aaa warn=false"
//shell命令可以使用“|”符号
ansible all -m shell -a "echo hengha | passwd --stdin testuser"
//shell命令可以使用其他shell
ansible all -m shell -a "echo hengha | passwd --stdin testuser excutable=/bin/bash"
2.5、copy模块
- copy模块将文件从本地或远程计算机复制到远程计算机上的某个位置。
- copy模块可以复制单个文件或少量文件。
- synchronize模块可以复制大量的文件,嵌套几层的目录。
- unarchive模块可以复制一个归档,然后展开它。
- 常用参数
- dest=:目标路径(文件或目录)。源是目录,目标也必须是目录。(type: path)
- src:源路径(文件或目录)。(type: path,[Default: (null)])
- 将本地的path复制到远程计算机上
- 源路径是目录时,默认做递归复制。若以“/”结尾,则只复制目录下的内容,不复制目录本身。若不以“/”结尾,则递归复制目录。
- content:源内容。(type: str,[Default: (null)])
- 当不使用src指定拷贝的文件时,可以使用content直接指定文件内容。但仅当dest为文件时才有效,如果文件不存在,会创建该文件。
- src与content两个参数必有其一,否则会报错。
- backup:是否备份文件(带有时间戳)。(type: bool,[Default: False])
- 当为true时,会先备份远程主机的文件,然后再将ansible主机中的文件拷贝到远程主机。
- force:是否替换远程文件。(type: bool,[Default: True])
- 如果'yes',当内容与源文件不同时,远程文件将被替换。
- 如果'no',则只有在目标文件不存在时,才会传输该文件。
- remote_src:是否使用远程计算机上的src(type: bool,[Default: False])
- 如果为“yes”,将文件从远程计算机复制到远程计算机上的某个位置
- 如果为“no”,将文件从本地复制到远程计算机上的某个位置
- mode:指定文件或目录复制到远程计算机后的权限。
- 如果想将权限设置为“rw-r--r--”,则可以使用mode=0644。如果想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
- owner:指定文件或目录复制到远程计算机后的属主。
- 远程主机上必须有对应的用户,否则会报错。
- group:指定文件或目录复制到远程计算机后的属组。
- 远程主机上必须有对应的组,否则会报错。
示例:
//将文件从本地复制到远程计算机
ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible"
//将文件从远程计算机复制到远程计算机
ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.ansible remote_src=yes"
//将修改到远程计算机的文件
ansible all -m copy -a "content='hi there\n' dest=/tmp/fstab.ansible backup=true"
2.6、fetch模块
- fetch模块与copy模块类似,但作用与copy模块相反。
- fetch模块将文件从远程计算机复制到本地。远程主机不能指定多个。
- 常用参数
- src=:源路径。远程计算机上的一个文件,不能是目录。
- dest=:目标路径。保存文件的本地目录。
- 例如,如果“dest”目录是“/backup”,那么主机“host.example.com”上名为“/etc/profile”的“src”文件将被保存到“/backup/host.example.com/etc/profile”中。
- flat:覆盖将文件保存到hostname/path/to/file目录的默认行为,而是直接将文件保存到本地目录中。
- 如果多个主机具有相同的文件名,则每个主机的文件将被覆盖,最后只会存在一个文件。
示例1:
//将文件复制到本地目录
]# ansible all -m fetch -a "src=/etc/fstab dest=/backup/"
//查看目录结构
]# tree /backup/
/backup/
├── 10.1.1.12
│ └── etc
│ └── fstab
└── 10.1.1.13
└── etc
└── fstab
示例2:
//将文件复制到本地目录
]# ansible all -m fetch -a "src=/etc/fstab dest=/backup/ flat=yes"
//查看目录结构
]# tree /backup/
/backup/
└── fstab
2.7、file模块
- file模块设置文件、符号链接或目录的属性。比如创建文件或目录、删除文件或目录、修改文件权限等。
- 常用参数
- path=:指定要操作的远程计算机上的文件或目录(Aliases: dest, name)。(type: path)
- state:此参数非常灵活,其对应的值需要根据情况设定。(Choices: absent、directory、file、hard、link、touch。[Default: file])
- 如果state=directory,可以创建或修改目录(递归创建)。
- 如果state=touch,可以创建或修改文件时。
- 如果'path'不存在,将创建一个空文件。
- 如果state=link,可以创建或修改软链接文件时。
- 如果state=hard,可以创建或修改硬链接文件时。
- 如果state=file
- 如果没有任何其他选项,它主要作为'stat'工作,并将返回'path'的当前状态。
- 如果有其他选项(例如' mode'),文件也会被修改,但如果它不存在就不会被创建
- 如果state=absent
- 如果'path'不存在,不会导致失败,因为状态没有改变。
- 如果'path'存在,将删除目录(递归)、文件、符号链接。
- 在目录的情况下,如果声明了'diff',您将看到删除的文件和文件夹列在'path_contents'下。
- recurse:是否递归操作目录。(type: bool,[Default: False])
- 只适用于'state=directory'。
- 如果recurse为yes,递归修改目录中文件的属性。
- src:指明软链或硬链链接哪个文件。(type: path,[Default: (null)])
- 只适用于'state=link'和'state=hard'。
- force:强制创建符号链接。(type: bool,[Default: False])
- 在两种情况下强制创建符号链接:源文件不存在(但稍后会出现),目标已经存在,并且是一个文件(因此,需要解除“path”文件的链接,并创建指向“src”文件的符号链接来代替它)。
- mode:指定文件或目录复制到远程计算机后的权限。
- 如果想将权限设置为“rw-r--r--”,则可以使用mode=0644。如果想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
- owner:指定文件或目录复制到远程计算机后的属主。
- 远程主机上必须有对应的用户,否则会报错。
- group:指定文件或目录复制到远程计算机后的属组。
- 远程主机上必须有对应的组,否则会报错。
示例:
//创建目录
ansible all -m file -a "path=/test/dir state=directory" -b
//创建文件
ansible all -m file -a "path=/test/hi.txt state=touch" -b
//递归删除目录
ansible all -m file -a "path=/test/ state=absent" -b
//修改文件属性
ansible all -m file -a "path=/test/hi.txt owner=centoshh group=centoshh mode=666"
//修改目录属性
ansible all -m file -a "path=/test state=directory recurse=yes owner=centoshh group=centoshh mode=666"
2.8、blockinfile模块
- blockinfile模块可以在指定的文件中插入“一段文本”,并且这段文本会被标记(被标记的“一段文本”,以后称为“文本块”)。也就是,在这段文本上做了记号,以便以后可以通过“标记”找到这段文本,然后修改或者删除它。
- 常用参数
- path=:指定要操作的文件(Aliases: dest, destfile, name)。(type: path)
- state:更新或删除的“文本块”。(type: str,[Default: present])
- 默认情况下(state=present),更新“文本块”。
- 如果state=absent,从文件中删除文本块。
- block:指定要插入的“文本块”(Aliases: content)。(type: str,[Default: ])
- 如果它缺失或为空字符串,该文本块将被删除。
- insertafter:将“文本块”插入到文件的指定位置。(type: str,[Default: EOF],(Choices: EOF, *regex*))
- 如果insertafter=EOF(默认),会将文本块插入到文件的末尾。
- 如果insertafter=*regex*,会将文本块插入到正则表达式(python正则)最后一次匹配的行之后。如果没有配到行,会将文本块插入到文件的末尾。
- insertbefore:将“文本块”插入到文件的指定位置。(type: str,[Default: (null)],(Choices: BOF, *regex*))
- 如果insertbefore=BOF,会将文本块插入到文件的开头。
- 如果insertbefore=*regex*,会将文本块插入到正则表达式(python正则)最后一次匹配的行之前。如果没有配到行,会将文本块插入到文件的末尾。
- marker:自定义文本块的标记。
- 在文件中插入文本块时,ansible会自动为文本块添加两个标记。一个开始标记,一个结束标记。
- 默认情况下,开始标记是“# BEGIN ANSIBLE MANAGED BLOCK”,结束标记是“# END ANSIBLE MANAGED BLOCK”。
- 自定义文本块的标记:marker=#{mark} test。开始标记变成了“# BEGIN test”,结束标记变成了“# END test”。
- {mark}会自动被替换成开始标记和结束标记中的BEGIN和END,这样就可以插入很多文本块了,并为不同的文本块添加不同的标记,下次通过标记就可以找到对应的文本块了。
- '{mark}'将被替换为'marker_begin'(default="BEGIN")和'marker_end'(default="END")。
- marker_begin:自定义文本块的开始标记。(type: str,[Default: BEGIN])
- marker_end:自定义文本块的结束标记。(type: str,[Default: END])
- backup:是否备份文件(带有时间戳)。(type: bool,[Default: False])
- 当为true时,会先备份远程主机的文件,然后再将ansible主机中的文件拷贝到远程主机。
- creates:如果文件不存在,则创建一个新文件。(type: bool,[Default: (null)])
- mode:指定文件或目录复制到远程计算机后的权限。
- 如果想将权限设置为“rw-r--r--”,则可以使用mode=0644。如果想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
- owner:指定文件或目录复制到远程计算机后的属主。
- 远程主机上必须有对应的用户,否则会报错。
- group:指定文件或目录复制到远程计算机后的属组。
- 远程主机上必须有对应的组,否则会报错。
示例:
//##将文件从远程计算机复制到远程计算机
ansible all -m copy -a "src=/etc/fstab dest=/tmp/fstab.bak remote_src=yes"
//将文本块插入到文件末尾
ansible all -m blockinfile -a "path=/tmp/fstab.bak block='hengha line1\nhengha line2'"
//将文本块插入到文件开头
ansible all -m blockinfile -a "path=/tmp/fstab.bak block='hengha line1\nhengha line2' insertafter=BOF"
//将文本块插入到文件指定的行之后(python正则)
ansible all -m blockinfile -a "path=/tmp/fstab.bak block='hengha line1\nhengha line2' insertafter='^/dev'"
//将文本块插入到文件指定的行之前(python正则)
ansible all -m blockinfile -a "path=/tmp/fstab.bak block='hengha line1\nhengha line2' insertbefore='^/dev'"
//将文本块插入到文件末尾,并使用自定义标记
ansible all -m blockinfile -a "path=/tmp/fstab.bak block='hengha line1\nhengha line2' marker='#{mark} mark1'"
//删除指定的文本块(删除默认标记的文本块)
ansible all -m blockinfile -a "path=/tmp/fstab.bak state=present"
ansible all -m blockinfile -a "path=/tmp/fstab.bak block=''"
//删除指定的文本块(删除标记是'#{mark} mark1'的文本块)
ansible all -m blockinfile -a "path=/tmp/fstab.bak state=absent marker='#{mark} mark1'"
2.9、lineinfile模块
- lineinfile模块可以确保“某一行文本”存在于指定的文件中,或者确保从文件中删除指定的“某一行文本”(即确保指定的文本不存在于文件中),还可以根据正则表达式,替换“某一行文本”。
- 常用参数
- path=:指定要操作的文件(Aliases: dest, destfile, name)。(type: path)
- state:替换还是删除匹配到的行(Choices: absent, present)。(type: str,[Default: present])
- 替换模式state=present
- 删除模式state=absent
- 当想要删除对应的文本时,需要将state参数的值设置为absent
- line:指定要插入/替换到文件中的行(Aliases: value)。(type: str,[Default: (null)])
- 只适用于'state=present'。
- 如果设置了backrefs,则可能包含反向引用,如果regexp匹配,则这些反向引用将与regexp捕获组一起展开。
- regexp:使用正则表达式匹配对应的行(Aliases: regex)。
- 替换模式state=present,如果可以匹配到多行,则只替换最后一行。如果没有匹配到任何行,该行将按照insertbefore或insertafter设置添加到文件中。
- 删除模式state=absent,如果可以匹配到多行,这些行都会被删除。
- insertafter:将“行”插入到文件的指定位置(type: str,(Choices: EOF, *regex*)[Default: EOF])
- 如果regexp和insertafter同时存在,则只有regexp没有匹配到行时,insertafter才会有效。
- 不能与backrefs或insertbefore一起使用。
- 只适用于'state=present'。
- insertafter=*regex*,会将该行插入到正则表达式的最后一个匹配项之后。如果没有匹配到行,该行会被插入到文件的末尾。
- 如果要插入到第一个匹配之后,可以使用firstmatch=yes。
- insertbefore:将“行”插入到文件的指定位置(type: str,(Choices: BOF, *regex*)[Default: (null)])
- 如果regexp和insertbefore同时存在,则只有regexp没有匹配到行时,insertbefore才会有效。
- 不能与backrefs或insertafter一起使用。
- 只适用于'state=present'。
- insertafter=*regex*,会将该行插入到正则表达式的最后一个匹配项之前。如果没有匹配到行,该行会被插入到文件的末尾。
- 如果要插入到第一个匹配之前,可以使用firstmatch=yes。
- backrefs:是否启用正则表达式的捕获组
- 只适用于'state=present'。
- 如果backrefs=True,insertbefore和insertafter会被忽略。
- 如果regexp在文件中匹配不到行,文件将保持不变。
- 如果regexp可以在文件中匹配到行,line就能对regexp中的分组进行后向引用。
- backup:是否备份文件(带有时间戳)。(type: bool,[Default: False])
- 当为true时,会先备份远程主机的文件,然后再将ansible主机中的文件拷贝到远程主机。
- creates:如果文件不存在,则创建一个新文件。(type: bool,[Default: False])
- mode:指定文件或目录复制到远程计算机后的权限。
- 如果想将权限设置为“rw-r--r--”,则可以使用mode=0644。如果想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
- owner:指定文件或目录复制到远程计算机后的属主。
- 远程主机上必须有对应的用户,否则会报错。
- group:指定文件或目录复制到远程计算机后的属组。
- 远程主机上必须有对应的组,否则会报错。
示例:
//替换匹配到的行
ansible all -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=disabled'"
//删除匹配到的行
ansible all -m lineinfile -a "path=/etc/sudoers state=absent regexp='^%wheel'"
//如果regexp不能匹配到,就使用insertafter,
ansible all -m lineinfile -a "path=/etc/httpd/conf/httpd.conf regexp='^Listen' insertafter='^#Listen' line='Listen 8080'"
//使用正则表达式捕获组
ansible all -m lineinfile -a "path=/etc/sudoers regexp='^(# %wheel)(.*)' backrefs=yes line='centoshh1 \2'" -b
2.10、replace模块
- replace模块根据正则表达式替换文件中的字符串,文件中所有被匹配到的字符串都会被替换。
- 常用参数
- path=:指定要操作的文件(Aliases: dest, destfile, name)。(type: path)
- regexp=:指定一个正则表达式(python正则),文件中与正则匹配的字符串将会被替换。
- replace:指定要替换成的字符串(可以引用捕获组)。如果没有设置,则删除匹配项。
- after:只替换/删除该字符串之后的被匹配的字符串。可以和before连用。
- before:只替换/删除该字符串之前的被匹配的字符串。可以和after连用。
- encoding:用于读写文件的字符编码。[Default: utf-8]
- backup:是否备份文件(带有时间戳)。(type: bool,[Default: False])
- 当为true时,会先备份远程主机的文件,然后再将ansible主机中的文件拷贝到远程主机。
- mode:指定文件或目录复制到远程计算机后的权限。
- 如果想将权限设置为“rw-r--r--”,则可以使用mode=0644。如果想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
- owner:指定文件或目录复制到远程计算机后的属主。
- 远程主机上必须有对应的用户,否则会报错。
- group:指定文件或目录复制到远程计算机后的属组。
- 远程主机上必须有对应的组,否则会报错。
示例:
//替换SELinux,但行开头不是SELinux
ansible all -m replace -a "path=/etc/selinux/config regexp='(.{1,})(SELinux)' replace='\1hengha'"
//替换SELinux,但行开头不是SELinux,并且要在'permissive -'和'of enforcing'之间的被匹配到的字符串
ansible all -m replace -a "path=/etc/selinux/config regexp='(.{1,})(SELinux)' replace='\1hengha' after='permissive -' before='of enforcing'"
2.11、template模块
- template模块可以基于模板在远程计算机上生成一个文件。
- 模板说明文档:http://jinja.pocoo.org/docs/
- 模板格式说明:http://jinja.pocoo.org/docs/templates/
- 在模板中可以使用的其他变量。
- ansible_managed:(可通过ansible.cfg中的defaults配置)包含一个字符串,可以用来描述模板名称、主机、模板文件的修改时间和所有者uid。
- template_host:模板所在机器的节点名称。
- template_uid:所有者的用户id。
- template_path:模板的路径。
- template_fullpath:模板的绝对路径。
- template_destpath:模板在远程系统上的路径(在2.8中添加)。
- template_run_date:模板被渲染的日期。
- 常用参数
- src=:模板的路径
- dest=:基于模板生成的文件,保存在远程计算机上的位置
- force:是否替换远程文件。(type: bool,[Default: True])
- 如果'yes',当内容与源文件不同时,远程文件将被替换。
- 如果'no',则只有在目标文件不存在时,才会传输该文件。
- mode:指定文件或目录复制到远程计算机后的权限。
- 如果想将权限设置为“rw-r--r--”,则可以使用mode=0644。如果想要在user对应的权限位上添加执行权限,则可以使用mode=u+x表示。
- owner:指定文件或目录复制到远程计算机后的属主。
- 远程主机上必须有对应的用户,否则会报错。
- group:指定文件或目录复制到远程计算机后的属组。
- 远程主机上必须有对应的组,否则会报错。
2.12、cron模块
- cron模块可以管理远程主机中的计划任务和anacrontab的环境变量(不是系统环境变量)。
- 常用参数:
- state:修改/删除计划任务或环境变量。(Choices: absent, present)[Default: present]
- 如果state=present,修改计划任务或环境变量。
- 如果state=absent,删除计划任务或环境变量。
- env:设置环境变量。(type: bool,[Default: False])
- name:设置计划任务或环境变量的名称。
- 计划任务的名称会在注释中显示,当不指定计划任务的名称时,ansible会默认为计划任务添加一个名称:“#Ansible: None”。例如如果指定计划任务的名称为test,那么注释的内容为#Ansible: test。
- 计划任务的名称应该是唯一的,方便以后根据名称修改或删除计划任务。
- 如果设置了env,则是环境变量的名称。
- job:指定计划的任务中需要实际执行的命令或者脚本
- 如果设置了env,则是环境变量的值。
- cron_file:使用指定的文件,而不是单个用户的crontab。
- 如果是相对路径,会在/etc/cron.d中。
- 如果是绝对路径,通常是/etc/crontab。
- 要使用cron_file参数,还必须指定user。
- user:用于设置当前计划任务属于哪个用户,当不使用此参数时,默认为管理员用户。
- disabled:是否禁用计划任务(根据计划任务的名称)
- 只适用于'state=present'。
- backup:修改crontab之前是否创建备份。(type: bool,[Default: False])
- 备份的位置在‘backup_file’变量中返回。
- minute:设置计划任务中的分钟( 例如0-59、*、*/2)。[Default: *]
- hour:设置计划任务中的小时(例如0-23、*、*/2)。[Default: *]
- day:设置计划任务中的月份的几号(例如1-31、*、*/2)。[Default: *]
- month:设置计划任务中的月份(例如1-12、*、*/2)。[Default: *]
- weekday:设置计划任务中的周几(例如0-6表示星期日—星期六、*)。[Default: *]
- special_time:计划任务的时间设定格式为@reboot或者@hourly。
- @reboot表示重启时执行
- @hourly表示每小时执行一次,相当于设置成”0 0 * * *”
- special_time可用值有:hourly(每时)、daily(每天)、monthly(每月)、yearly(每年)、annually(每年,与yearly相同)、weekly(每周)、reboot(重启后)。[Default: (null)]
示例:
//在用户的crontab中的顶部添加一个环境变量
ansible all -m cron -a "state=present env=yes name=PATH job=/opt/bin"
//在用户的crontab中的变量PATH之后添加一个环境变量
ansible all -m cron -a "state=present env=yes name=APP_HOME job=/srv/app insertafter=PATH"
//删除crontab中的环境变量
ansible all -m cron -a "state=absent env=yes name=PATH"
//在用户的crontab中添加一个计划任务
ansible all -m cron -a "name='ansible hh1' minute=1 job='echo hengha2'"
ansible all -m cron -a "name='压缩日志' minute=5 hour=3 job='sudo sh /opt/sh/log.sh gzip_log'"
//删除计划任务
ansible all -m cron -a "state=absent name='ansible hh1'"
2.13、yum_repository模块
- yum_repository模块可以管理(添加或删除)远程主机上的yum仓库。如果要更新现有的存储库定义,可以使用ini_file模块。
- 常用参数
- state:添加或删除yum仓库。(Choices: absent, present)[Default: present]
- 如果state=present,添加yum仓库。
- 如果state=absent,删除yum仓库。
- name=:指定要操作的仓库ID(唯一)。“.repo”配置文件中的仓库ID,也就是“中括号”内的。
- description:设置仓库的注释信息。“.repo”配置文件中的“name字段”。
- baseurl:设置yum仓库的baseurl。
- file:设置yum配置文件的名称。即“.repo”配置文件名的前缀,默认以name参数作为“.repo”配置文件名的前缀。
- 但一个“.repo”配置文件中可以存在多个yum源。
- enabled:是否启用对应的yum源。(type: bool,[Default: yes])
- 如果enabled=yes,则启用对应的yum源。
- 如果enabled=no,则不启用对应的yum源。
- gpgcheck:设置是否开启GPG签名验证功能。(type: bool,[Default: (null)])
- 如果gpgcheck=no,则不启用GPG签名验证。
- 没有默认设置。如果未设置该值,将使用/etc/yum.conf中的系统设置或no的系统默认值。
- gpgcakey:当gpgcheck=yes时,需要使用此参数指定验证包所需的公钥。
示例:
//创建一个repo文件,文件名默认是“name=test-epel”
ansible all -m yum_repository -a 'name=test-epel description="my EPEL YUM repo" baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ enabled=yes gpgcheck=no'
//向test-epel.repo(“file=test-epel”)中的文件添加一个yum源test-epel
ansible all -m yum_repository -a 'name=test-epel2 description="my EPEL YUM repo" baseurl=https://download.fedoraproject.org/pub/epel/$releasever/$basearch/ enabled=yes gpgcheck=no file=test-epel'
//查看repo文件
]# cat /etc/yum.repos.d/test-epel.repo
[test-epel]
baseurl = https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
enabled = 1
gpgcheck = 0
name = my EPEL YUM repo
[test-epel2]
baseurl = https://download.fedoraproject.org/pub/epel/$releasever/$basearch/
enabled = 1
gpgcheck = 0
name = my EPEL YUM repo
//删除test-epel.repo文件中的一个yum源test-epel2
ansible all -m yum_repository -a 'state=absent name=test-epel2 file=test-epel'
2.14、yum模块
- yum模块可以在远程主机上通过yum管理(安装、升级、降级、删除、列出)软件包。
- 这个模块只适用于Python 2。如果需要支持Python 3,可以使用dnf模块。
- 常用参数
- state:安装或卸载(Choices: absent, installed, latest, present, removed)[Default: (null)]
- present和installed将安装指定的包。
- latest将安装最新的指定的包
- absent和removed将删除指定的包。
- Default是None,但是实际上默认操作是present,除非此模块启用了autoremove选项,否则会推断为absent。
- name:程序包名称,可以带版本号,比如nginx-1.0。(Aliases: pkg),type: list。
- 当使用state=latest时,它可以是“*”,这意味着运行yum -y update。
- disable_gpg_check:是否禁用对rpm包的公钥gpg验证。(type: bool,[Default: no])
- 如果disable_gpg_check=yes表示禁用验证,直接安装。
- 仅当state为present或latest时才生效。
- enablerepo:临时启用的一个或多个repository(yum源)。
- disablerepo:临时禁用的一个或多个repository(yum源)。
示例:
//安装nginx
ansible all -m yum -a "name=nginx"
//安装nginx
ansible all -m yum -a "state=absent name=nginx"
//启用/禁止repository
ansible all -m yum -a "name=telnet disable_gpg_check=yes enablerepo=local"
ansible all -m yum -a "name=telnet disable_gpg_check=yes disablerepo=local"
3.15、service模块
- service模块可以管理远程主机上的服务。例如,启动或停止nginx服务。
- 常用参数
- name=:服务名。centos6是脚本的名称,centos7是unite file名称。
- state:用于指定服务的状态。(Choices: reloaded, restarted, started, stopped)[Default: (null)]
- started启动服务,是幂等的,除非必要,否则不会执行。
- stopped停止服务,是幂等的,除非必要,否则不会执行。
- restart总会重启服务。
- reloaded总会重新加载配置。
- 至少指定state和enabled中的一个
- enabled:是否将服务设置为开机自动启动。(type: bool,[Default: (null)])
- 如果enabled=yes,表示将对应服务设置为启用开机自动启动。
- 如果enabled=no,表示将对应服务设置为禁止开机自动启动。
- runlevel:在那些级别下启用/禁止开机自动启动。
示例:
//将nginx设置为开机自启
ansible all -m service -a "enabled=yes name=nginx"
//启动nginx服务
ansible all -m service -a "state=started name=nginx"
//停止nginx服务
ansible all -m service -a "state=stopped name=nginx"
3.16、group模块
- group模块可以管理远程主机上的用户组。
- 常用参数
- state:创建或删除组。(type: str,(Choices: absent, present)[Default: present])
- 如果state=present,创建组
- 如果state=absent,删除组
- name=:指定要操作的组名称。
- gid:指定用户组的gid。
- system:是否创建为系统组。(type: bool,[Default: False])
- 如果system=yes,创建为系统组。
示例:
//创建组
ansible all -m group -a "state=present name=somegroup" -b
//删除组
ansible all -m group -a "state=absent name=somegroup" -b
3.17、user模块
- user模块可以管理远程主机上的用户,比如创建用户、修改用户、删除用户、为用户创建密钥对等操作。
- 常用参数
- state:创建或删除用户。(type: str,(Choices: absent, present)[Default: present])
- 如果state=present,创建用户
- 如果state=absent,删除用户
- name=:指定要操作的用户名称(Aliases: user)。
- system:是否创建为系统用户。(type: bool,[Default: False])
- 如果system=yes,创建为系统用户。
- 不能对现有用户进行设置。
- uid:指定用户的uid。
- group:指定用户的基本组。(type: str)
- groups:指定用户的附加组。(type: list)
- 注意,如果说用户已经存在并且已经拥有多个附加组,那么如果想要继续添加新的附加组,需要结合append参数使用,否则在默认情况下,当再次使用groups参数设置附加组时,用户原来的附加组会被覆盖。
- append:新增或更新附加组。(type: bool,[Default: False])
- 如果append=no,将会更新附加组,即将用户只添加到groups指定的组中,并从所有其他组中删除。
- 如果append=yes,将会新增附加组,即将用户也添加到groups指定的组中。
- shell:指定用户的默认shell
- comment:用户注释信息
- expires:指定用户的过期时间,相当于设置/etc/shadow文件中的的第8列。
- 如果要设置用户的过期日期为2018年12月31日,那么首先要获取到2018年12月31日的unix时间戳(“date -d 2018-12-31 +%s”),获取到的时间戳为1546185600,即将expires=1546185600,表示用户的过期时间为2018年12月31日0点0分,设置成功后,查看远程主机的/etc/shadow文件,对应用户的第8列的值将变成17895(表示1970年1月1日到2018年12月31日的天数,unix 时间戳的值会自动转换为天数),目前此参数只支持在Linux和 FreeBSD系统中使用。
- home:指定用户家目录
- move_home:是否将原来的家目录中的文件移动到新的目录下。(type: bool,[Default: False])
- 如果move_home=yes,将原来的家目录中的文件移动到新的目录下。
- remove:删除用户时,是否同时删除其家目录。。
- 只适用于'state=absent'。
- 如果remove=yes,在删除用户的同时,会删除用户的家目录。
- password:指定用户的密码
- 要在Linux系统上创建一个禁用的帐户,可以将其设置为“!”或“*”。
- 这个密码不能是明文的密码,而是一个对明文密码”加密后”的字符串,相当于/etc/shadow文件中的密码字段,是一个对明文密码进行哈希后的字符串。
- update_password:当新设置的密码与旧密码不同时,是否更新密码(type: str,(Choices: always, on_create)[Default: always])
- 如果update_password=always,如果password设置的值与用户当前的加密过的密码字符串不一致,则直接更新用户的密码。
- 如果update_password=on_create,如果password设置的值与用户当前的加密过的密码字符串不一致,则不会更新用户的密码字符串,保持之前的密码设定。
- 如果是新创建的用户,即使此参数设置为on_create,也会将用户的密码设置为password参数对应的值。
- generate_ssh_key:是否为该用户生成SSH密钥。(type: bool,[Default: False])
- 如果generate_ssh_key=yes,表示为用户生成ssh密钥对,默认存放在用户家目录的./ssh目录中。不会覆盖现有的SSH密钥,除非与' force=yes'一起使用。
- ssh_key_file:当generate_ssh_key=yes时,使用此参数自定义生成ssh私钥的路径和名称。
示例:
//创建用户
ansible all -m user -a "state=present name=testuse uid=1040 comment='John Doe' shell=/bin/sh"
//删除用户
ansible all -m user -a "state=absent name=testuse remove=yes"
3.18、script模块
- script模块可以在远程主机上执行ansible管理主机上的脚本。也就是说,脚本一直在ansible管理主机本地,不需要手动拷贝到远程主机后再执行。
- 常用参数
- free_form:指定要执行的脚本,脚本位于ansible管理主机本地。
- 注意,并没有一个参数名叫free_form,一般使用Ansible的-a参数代替。
- chdir:执行命令前,切换到此目录。
- creates:当文件名存在时,不执行该命令
- removes:当文件名不存在时,不执行该命令
- executable:切换其他shell来执行命令,需要使用命令的绝对路径,例如/bin/bash
示例:
ansible all -m script -a "/root/test.sh"
ansible all -m script -a "/root/test.sh chdir=/tmp creates=t.txt"
ansible all -m script -a "/root/test.sh chdir=/tmp removes=t.txt"
3.19、setup模块
- setup模块由剧本自动调用,以收集关于远程主机的有用变量,这些变量可以在剧本中使用。也可以通过/usr/bin/ansible'直接执行,以检查主机有哪些变量可用。
- 常用参数
- filter:用于进行条件过滤。如果设置,仅返回匹配过滤条件的信息(shell样式是通配符)。
- gather_subset:如果提供,则将收集到的附加事实限制到给定的子集。
- 取值为:all、min、hardware、network、virtual、ohai、facter。[Default: all]
- 可以指定一个值列表,也可以用‘!’来指定不应该收集特定的子集,例如`!hardware,!network,!virtual,!ohai,!facter’。
- 其他常用信息列出如下:
- 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个数(只显示总的个数)。
示例:
//查看所有的信息
ansible 10.1.1.12 -m setup
//仅查看ansible_all_ipv4_addresses的信息
ansible 10.1.1.12 -m setup -a "filter=ansible_all_ipv4_addresses"
//仅查看被*mb匹配的信息
ansible 10.1.1.12 -m setup -a "filter=*mb"
3.20、archive和unarchive模块
//压缩远程主机上的yum.repos.d目录,压缩包的起始目录是yum.repos.d/
ansible all -m archive -a "path=/etc/yum.repos.d dest=/root/yum.tar.gz format=gz" -b
//压缩远程主机上的yum.repos.d目录,压缩包不包含yum.repos.d目录
ansible all -m archive -a "path=/etc/yum.repos.d/ dest=/root/yum.tar.gz format=gz" -b
//将远程主机上的压缩包解压到远程主机上
ansible all -m unarchive -a "src=/root/yum.tar.gz dest=/root/test/ remote_src=yes"
//将ansible主机上的压缩包解压到远程主机上
ansible all -m unarchive -a "src=/root/yum.tar.gz dest=/root/test/"
1
# #