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
相关推荐
悠然南风6 天前
Ansible常见模块总结及LDAP Role 编写与调试
ansible
祺风挽楠15 天前
ansible编辑
网络·ansible
芳心粽伙饭16 天前
Ansible课后作业
ansible
烁34717 天前
Ansible初识
ansible
烁34717 天前
Ansible安装部署调试
ansible
烁34717 天前
Ansible命令
ansible
小义_18 天前
【Ansible】(三)基础配置与连接设置
云原生·ansible
炸炸鱼.22 天前
Ansible 企业级实战:Playbook 与 Roles 完全指南
网络·ansible
风曦Kisaki23 天前
# 自动化运维Day03:Ansible模块进阶(setup,debug),四种常用变量,进阶语法;Ansible Roles(角色)
运维·自动化·ansible
炸炸鱼.25 天前
Ansible 部署应用:从入门到精通
ansible