Linux中ansible模块补充和playbook讲解

发布于:2025-06-23 ⋅ 阅读:(265) ⋅ 点赞:(0)

一、模块使用

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


微信公众号

今日签到

点亮在社区的每一天
去签到