当前位置: 首页 > news >正文

Shell编程中的Ansible常用模块

一:Ansible常用模块

2015年底270多个模块,2016年达到540个,2018年01月12日有1378个模块,2018年07月15日1852个模块,2019年05月25日(ansible 2.7.10)时2080个模块,2020年03月02日有3387个模块。

虽然模块众多,但最常用的模块也就2,30个而已,针对特定业务只用10几个模块

常用模块帮助文档参考:

https://docs.ansible.com/ansible/latest/modules/modules_by_category.html

1、Command 模块

功能:在远程主机执行shell命令,此为默认模块,可忽略-m选项

注意:此命令不支持 $VARNAME < > | ; & 等,用shell模块实现

参数描述
argv作为列表传递命令以避免值被错误解释(如包含空格的名字),只能使用 argvcmd 其中之一。
chdir执行命令前先切换到指定目录。
cmd要执行的命令字符串,与 argv 只能选择其一使用。
creates若文件已存在则跳过此步骤,防止重复执行。
removes若文件不存在则执行此步骤,通常用于清理操作。
stdin直接设置命令的标准输入内容。
stdin_add_newline设置是否在标准输入后添加换行符,默认为 yes
strip_empty_ends去除输出结果中 stdout/stderr 末尾的空行,默认为 yes

范例:

[root@ansible ~]#ansible web -m command -a 'chdir=/etc cat centos-release'
10.0.0.7 | CHANGED | rc=0 >>
CentOS Linux release 7.7.1908 (Core)
10.0.0.8 | CHANGED | rc=0 >>
CentOS Linux release 8.1.1911 (Core)
[root@ansible ~]#ansible web -m command -a 'chdir=/etc creates=/data/f1.txt cat centos-release'
10.0.0.7 | CHANGED | rc=0 >>
CentOS Linux release 7.7.1908 (Core)
10.0.0.8 | SUCCESS | rc=0 >>
skipped, since /data/f1.txt exists
[root@ansible ~]#ansible web -m command -a 'chdir=/etc removes=/data/f1.txt cat centos-release'
10.0.0.7 | SUCCESS | rc=0 >>
skipped, since /data/f1.txt does not exist
10.0.0.8 | CHANGED | rc=0 >>
CentOS Linux release 8.1.1911 (Core)ansible web -m command -a 'service vsftpd start' 
ansible web -m command -a 'echo magedu | passwd --stdin wang'   
ansible web -m command -a 'rm -rf /data/'
ansible web -m command -a 'echo hello > /data/hello.log'
ansible web -m command -a "echo $HOSTNAME"
2、Shell模块

功能:和command相似,用shell执行命令

参数描述
chdir执行命令前切换到指定目录。
cmd要执行的命令及其可选参数。
creates若文件已存在,则跳过此步骤。
executable指定用于执行命令的shell解释器的绝对路径(如 /bin/bash)。
free_form直接传递要执行的命令字符串,没有实际名为 'free form' 的参数。
removes若文件不存在,则跳过此步骤。
stdin设置命令的标准输入值。
stdin_add_newline是否在标准输入数据后添加换行符,默认为 yes

范例:

 

[root@ansible ~]#ansible web -m shell -a "echo $HOSTNAME"
10.0.0.7 | CHANGED | rc=0 >>
ansible
10.0.0.8 | CHANGED | rc=0 >>
ansible
[root@ansible ~]#ansible web -m shell -a 'echo $HOSTNAME'
10.0.0.7 | CHANGED | rc=0 >>
centos7.wangxiaochun.com
10.0.0.8 | CHANGED | rc=0 >>
centos8.localdomain[root@ansible ~]#ansible web -m shell -a 'echo centos | passwd --stdin wang'
10.0.0.7 | CHANGED | rc=0 >>
Changing password for user wang.
passwd: all authentication tokens updated successfully.
10.0.0.8 | CHANGED | rc=0 >>
Changing password for user wang.
passwd: all authentication tokens updated successfully.
[root@ansible ~]#ansible web -m shell -a 'ls -l /etc/shadow'
10.0.0.7 | CHANGED | rc=0 >>
---------- 1 root root 889 Mar  2 14:34 /etc/shadow
10.0.0.8 | CHANGED | rc=0 >>
---------- 1 root root 944 Mar  2 14:34 /etc/shadow
[root@ansible ~]#ansible web -m shell -a 'echo hello > /data/hello.log'
10.0.0.7 | CHANGED | rc=0 >>10.0.0.8 | CHANGED | rc=0 >>[root@ansible ~]#ansible web -m shell -a 'cat  /data/hello.log'
10.0.0.7 | CHANGED | rc=0 >>
hello
10.0.0.8 | CHANGED | rc=0 >>
hello

