Ansible-Playbook 剧本编写

目录

[1. Playbook 的结构](#1. Playbook 的结构)

[为什么需要 roles?](#为什么需要 roles?)

[roles 的核心:标准化目录结构](#roles 的核心:标准化目录结构)

[2. Ansible Playbook 示例](#2. Ansible Playbook 示例)

[3. 命令行运行 Playbook](#3. 命令行运行 Playbook)

[4. 变量和引用](#4. 变量和引用)

[5. 条件判断 when](#5. 条件判断 when)

[6. 迭代:使用 with_items 或 loop](#6. 迭代:使用 with_items 或 loop)

[7. Templates 模块](#7. Templates 模块)

[8. Tags 模块](#8. Tags 模块)

[9. Roles 模块](#9. Roles 模块)

[9.1 Roles 概念](#9.1 Roles 概念)

[9.3 在一个 playbook 中使用 roles 的步骤:](#9.3 在一个 playbook 中使用 roles 的步骤:)

[9.4 案列](#9.4 案列)

[9.4.1 创建项目目录](#9.4.1 创建项目目录)

[9.4.2 编写httpd模块](#9.4.2 编写httpd模块)

[9.4.3 编写mysql模块](#9.4.3 编写mysql模块)

[9.4.4 编写php模块](#9.4.4 编写php模块)

[9.4.5 编写roles](#9.4.5 编写roles)


1. Playbook 的结构

Ansible 的 Playbook 是一个包含多个 Play 的 YAML 文件,每个 Play 负责对指定的 主机组 执行一系列的任务。Playbook 通常由以下几部分组成:

  • Tasks:每个任务会调用一个模块来在目标主机上执行操作。
  • Variables:通过定义和使用变量,使 Playbook 更具灵活性和可重用性。
  • Templates:通过 Jinja2 模板动态生成配置文件。
  • Handlers:用于响应任务执行后的变更(notify 触发)。
  • Roles:把多个任务、变量、模板、文件、处理程序组织成模块化结构,便于复用。

roles是 Ansible 为了解决复杂 Playbook 臃肿、难以维护 的问题而设计的模块化组织机制 ------ 简单说,它把一个完整的自动化功能(比如部署 Nginx、配置 MySQL、搭建 Redis)拆分成标准化的目录结构,将tasks、vars、handlers、模板文件等分散的组件归类到独立的 "角色" 文件夹中,让 Playbook 更简洁、可复用、易共享。

为什么需要 roles?

如果没有 roles,当你要部署一个包含 Web、数据库、缓存的完整服务时,Playbook 会塞满成百上千行的 tasks、vars、handlers,代码杂乱且难以复用;而用 roles 后,你可以把 "Nginx 部署" 做成一个nginx角色、"MySQL 配置" 做成mysql角色,后续不管哪个 Playbook 需要部署 Nginx,直接引用这个角色即可,不用重复写代码。

roles 的核心:标准化目录结构

每个角色都有固定的目录规范(Ansible 会自动识别这些目录),以nginx角色为例,完整结构如下:

roles/ # 所有角色的根目录(默认路径,可自定义)

└── nginx/ # 角色名(比如nginx、mysql、redis)

├── tasks/ # 【核心】存放该角色的任务列表(必须有main.yml)

├── vars/ # 该角色的自定义变量(main.yml是入口)

├── handlers/ # 该角色的触发式任务(比如重启Nginx,main.yml是入口)

├── templates/ # Jinja2模板文件(比如nginx.conf.j2)

├── files/ # 静态文件(比如要拷贝的index.html)

├── defaults/ # 该角色的默认变量(优先级最低,可被覆盖)

└── meta/ # 角色元数据(比如依赖的其他角色)

2. Ansible Playbook 示例

3. 命令行运行 Playbook

在运行 Playbook 时,可以使用一些常用参数来调整执行行为:

4. 变量和引用

项目目录

变量在 Playbook 中非常有用,它们可以通过 vars 或命令行进行定义。

1. Play 级vars块(最常用,全局生效)

这是你之前用到的方式,在 Play 的vars里定义变量,整个 Play 的所有任务(包括template 任务)和 J2 模板都能读取,适合通用变量(如端口、域名、路径)

2. 任务级vars(仅当前 template 任务生效,适合临时变量)

如果变量只给某个 template 任务用,可在任务内定义vars,优先级高于 Play 级 vars。

3. 主机 / 组变量(适合多主机差异化配置)

如果不同主机需要不同的变量值(比如 A 主机端口 80,B 主机 8080),可在 inventory(主机清单)中定义主机 / 组变量,J2 模板同样能读取。

5. 条件判断 when

在Ansible中,提供的唯一一个通用的条件判断是when指令,当when指令的值为true时,则该任务执行,否则不执行该任务。

when 用于根据条件执行任务。它的常见用法包括:

  • 根据主机的 IP 地址来执行任务:
  • 或根据主机名来执行:

when: inventory_hostname == "<主机名>"

6. 迭代:使用 with_items 或 loop

Ansible 支持使用 with_items 或 loop 进行迭代。两者作用相同,loop 是较新的推荐用法。

7. Templates 模块

Jinja是基于Python的模板引擎。Template类是Jinja的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python的变量给模板去替换模板中的标记。

Jinja2 模板引擎在 Ansible 中用来动态生成文件。例如,在配置 Apache 时,可以使用模板文件来替换动态值。

  1. 创建 Jinja 模板文件 (.j2):
  1. 定义变量并在主机清单中指定:
  1. Playbook 示例:

8. Tags 模块

Tags 允许你指定只执行某些特定任务。通过命令行传入 --tags 参数来执行带有特定标签的任务。

执行时指定 --tags 参数:

ansible-playbook webhosts.yaml --tags="only"

9. Roles 模块

9.1 Roles 概念

Roles 数据中心有各种不同类型的主机。如web服务器、数据库服务器,基于开发环境的服务器。随着时间的推移,具有处理所有这些情况的任务和人员的Ansible playbook将变得庞大而复杂。

1)角色允许将复杂的剧本组织成独立的、更小的剧本和文件

2)角色提供了一种从外部文件加载任务、处理程序和变量的方法

3)角色也可关联和引用静态的文件和模板

4)角色可以编写成满足普通用途需求,并且能被重复利用

Ansible为了层次化、结构化地组织Playbook,使用了角色(roles),roles可以根据层次型结构自动装载变量文件、task以及handlers等。简单来讲,roles就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include它们。roles一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。

  • templates: 用来存放 jinjia2 模板,template 模块会自动在此目录中寻找 jinjia2 模板文件。
  • tasks: 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以用 include 包含其它的位于此目录的 task 文件。
  • handlers: 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
  • vars: 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
  • defaults: 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。
  • meta: 此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。

9.3 在一个 playbook 中使用 roles 的步骤:

  1. 创建以 roles 命名的目录:

mkdir /etc/ansible/roles/ -p #yum装完默认就有

  1. 创建全局变量目录(可选):

mkdir /etc/ansible/group_vars/ -p

touch /etc/ansible/group_vars/all #文件名自己定义,引用的时候注意

  1. 在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql:

mkdir /etc/ansible/roles/httpd

mkdir /etc/ansible/roles/mysql

  1. 在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建:

mkdir /etc/ansible/roles/httpd/{files,templates,tasks,handlers,vars,defaults,meta}

mkdir /etc/ansible/roles/mysql/{files,templates,tasks,handlers,vars,defaults,meta}

  1. 在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名:

touch /etc/ansible/roles/httpd/{defaults,vars,tasks,meta,handlers}/main.yml

touch /etc/ansible/roles/mysql/{defaults,vars,tasks,meta,handlers}/main.yml

  1. 修改 site.yml 文件,针对不同主机去调用不同的角色:
  1. 运行 ansible-playbook:

cd /etc/ansible

ansible-playbook site.yml

9.4 案列

9.4.1 创建项目目录
9.4.2 编写httpd模块
9.4.3 编写mysql模块
9.4.4 编写php模块
9.4.5 编写roles
相关推荐
原神启动15 小时前
Ansible(三)—— 使用Ansible自动化部署LNMP环境
android·自动化·ansible
可爱又迷人的反派角色“yang”9 小时前
ansible剧本编写(三)
linux·网络·云计算·ansible
叽里咕噜怪1 天前
Ansible Playbook 从入门到精通:零基础玩转自动化部署与配置管理
网络·自动化·ansible
lin张1 天前
Ansible学习总结:从基础命令到Playbook实战
网络·学习·ansible
可爱又迷人的反派角色“yang”1 天前
ansible基本命令与剧本编写(二)
linux·运维·ansible
m0_485614671 天前
ansible基础命令
ansible
叫致寒吧1 天前
自动化运维工具 Ansible
运维·自动化·ansible
m0_488777651 天前
Ansible基础概念及相关命令
ansible·模块·自动化运维工具
2501_939909051 天前
自动化运维工具 Ansible 集中化管理服务器
运维·自动化·ansible