目录
[一.Playbook 的结构](#一.Playbook 的结构)
[二.Ansible Playbook 示例](#二.Ansible Playbook 示例)
[三.命令行运行 Playbook](#三.命令行运行 Playbook)
[五.条件判断 when](#五.条件判断 when)
[七.Templates 模块](#七.Templates 模块)
[九.Roles 模块](#九.Roles 模块)
[1.Roles 概念](#1.Roles 概念)
[2.roles 内各目录含义解释](#2.roles 内各目录含义解释)
[3.在一个 playbook 中使用 roles 的步骤:](#3.在一个 playbook 中使用 roles 的步骤:)
[3.1.创建以 roles 命名的目录:](#3.1.创建以 roles 命名的目录:)
[3.3.在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql:](#3.3.在 roles 目录中分别创建以各角色名称命令的目录,如 httpd、mysql:)
3.4.在每个角色命令的目录中分别创建files、handlers、tasks、templates、meta、defaults和vars目录,用不到的目录可以创建为空目录,也可以不创建:
[3.5.在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名:](#3.5.在每个角色的 handlers、tasks、meta、defaults、vars 目录下创建 main.yml 文件,千万不能自定义文件名:)
[3.6.修改 site.yml 文件,针对不同主机去调用不同的角色:](#3.6.修改 site.yml 文件,针对不同主机去调用不同的角色:)
前言:
前面讲解了关于Ansible的基础概念和相关的命令操作,今天我将讲解关于Ansible-Playbook剧本编写的相关模块及命令。
一.Playbook****的结构
Ansible 的 Playbook 是一个包含多个 Play 的 YAML 文件,每个 Play 负责对指定的 主机组 执行一系列的任务。Playbook 通常由以下几部分组成:
Tasks :每个任务会调用一个模块来在目标主机上执行操作。
Variables :通过定义和使用变量,使 Playbook 更具灵活性和可重用性。
Templates :通过 Jinja2 模板动态生成配置文件。
Handlers :用于响应任务执行后的变更( notify 触发)。
Roles :把多个任务、变量、模板、文件、处理程序组织成模块化结构,便于复用。
二.Ansible Playbook****示例


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

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

在命令行中,变量也可以通过'-e'参数传递

五.条件判断when
在 Ansible 中,提供的唯一一个通用的条件判断是 when 指令,当 when 指令的值为 true 时,则该任务执行,否则不执行该任务
比如:
根据主机的 IP 地址来执行任务:

或者根据主机名:

六.迭代:使用with_item或loop命令


七.Templates****模块
Jinja 是基于 Python 的模板引擎。 Template 类是 Jinja 的一个重要组件,可以看作是一个编译过的模板文件,用来产生目标文本,传递Python 的变量给模板去替换模板中的标记。
Jinja2 模板引擎在 Ansible 中用来动态生成文件。例如,在配置 Apache 时,可以使用模板文件来替换动态值。
1.创建jinja的模板文件(.j2)

2.定义变量并在主机清单中指定

3.playbook实例


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

使用参数tags:

九.Roles****模块
1.Roles****概念
Roles 数据中心有各种不同类型的主机。如 web 服务器、数据库服务器,基于开发环境的服务器。随着
时间的推移,具有处理所有这些情况的任务和人员的 Ansible playbook 将变得庞大而复杂。
1 )角色允许将复杂的剧本组织成独立的、更小的剧本和文件
2 )角色提供了一种从外部文件加载任务、处理程序和变量的方法
3 )角色也可关联和引用静态的文件和模板
4 )角色可以编写成满足普通用途需求,并且能被重复利用
Ansible 为了层次化、结构化地组织 Playbook ,使用了角色( roles ), roles 可以根据层次型结构自动装载变量文件、task 以及 handlers 等。简单来讲, roles 就是通过分别将变量、文件、任务、模块及处理器放置于单独的目录中,并可以便捷地include 它们。 roles 一般用于基于主机构建服务的场景中,但也可以用于构建守护进程等场景中。
2.roles****内各目录含义解释
files: 用来存放由 copy 模块或 script 模块调用的文件。
templates: 用来存放 jinjia2 模板, template 模块会自动在此目录中寻找 jinjia2 模板文件。
tasks: 此目录应当包含一个 main.yml 文件,用于定义此角色的任务列表,此文件可以使用
include 包含其它的位于此目录的 task 文件。
handlers: 此目录应当包含一个 main.yml 文件,用于定义此角色中触发条件时执行的动作。
vars: 此目录应当包含一个 main.yml 文件,用于定义此角色用到的变量。
defaults: 此目录应当包含一个 main.yml 文件,用于为当前角色设定默认变量。
meta: 此目录应当包含一个 main.yml 文件,用于定义此角色的特殊设定及其依赖关系。
Roles是将 Playbook 组织成模块化的结构,使其易于管理和重用。每个 Role 都有一套预定义的目录结构:

3.在一个playbook中使用roles的步骤**:**
3.1.创建以 roles 命名的目录:

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

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

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

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

3.6.修改 site.yml 文件,针对不同主机去调用不同的角色:

3.7.运行ansible-playbook:

4.案例
4.1.创建项目目录

4.2.编写http模块

4.3.编写mysql模块

4.4.编写php模块

4.5.编写roles模块

总结:
今天主要讲了关于ansible-playbook剧本编写的一些相关的模块和具体编写部署流程,希望对读者们有所帮助!