注意:调用bash执行命令 类似

cat /tmp/test.md | awk -F'|' '{print $1,$2}' &> /tmp/example.txt

这些复杂命令,即使使用shell也可能会失败

解决办法:写到脚本时,copy到远程,执行,再把需要的结果拉回执行命令的机器

范例:将shell模块代替command,设为模块

[root@ansible ~]#vim /etc/ansible/ansible.cfg
#修改下面一行
module_name = shell
3、Script模块

功能:在远程主机上运行ansible服务器上的脚本

参数名说明
free_form脚本路径及可选参数(必填项),如 scripts/deploy.sh --option
chdir在执行脚本前切换到指定目录。
creates如果指定的文件存在,则不会运行脚本。
removes如果指定的文件不存在,则不会运行脚本。
executable指定执行脚本时使用的解释器(如 /bin/bash)。
decrypt是否解密使用 Ansible Vault 加密的源文件(默认为 no)。

范例:

ansible web  -m script -a /data/test.sh
4、Copy模块

功能:从ansible服务器主控端复制文件到远程主机

参数说明
src本地或远程计算机上的源文件路径。
dest必填项,远程主机上的目标绝对路径。
content直接设置文件内容,代替 src
backup如果目标文件存在且内容不同,创建带时间戳的备份。
force是否强制覆盖已存在的文件(yes/no)。
checksum使用 SHA1 校验确保传输成功。
mode设置文件权限模式(例如 0644)。
owner / group设置文件所属用户和组。
directory_mode递归复制时设置目录的权限模式。
follow是否跟随目标路径中的符号链接。
local_follow是否跟随源路径中的符号链接。
decrypt是否自动解密使用 Vault 加密的文件(默认 yes)。
attributes设置文件属性(如 ia 等,参考 chattr)。
#如目标存在,默认覆盖,此处指定先备份
ansible web -m copy -a "src=./a.sh dest=/tmp/test2.sh    owner=root  mode=600 backup=yes" 
#指定内容,直接生成目标文件    
ansible web -m copy -a "content='test line1\ntest line2' dest=/tmp/test.txt"
#复制/etc/下的文件,不包括/etc/目录自身
ansible web -m copy -a "src=/etc/ dest=/backup"
5、Fetch模块

功能:从远程主机提取文件至ansible的主控端,copy相反,目前不支持目录

参数说明
src必填,远程主机上的源文件路径(必须是文件,不能是目录)。
dest必填,本地保存文件的目标目录。子目录会基于主机名自动创建。
fail_on_missing如果远程文件不存在或无法读取,是否让任务失败(默认:yes)。
flat如果为 yes,则不创建主机子目录,直接将文件保存到 dest 目录中(适合唯一命名文件)。
validate_checksum是否在获取后验证本地和远程文件的校验和(默认:yes)。

范例:

ansible web -m fetch -a 'src=/tmp/test2.sh dest=/data/scripts' 

范例:

[root@ansible ~]#ansible   all -m  fetch -a 'src=/etc/redhat-release dest=/data/os'
[root@ansible ~]#tree /data/os/
/data/os/
├── 10.0.0.6
│   └── etc
│       └── redhat-release
├── 10.0.0.7
│   └── etc
│       └── redhat-release
└── 10.0.0.8└── etc└── redhat-release6 directories, 3 files
6、File模块

