一、模块使用
1.1 Yum模块
功能:管理软件包,只支持RHEL,CentOS,fedora,不支持Ubuntu其它版本
参数 | 说明 |
---|---|
name |
要操作的软件包名称,支持通配符(如 httpd , nginx* ),也可以是 URL 或本地 .rpm 文件路径。 |
state |
软件包状态: - present :安装(默认) - absent :卸载 - latest :安装最新版本 |
webow_downgrade |
是否允许降级安装指定版本的包(默认为否)。⚠️ 可能导致非幂等行为。 |
autoremove |
删除不再依赖的"叶"包(仅当 state=absent 或单独使用时有效)。 |
bugfix |
仅安装标记为 bugfix 的更新(配合 state=latest 使用)。 |
conf_file |
指定自定义的 yum 配置文件路径。 |
disable_excludes |
禁用 yum 配置中的排除规则(可选值:web , main , repoid )。 |
disable_gpg_check |
安装时是否禁用 GPG 校验(适用于测试环境)。 |
disablerepo |
操作期间临时禁用的仓库 ID(可以是逗号分隔字符串或列表)。 |
enablerepo |
操作期间临时启用的仓库 ID(可以是逗号分隔字符串或列表)。 |
download_only |
仅下载 RPM 包而不安装。 |
download_dir |
指定 RPM 包下载目录(配合 download_only 使用)。 |
exclude |
排除某些包不进行操作(例如:kernel* )。 |
instweb_weak_deps |
安装弱依赖项(仅限 yum >= 4, ansible web -m yum -a 'name=httpd state=absent' 如 RHEL/CentOS 8)。 |
instwebroot |
指定替代根目录(用于 chroot 环境)。 |
list |
列出包信息(如 instwebed , updates , available 或具体包名)。 |
lock_timeout |
等待 yum 锁释放的最大时间(单位:秒)。 |
范例1:
ansible web -m yum -a 'name=httpd state=present' #安装

范例2:
ansible web -m yum -a 'name=httpd state=absent' #删除

1.2 Service模块
功能:管理服务
参数 | 必填 | 说明 |
---|---|---|
name |
✅ 是 | 要操作的服务名称(如 httpd , nginx )。 |
state |
否 | 服务状态: - started :启动服务 - stopped :停止服务 - restarted :重启服务 - reloaded :重载配置 |
enabled |
否 | 是否设置为开机自启(布尔值,yes /no ) |
pattern |
否 | 如果服务不支持 status 命令,可指定一个进程名匹配字符串(用于检测是否运行)。 |
arguments |
否 | 启动服务时传递的额外命令行参数。 |
runlevel |
否 | 仅适用于 OpenRC 系统(如 Gentoo),指定服务所属 runlevel。 |
sleep |
否 | 在 restarted 时,stop 和 start 之间等待秒数(部分 init 脚本需要)。 |
use |
否 | 强制使用某个服务管理模块(如 systemd , sysv , openrc ),默认自动识别。 |
范例1:
ansible web -m service -a 'name=httpd state=started enabled=yes'

