Linux中ansible模块补充和playbook讲解

一、模块使用

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 设置用户密码(需提供加密后的密码,如使用 mkpasswdopenssl 生成)。
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)操作本地用户数据库,适用于集中认证环境。与 groupsappend 互斥。
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,可以修改文件内容

参数 必填 说明
destpath ✅ 是 要操作的目标文件路径。
state 行的状态: - present:确保该行存在(默认) - absent:删除匹配的行
regexp 正则表达式,用于匹配文件中的一行或多行。如果未提供,默认匹配整行内容。
line 否(当 state=present 时必填) 要插入或替换的文本行。
backup 修改前创建备份文件(带时间戳)。
create 如果文件不存在且 state=present,是否创建文件。
insertafter state=present 且没有匹配到 regexp 时,在匹配该正则的 最后一行之后 插入新行。可使用 EOF 插入到文件末尾。
insertbefore 类似 insertafter,但在匹配的行 之前 插入。可使用 BOF 插入到文件开头。
firstmatch 若为 yes,在 insertafterinsertbefore 中只匹配第一个符合条件的行。
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
相关推荐
A.A呐12 分钟前
【Linux第四章】gcc、makefile、git、GDB
linux·c语言·开发语言·c++·git
努力成为DBA的小王14 分钟前
CVE-2024-6387漏洞、CVE-2025-26465漏洞、CVE-2025-26466漏洞 一口气全解决
运维·服务器
苹果醋31 小时前
vuex4.0用法
java·运维·spring boot·mysql·nginx
Fireworkitte1 小时前
如何使用 Dockerfile 创建自定义镜像
运维·docker·容器
大数据张老师1 小时前
自动化性能回退机制——蓝绿部署与灰度发布
运维·系统架构·自动化·ai架构
A-花开堪折1 小时前
01-驱动开发开篇
linux·嵌入式硬件
程序员JerrySUN3 小时前
Linux 内核同步管理全解:原理 + 实战 + 考点
linux·运维·服务器
Murrays3 小时前
【技能证书】适用于自动化方向从业者
运维·自动化
19894 小时前
【Dify精讲】第14章:部署架构与DevOps实践
运维·人工智能·python·ai·架构·flask·devops
杰克逊的日记4 小时前
什么是RoCE网络技术
运维·服务器·网络·roce