功能:设置文件属性

参数说明
path(或 name必填,要操作的文件或目录路径。
state文件状态: - file:确保是文件 - directory:确保是目录 - touch:创建空文件或更新时间戳 - absent:删除文件/目录 - link / hard:创建软链接/硬链接
mode设置权限模式(如 0644u+rwx)。
owner / group设置文件/目录的所有者和所属组。
recurse是否递归设置属性(仅当 state=directory 时有效)。
attributes设置文件属性(如 ia,参考 chattr)。
force强制创建符号链接(如目标已存在)。
follow如果为 yes,跟随符号链接进行操作。
src当创建软链接时,指定源文件路径。

 范例:

#创建空文件
ansible all -m  file  -a 'path=/data/test.txt state=touch'
ansible all -m  file  -a 'path=/data/test.txt state=absent'
ansible all -m file -a "path=/root/test.sh owner=wang mode=755"
#创建目录
ansible all -m file -a "path=/data/mysql state=directory owner=mysql group=mysql"
#创建软链接
ansible all -m file -a 'src=/data/testfile  dest=/data/testfile-link state=link'
7、unarchive模块

功能:解包解压缩

实现有两种用法:

1、将ansible主机上的压缩包传到远程主机后解压缩至特定目录,设置copy=yes

2、将远程主机上的某个压缩包解压缩到指定路径下,设置copy=no

常见参数:

  • copy:默认为yes,当copy=yes,拷贝的文件是从ansible主机复制到远程主机上,如果设置为copy=no,会在远程主机上寻找src源文件

  • remote_src:和copy功能一样且互斥,yes表示在远程主机,不在ansible主机,no表示文件在ansible主机上

  • src:源路径,可以是ansible主机上的路径,也可以是远程主机上的路径,如果是远程主机上的路径,则需要设置copy=no

  • dest:远程主机上的目标路径

  • mode:设置解压缩后的文件权限

 

参数说明
src必填,本地或远程归档文件路径,取决于 remote_src 设置。
dest必填,远程主机上解压归档的目标绝对路径。
remote_src若为 yes,表示归档文件已在远程主机上,默认为 no
copy已弃用,建议使用 remote_src。若为 yes,将本地文件复制到远程再解压。
creates如果指定路径已存在,则跳过此任务。
mode解压后文件/目录的权限模式(如 0644u+rwx)。
owner / group设置解压后文件/目录的所有者和所属组。
exclude指定要排除不解压的文件或目录名列表。
keep_newer不覆盖比归档中更新的现有文件。
list_files若为 yes,返回归档中包含的文件列表(不执行解压)。
attributes设置文件属性(如 i, a,参考 chattr)。
extra_opts传递额外的命令行选项(以数组形式提供)。
decrypt是否自动解密使用 Vault 加密的源文件(默认 yes)。

范例:

ansible all -m unarchive -a 'src=/data/foo.tgz dest=/var/lib/foo'
ansible all -m unarchive -a 'src=/tmp/foo.zip dest=/data copy=no mode=0777'
ansible all -m unarchive -a 'src=https://example.com/example.zip dest=/data copy=no'
8、Archive模块

功能:打包压缩

参数说明
path必填,要压缩的远程文件或目录路径(支持通配符或列表)。
dest压缩包保存路径(当 path 包含多个文件时为必填)。
format压缩格式:gzipbzip2xz(默认为 gzip)。
exclude_path排除的文件路径或通配符(可选)。
remove是否在压缩后删除原始文件/目录(yes/no)。
force_archive强制将单个文件也打包成归档(如 tar.gz 而不只是压缩)。
mode设置压缩包的权限模式(如 0644u+rwx)。
owner / group设置压缩包的所有者和所属组。
attributes设置压缩包的文件属性(如 i, a,参考 chattr)。

范例:

ansible web -m archive  -a 'path=/var/log/ dest=/data/log.tar.bz2 format=bz2  
owner=wang mode=0600'
9、Hostname模块

功能:管理主机名

参数必填说明
name✅ 是要设置的主机名(如 web01)。
use指定使用的策略来更新主机名(可选),默认自动检测。适用于某些容器环境或特殊系统,比如 sysctl, systemd, sunos, aix, openvms 等。

范例:

ansible node1 -m hostname -a "name=websrv" 
ansible 192.168.100.18 -m hostname -a 'name=node18.magedu.com'
10、Cron模块

功能:计划任务

支持时间:minute,hour,day,month,weekday

参数必填说明
name✅(state=present 时可选,未来版本将强制要求)定时任务的描述名称(唯一标识)。用于增删改查。
job✅(仅当 state=present 且非 env 时)要执行的命令(不能包含换行符)。
minute / hour / day / month / weekday定义执行时间的 cron 表达式字段(如 */51-5* 等)。
special_time使用别名设置时间,如 reboot, yearly, monthly, weekly, daily, hourly
disabled如果为 yes,则注释掉该任务(禁用),仅在 state=present 时有效。
state状态: - present:添加任务(默认) - absent:删除任务
user指定操作哪个用户的 crontab,默认是 root
env设置 crontab 中的环境变量(需配合 namevalue)。
cron_file若指定,则不使用用户 crontab,而是 /etc/cron.d/xxx/etc/crontab 文件。
backup是否在修改前备份当前 crontab(返回 backup_file 路径)。
insertbefore / insertafter插入环境变量的位置(与 env 配合使用)。

范例:

#备份数据库脚本
[root@centos8 ~]#cat mysql_backup.sh 
mysqldump -A -F --single-transaction --master-data=2 -q -uroot |gzip > /data/mysql_date +%F_%T.sql.gz
#创建任务
ansible 10.0.0.8 -m cron -a 'hour=2 minute=30 weekday=1-5 name="backup mysql" job=/root/mysql_backup.sh'
ansible web   -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime"
#禁用计划任务
ansible web   -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=yes"
#启用计划任务
ansible web   -m cron -a "minute=*/5 job='/usr/sbin/ntpdate 172.20.0.1 &>/dev/null' name=Synctime disabled=no"
#删除任务
ansible web -m cron -a "name='backup mysql' state=absent"
ansible web -m cron -a 'state=absent name=Synctime'

相关文章:

  • Rust 和 R 语言的十大应用领域
  • springboot口腔管理平台
  • 2025.6.21笔记
  • `provide` 和 `inject` 组件通讯:实现跨组件层级通讯
  • 成长笔记——多串口发送与接收
  • 企业公用电脑登录安全管控的终极方案:ASP操作系统安全登录管控方案
  • 编程基础:耦合
  • JVM(8)——详解分代收集算法
  • 无线Debugger攻防全解:原理剖析与突破之道
  • 个人博客使用NextWatermark WordPress插件为网站图片自动批量添加水印,保护图片版权
  • 【软考高级系统架构论文】论云上自动化运维及其应用
  • 【环境配置】在Ubuntu Server上安装5090 PyTorch环境
  • 【Linux-shell】探索Dialog 工具在 Shell 图形化编程中的高效范式重构
  • 【JavaWeb】Servlet+JSP 实现分页功能
  • PostgreSQL/Hologres 外部服务器系统表 pg_foreign_server 详解
  • React 组件通信
  • 解锁K-近邻算法:数据挖掘的秘密武器
  • 使用Trae编辑器与MCP协议构建高德地图定制化服务
  • vscode内嵌浏览器实时预览vue项目
  • Pytorch3D 中涉及的知识点汇总
  • 四川游戏seo整站优化/短链接生成
  • 做儿童文学有哪些的网站/广告公司招聘
  • 网页游戏代理平台/网站seo排名优化软件
  • php 网站授权/网络营销活动策划
  • 中企动力网站开发/赣州seo公司
  • 电子政务门户网站建设教训/中国世界排名