范例2:
ansible web -m shell -a "sed -i 's/^Listen 80/Listen 8080/' /etc/httpd/conf/httpd.conf"
1.3 User模块
功能:管理用户
参数 | 必填 | 说明 |
---|---|---|
name |
✅ 是 | 要操作的用户名(如 alice , bob )。 |
state |
否 | 用户状态: - present :创建或更新用户(默认) - absent :删除用户 |
comment |
否 | 设置用户的描述信息(GECOS 字段)。 |
home |
否 | 设置用户的家目录路径。 |
shell |
否 | 设置用户的登录 shell(如 /bin/bash )。 |
group |
否 | 设置用户的主组(组名)。 |
groups |
否 | 设置用户的附加组列表(逗号分隔字符串或列表)。 若为空字符串 '' ,则移除所有附加组。 |
append |
否 | 如果为 yes ,在现有附加组基础上添加新组;否则替换原有附加组。与 local 互斥。 |
create_home |
否 | 是否创建用户家目录(默认为 yes )。 |
remove |
否 | 当 state=absent 时,是否删除用户的家目录和邮件文件(相当于 userdel -r )。 |
force |
否 | 强制删除用户(即使正在登录或拥有运行进程),仅在支持的系统上有效。 |
password |
否 | 设置用户密码(需提供加密后的密码,如使用 mkpasswd 或 openssl 生成)。 |
generate_ssh_key |
否 | 是否为用户生成 SSH 密钥对。 |
ssh_key_bits |
否 | 指定生成的 SSH 密钥位数(默认 2048)。 |
ssh_key_type |
否 | 指定 SSH 密钥类型(如 rsa , ed25519 )。 |
expires |
否 | 设置用户过期时间(以 Unix 时间戳表示)。仅限 Linux、FreeBSD 等支持平台。 |
system |
否 | 是否创建为系统用户(UID 小于系统设定阈值)。 |
uid |
否 | 指定用户的 UID。 |
login_class |
否 | 设置 BSD 系统上的登录类(如 FreeBSD)。 |
local |
否 | 强制使用本地命令(如 luseradd )操作本地用户数据库,适用于集中认证环境。与 groups 和 append 互斥。 |
move_home |
否 | 若更改了 home ,是否移动原家目录到新路径。 |
范例1:
ansible web -m user -a 'name=user1 comment="test user" uid=2048 home=/app/user1 group=root'

