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。
sleeprestarted 时,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)。
removestate=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,是否创建文件。
insertafterstate=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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值