1.4 Group模块
功能:管理组
参数 | 必填 | 说明 |
---|---|---|
name |
✅ 是 | 要操作的组名(如 developers , admins )。 |
state |
否 | 组状态: - present :创建组(默认) - absent :删除组 |
gid |
否 | 设置组的 GID(组 ID)。 |
non_unique |
否 | 如果设置了 gid ,允许使用非唯一 GID(仅限 Linux,不支持 macOS 或 BusyBox)。 |
system |
否 | 若为 yes ,则创建一个系统组(通常 GID 小于系统设定的阈值)。 |
local |
否 | 强制使用本地命令(如 lgroupadd )来操作本地组数据库,适用于集中认证环境。 |
范例1:
#创建组
ansible web -m group -a 'name=nginx gid=88 system=yes'
#删除组
ansible web -m group -a 'name=nginx state=absent'
1.5 Lineinfile模块
ansible在使用sed进行替换时,经常会遇到需要转义的问题,而且ansible在遇到特殊符号进行替换时,存在问题,无法正常进行替换 。其实在ansible自身提供了两个模块:lineinfile模块和replace模块,可以方便的进行替换
功能:相当于sed,可以修改文件内容
参数 | 必填 | 说明 |
---|---|---|
dest 或 path |
✅ 是 | 要操作的目标文件路径。 |
state |
否 | 行的状态: - present :确保该行存在(默认) - absent :删除匹配的行 |
regexp |
否 | 正则表达式,用于匹配文件中的一行或多行。如果未提供,默认匹配整行内容。 |
line |
否(当 state=present 时必填) |
要插入或替换的文本行。 |
backup |
否 | 修改前创建备份文件(带时间戳)。 |
create |
否 | 如果文件不存在且 state=present ,是否创建文件。 |
insertafter |
否 | 当 state=present 且没有匹配到 regexp 时,在匹配该正则的 最后一行之后 插入新行。可使用 EOF 插入到文件末尾。 |
insertbefore |
否 | 类似 insertafter ,但在匹配的行 之前 插入。可使用 BOF 插入到文件开头。 |
firstmatch |
否 | 若为 yes ,在 insertafter 或 insertbefore 中只匹配第一个符合条件的行。 |
backrefs |
否 | 若为 yes ,允许 line 中使用正则捕获组(配合 regexp 使用),仅当匹配时替换并更新行。否则不修改文件。 |
group |
否 | 设置文件所属的用户组。 |
owner |
否 | 设置文件所属的用户。 |
mode |
否 | 设置文件权限(如 0644 , 0755 )。 |
attributes |
否 | 设置文件属性(如通过 chattr 设置的属性)。 |
范例:
ansible web -m lineinfile -a "path=/etc/selinux/config regexp='^SELINUX=' line='SELINUX=enforcing'"
ansible web -m lineinfile -a 'dest=/etc/fstab state=absent regexp="^#"'
1.6 Replace模块
该模块有点类似于sed命令,主要也是基于正则进行匹配和替换
参数 | 必填 | 说明 |
---|---|---|
path |
✅ 是 | 要操作的目标文件路径。 |
regexp |
✅ 是 | 正则表达式,用于匹配需要替换的内容(Python 风格)。 使用 MULTILINE 模式:^ /$ 匹配每行开头/结尾。 |
replace |
否 | 替换后的内容,可以包含正则捕获组引用(如 \1 , (?P<name>...) )。若未设置,则匹配内容会被删除。 |
backup |
否 | 若为 yes ,在修改前创建带时间戳的备份文件。 |
after |
否 | 只替换在此正则匹配内容之后的部分(配合 before 使用)。 |
before |
否 | 只替换在此正则匹配内容之前的部分(配合 after 使用)。 |
encoding |
否 | 文件的字符编码(如 utf-8 , latin1 等)。 |
group |
否 | 设置文件所属的用户组。 |
owner |
否 | 设置文件所属的用户。 |
mode |
否 | 设置文件权限(如 0644 , 0755 或符号模式如 u=rw,g=r,o=r )。 |
attributes |
否 | 设置文件属性(如通过 chattr 设置的属性)。 |
范例:
ansible web -m replace -a "path=/etc/fstab regexp='^(UUID.*)' replace='#\1'"
ansible web -m replace -a "path=/etc/fstab regexp='^#(.*)' replace='\1'"
1.7 Setup模块
功能: setup 模块来收集主机的系统信息,这些 facts 信息可以直接以变量的形式使用.
但是如果主机较多,会影响执行速度,可以使用gather_facts: no
来禁止 Ansible 收集 facts 信息
参数 | 必填 | 说明 |
---|---|---|
filter |
否 | 使用通配符(shell 风格,如 ansible_distribution* )过滤输出的 facts。 |
gather_subset |
否 | 指定要收集的 fact 子集: - web :全部(默认) - min :最小基础信息 - hardware :硬件相关信息 - network :网络相关信息 - virtual :虚拟化信息 - facter / ohai :兼容 Puppet Facter 或 Chef Ohai 可使用 ! 排除子集,如 !network |
gather_timeout |
否 | 设置每个 fact 收集的最大时间(秒),防止因某些模块卡顿导致整体超时。 |
fact_path |
否 | 自定义本地自定义 facts 脚本路径(.fact 文件),支持 JSON 或 INI 格式。 |
范例:
ansible web -m setup
ansible web -m setup -a "filter=ansible_nodename"
ansible web -m setup -a "filter=ansible_hostname"
ansible web -m setup -a "filter=ansible_domain"
ansible web -m setup -a "filter=ansible_memtotal_mb"
ansible web -m setup -a "filter=ansible_memory_mb"
ansible web -m setup -a "filter=ansible_memfree_mb"
ansible web -m setup -a "filter=ansible_os_family"
ansible web -m setup -a "filter=ansible_distribution_major_version"
ansible web -m setup -a "filter=ansible_distribution_version"
ansible web -m setup -a "filter=ansible_processor_vcpus"
ansible web -m setup -a "filter=ansible_web_ipv4_addresses"
ansible web -m setup -a "filter=ansible_architecture"
ansible web -m setup -a "filter=ansible_processor*"
范例:
[root@ansible ~]#ansible web -m setup -a 'filter=ansible_python_version'
10.0.0.7 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "2.7.5",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
10.0.0.6 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "2.6.6",
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false
}
10.0.0.8 | SUCCESS => {
"ansible_facts": {
"ansible_python_version": "3.6.8",
"discovered_interpreter_python": "/usr/libexec/platform-python"
},
"changed": false
}
[root@ansible ~]#
二、playbook介绍
2.1 介绍
playbook 剧本是由一个或多个"play"组成的列表。
play的主要功能在于将预定义的一组主机,装扮成事先通过ansible中的task定义好的角色。Task实际是调用ansible的一个module,将多个play组织在一个playbook中,即可以让它们联合起来,按事先编排的机制执行预定义的动作。
Playbook 文件是采用YAML语言编写的。
2.2 YAML 语言
YAMl 语言介绍
YAML是一个可读性高的用来表达资料序列的格式。YAML参考了其他多种语言,包括:XML、C语言、Python、Perl以及电子邮件格式RFC2822等。
Clark Evans在2001年在首次发表了这种语言,另外Ingy döt Net与Oren Ben-Kiki也是这语言的共同设计者,目前很多软件中采有此格式的文件,如:ubuntu,anisble,docker,k8s等。
YAML:YAML Ain't Markup Language,即YAML不是XML。不过,在开发的这种语言时,YAML的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)
YAML 语言特性
-
YAML的可读性好
-
YAML和脚本语言的交互性好
-
YAML使用实现语言的数据类型
-
YAML有一个一致的信息模型
-
YAML易于实现
-
YAML可以基于流来处理
-
YAML表达能力强,扩展性好
YAML语法简介
-
在单一文件第一行,用连续三个连字号"-" 开始,还有选择性的连续三个点号( ... )用来表示文件的结尾
-
次行开始正常写Playbook的内容,一般建议写明该Playbook的功能
-
使用#号注释代码
-
缩进必须是统一的,不能空格和tab混用
-
缩进的级别也必须是一致的,同样的缩进代表同样的级别,程序判别配置的级别是通过缩进结合换行来实现的 YAML文件内容是区别大小写的,key/value的值均需大小写敏感
-
多个key/value可同行写也可换行写,同行使用,分隔
-
v可是个字符串,也可是另一个列表
-
一个完整的代码块功能需最少元素需包括 name 和 task
-
一个name只能包括一个task
-
YAML文件扩展名通常为yml或yaml
YAML的语法和其他高阶语言类似,并且可以简单表达清单、散列表、标量等数据结构。
其结构(Structure)通过空格来展示,序列(Sequence)里的项用"-"来代表,Map里的键值对用":"分隔,下面介绍常见的数据结构。
List列表
列表由多个元素组成,每个元素放在不同行,且元素前均使用"-"打头,或者将所有元素用 [ ] 括起来放在同一行
范例:
fruits:
- Apple
- Orange
- Strawberry
- Mango
fruits:[Apple,Orange,Strawberry,Mango]
Dictionary字典
字典由多个key与value构成,key和value之间用 :分隔,所有k/v可以放在一行,或者每个 k/v 分别放在不同行
范例:
name: John Smith
age: 41
gender: Male
spouse:
name: Jane Smith
age: 37
gender: Female
children:
- name: Jimmy Smith
age: 17
gender: Male
- name: Jenny Smith
age: 13
gender: Female
2.3 Playbook核心元素
-
Hosts 执行的远程主机列表
-
Tasks 任务集
-
Variables 内置变量或自定义变量在playbook中调用
-
Templates 模板,可替换模板文件中的变量并实现一些简单逻辑的文件
-
Handlers 和 notify 结合使用,由特定条件触发的操作,满足条件方才执行,否则不执行
-
tags 标签 指定某条任务执行,用于选择运行playbook中的部分代码。ansible具有幂等性,因此会自动跳过没有变化的部分,即便如此,有些代码为测试其确实没有发生变化的时间依然会非常地长。此时,如果确信其没有变化,就可以通过tags跳过此些代码片断
hosts 组件
Hosts:playbook中的每一个play的目的都是为了让特定主机以某个指定的用户身份执行任务。hosts用于指定要执行指定任务的主机,须事先定义在主机清单中
案例:
- hosts: web:appsrvs
remote_user 组件
remote_user: 可用于Host和task中。也可以通过指定其通过sudo的方式在远程主机上执行任务,其可用于play全局或某任务;此外,甚至可以在sudo时使用sudo_user指定sudo时切换的用户
- hosts: web
remote_user: jyx
tasks:
- name: test connection
ping:
remote_user: sp
sudo: yes
sudo_user: wang
task列表和action组件
play的主体部分是task list,task list中有一个或多个task,各个task 按次序逐个在hosts中指定的所有主机上执行,即在所有主机上完成第一个task后,再开始第二个task
task的目的是使用指定的参数执行模块,而在模块参数中可以使用变量。
模块执行是幂等的,这意味着多次执行是安全的,因为其结果均一致
每个task都应该有其name,用于playbook的执行结果输出,建议其内容能清晰地描述任务执行步骤。
如果未提供name,则action的结果将用于输出
task两种格式:
(1) action: module arguments
(2) module: arguments 建议使用
注意:shell和command模块后面跟命令,而非key=value
范例:
---
- hosts: web
remote_user: root
tasks:
- name: instweb httpd
yum: name=httpd
- name: start httpd
service: name=httpd state=started enabled=yes
其它组件
某任务的状态在运行后为changed时,可通过"notify"通知给相应的handlers
任务可以通过"tags"打标签,可在ansible-playbook命令上使用-t指定进行调用
ShellScripts VS Playbook 案例
#SHELL脚本实现
#!/bin/bash
# 安装Apache
yum install -y httpd
# 复制配置文件
cp /tmp/httpd.conf /etc/httpd/conf/httpd.conf
cp/tmp/vhosts.conf /etc/httpd/conf.d/
# 启动Apache,并设置开机启动
systemctl enable --now httpd
#Playbook实现
---
- hosts: web
remote_user: root
tasks:
- name: "安装Apache"
yum: name=httpd
- name: "复制配置文件"
copy: src=/tmp/httpd.conf dest=/etc/httpd/conf/
- name: "复制配置文件"
copy: src=/tmp/vhosts.conf dest=/etc/httpd/conf.d/
- name: "启动Apache,并设置开机启动"
service: name=httpd state=started enabled=yes
2.4 playbook 命令
格式
ansible-playbook <filename.yml> ... [options]
常见选项
-C --check #只检测可能会发生的改变,但不真正执行操作
--list-hosts #列出运行任务的主机
--list-tags #列出tag
--list-tasks #列出task
--limit 主机列表 #只针对主机列表中的主机执行
-v -vv -vvv #显示过程
范例:
ansible-playbook file.yml --check #只检测
ansible-playbook file.yml
ansible-playbook file.yml --limit web
Playbook 初步
利用 playbook 创建 mysql 用户
范例:mysql_user.yml
---
- hosts: db
remote_user: root
tasks:
- name: create group
group: name=mysql system=yes gid=306
- name: create user
user: name=mysql shell=/sbin/nologin system=yes group=mysql uid=306 home=/data/mysql create_home=no
利用 playbook 安装 nginx
范例:instweb_nginx.yml
---
# instweb nginx
- hosts: web
remote_user: root
tasks:
- name: add group nginx
group: name=nginx state=present
- name: add user nginx
user: name=nginx state=present group=nginx
- name: Instweb Nginx
yum: name=nginx state=present
- name: web page
copy: src=files/index.html dest=/usr/share/nginx/html/index.html
- name: Start Nginx
service: name=nginx state=started enabled=yes
利用 playbook 安装和卸载 httpd
范例:instweb_httpd.yml
---
#instweb httpd
- hosts: web
remote_user: root
gather_facts: no
tasks:
- name: Instweb httpd
yum: name=httpd state=present
- name: Instweb configure file
copy: src=files/httpd.conf dest=/etc/httpd/conf/
- name: web html
copy: src=files/index.html dest=/var/www/html/
- name: start service
service: name=httpd state=started enabled=yes
ansible-playbook instweb_httpd.yml --limit 10.0.0.8
范例:remove_httpd.yml
#remove_httpd.yml
---
- hosts: web
remote_user: root
tasks:
- name: remove httpd package
yum: name=httpd state=absent
- name: remove apache user
user: name=apache state=absent
- name: remove config file
file: name=/etc/httpd state=absent
- name: remove web html
file: name=/var/www/html/index.html state=absent
利用 playbook 结合shell安装mysql
[root@ansible ~]#cat /data/ansible/instweb_mysql.yml
---
# instweb mysql-8
- hosts: db
remote_user: root
gather_facts: no
tasks:
- name: copy shell
script: /soft/instweb_mysql.sh