文章目录
- 一、Ansible Playbook介绍
- 1、Playbook的简单组成
- 1)“play”
- 2)“task”
- 3)“playbook”
- 2、Playbook与ad-hoc简单对比
- 区别
- 联系
- 3、YAML文件语法:
- `---`以及多个`---`??
- 使用 `include` 指令
- 1. 基本结构
- 2. 数据类型
- 3. 列表
- 4. 字典(映射)
- 5. 注释
- 6. 特殊语法
- 7. YAML中字典和带有值的列表项有什么区别?
- 4、Ansible编写yaml格式的Playbook的语法
- 1. 安装 Ansible
- 2. 基本结构
- 3. 创建一个 Playbook 示例
- 4. 详细讲解
- a. `name`
- b. `hosts`
- c. `become`
- d. `tasks`
- e. `module_name`
- f. 参数和选项
- 5. 运行 Playbook
- 6. 进阶功能
- 6-a. 变量
- Jinja2规定的模板文件的基本语法
- 6-b. 条件
- 6-c. 处理
- 6-d. 角色
- 7. 文档和帮助
- 5、测试编写简单的Playbook
- 1)编写Playbook文件
- 2)执行playbook
- 二、小项目——完全使用Ansible-Playbook部署多台服务器的服务
- 需求
- 两台Web服务器部署同一Web应用WeCenter,且两台服务器的用户上传的数据目录挂载到共享存储服务器中,总数据保存在一台数据库服务器中
- 使用sersync简单实现两台共享存储服务器之间的Web应用共享数据目录的数据同步
- 每天定时将两台Web服务器的WeCenter的相关目录打包备份到备份服务器的对应的备份目录中
- 编写playbook
- 思路
- To Do Here?????????????????
- 具体实现
一、Ansible Playbook介绍
1、Playbook的简单组成
xxxx.yaml文件
1)“play”
单个角色
2)“task”
角色的执行的内容
3)“playbook”
多个角色及其task
2、Playbook与ad-hoc简单对比
Ansible 中的 ad-hoc 命令和 Playbook 是两种不同的使用方式,各自有其特点和适用场景:
区别
-
Ad-hoc 命令:
- 定义:用于一次性执行简单任务的命令。
- 语法:直接在命令行中输入,不需要编写脚本。
- 用途:适合快速执行简单的操作,如安装软件、重启服务等。
- 示例:
ansible all -m ping
(对所有主机执行 ping 模块)。
-
Playbook:
- 定义:一组有序的任务,可以包含多个 play,定义了更复杂的自动化流程。
- 格式:使用 YAML 格式编写,结构化清晰。
- 用途:适合需要多个步骤和条件的复杂操作,如配置管理和应用部署。
- 示例:
- hosts: webserverstasks:- name: Install nginxapt:name: nginxstate: present
联系
-
相辅相成:ad-hoc 命令可以用于快速测试或临时任务,而 Playbook 则用于系统的配置和管理。你可以先使用 ad-hoc 命令快速验证某个操作的效果,然后再将其转化为 Playbook 以便于重复使用和版本控制。
-
依赖关系:Playbook 并不依赖于 ad-hoc 命令,但二者可以一起使用,以便在不同场景中提高工作效率。
总之,ad-hoc 命令适用于简单、一次性的任务,而 Playbook 则适合更复杂、结构化的操作。
3、YAML文件语法:
YAML(YAML Ain’t Markup Language)是一种简洁的数据序列化格式,常用于配置文件和数据交换。下面是 YAML 的一些基本语法规则和示例:
注意:
1、
2、
---
以及多个---
??
在YAML中,第一行写上“—”是用来表示文档的开始。这个符号是YAML的标准语法的一部分,用于指示一个YAML文档的起始位置。它在多文档的YAML文件中尤其重要,用于区分不同的文档。每个文档都以“—”开头,以便解析器能够识别和分隔这些文档。
例如:
---
name: Alice
age: 30
---
name: Bob
age: 25
在Ansible的playbook中使用多个
---
不是Ansible playbook的标准格式。Playbook通常是一个YAML格式的文件,它定义了一系列的plays,每个play可以包含多个tasks。在标准的playbook文件中,通常只需要在文件的最开始使用一个---
来标识YAML文档的开始。如果你在playbook中使用了多个
---
,Ansible会将每个---
后面的内容视为一个新的YAML文档。如果这些文档符合Ansible playbook的格式要求,Ansible会尝试解析它们。但是,这通常不是预期的行为,因为它可能会导致结构上的混乱,使得playbook难以理解和维护。例如,以下是一个不正确的playbook示例,它错误地使用了多个
---
:
---
- hosts: webserverstasks:- name: Ensure Apache is at the latest versionyum:name: httpdstate: latest
---- hosts: dbserverstasks:- name: Ensure MySQL is at the latest versionyum:name: mysql-serverstate: latest
正确的格式应该是没有中间的 ---
分隔,如下所示:
---
- hosts: webserverstasks:- name: Ensure Apache is at the latest versionyum:name: httpdstate: latest- hosts: dbserverstasks:- name: Ensure MySQL is at the latest versionyum:name: mysql-serverstate: latest
如果你确实需要在一个文件中定义多个playbook(虽然不推荐),你应该确保每个play的定义都是连续的,没有被
---
分隔。如果你的意图是创建多个独立的YAML文档,你应该考虑将它们拆分成不同的文件,每个文件包含一个playbook。Ansible的配置文件和清单文件通常不需要多个"—",因为它们通常只包含一个单一的配置或主机定义列表。如果需要引入额外的配置,可以通过include指令来实现。
在Ansible中,include
指令用于将一个文件的内容包含到另一个文件中。这在组织大型项目时非常有用,因为它允许你将配置分解成更小、更易于管理的部分。
使用 include
指令
要在Ansible的配置文件或清单文件中使用
include
指令,你可以按照以下步骤操作:
创建单独的配置文件:首先,你需要创建包含特定配置或主机定义的单独文件。例如,你可以创建一个名为
webservers.yml
的文件,其中包含所有Web服务器的配置。在主文件中使用
include
:在你的主配置文件或清单文件中,使用include
指令来引入这些单独的文件。例如,如果你的主清单文件名为site.yml
,你可以这样使用include
:
# site.yml- hosts: alltasks:- include: tasks/common.yml- include: tasks/webservers.yml
在这个例子中,
tasks/common.yml
和tasks/webservers.yml
是包含任务列表的文件,它们会被包含在site.yml
文件中。
- 使用变量文件:你也可以使用
include_vars
来引入变量文件。例如:
# group_vars/all.yml
include_vars:- secret.yml
这里,
secret.yml
文件中的变量会被包含到all.yml
文件中。
- 使用
include
引入多个文件:如果你有多个文件需要引入,可以在一个列表中指定它们:
- hosts: alltasks:- include: tasks/common.yml- include: tasks/webservers.yml- include: tasks/databases.yml
- 使用条件:你可以在
include
指令中添加条件,以便在特定情况下才引入文件:
- hosts: alltasks:- include: tasks/special.ymlwhen: inventory_hostname in groups['special']
在这个例子中,
tasks/special.yml
只有在主机属于special
组时才会被引入。通过使用
include
指令,你可以有效地组织和重用Ansible的配置和任务,使得项目更加模块化和易于维护。
1. 基本结构
-
键值对:YAML 的基本结构是键值对,每个键值对用冒号(
:
)分隔。例如:name: Alice age: 30
-
缩进:YAML 使用缩进来表示层级关系,缩进通常使用两个空格,不允许使用制表符(Tab)。例如:
person:name: Aliceage: 30
2. 数据类型
-
字符串:可以直接写字符串,也可以使用引号(
"
或'
)包围。引号可以用于包含特殊字符或防止解析错误。simple_string: Hello quoted_string: "Hello, world!" multiline_string: |This is amulti-line string.
-
整数和浮点数:
integer: 42 float: 3.14
-
布尔值:
is_active: true is_deleted: false
-
空值:用
null
或~
表示空值。empty_value: null another_empty_value: ~
3. 列表
-
简单列表:每个列表项用破折号(
-
)表示。fruits:- Apple- Banana- Orange
-
带有值的列表项:
fruits:- name: Applecolor: Red- name: Bananacolor: Yellow
4. 字典(映射)
-
简单字典:
person:name: Aliceage: 30address:city: New Yorkzip: 10001
-
嵌套字典:
employees:- name: Bobposition: Developercontact:email: bob@example.comphone: 123-456-7890- name: Carolposition: Manager
5. 注释
-
单行注释:用
#
开始。# This is a comment name: Alice # This is an inline comment
-
多行注释:没有正式的多行注释,但可以使用多行单行注释。
# This is a comment # that spans multiple lines
6. 特殊语法
-
多行字符串:使用
|
保留换行符,使用>
将换行符转换为空格。multi_line_literal: |This is a stringwith line breaks.folded_style: >This is a stringthat folds into a single line.
-
锚点和别名:使用
&
定义锚点,使用*
引用别名。defaults: &defaultscolor: bluesize: mediumitem1:<<: *defaultsname: Item 1item2:<<: *defaultsname: Item 2
-
合并映射:使用
<<:
合并映射。base: &basename: Defaultstatus: activecustom:<<: *basename: Custom
7. YAML中字典和带有值的列表项有什么区别?
在 YAML 中,字典是由键值对组成的结构,使用冒号来分隔,例如 key: value
,可以表达层次关系和属性。带有值的列表项则是通过短横线表示的元素集合,如:
- item1
- item2
字典适合表示关联数据,而列表用于有序的元素集合。简单来说,字典强调键的映射关系,列表强调顺序。
这些是 YAML 文件的基本语法规则。YAML 的语法很直观,易于阅读和编写,但需要注意缩进和语法的准确性。
4、Ansible编写yaml格式的Playbook的语法
编写 Ansible Playbook 是自动化系统管理和配置的一种方式。Playbook 是一种 YAML 文件,用于定义在目标主机上执行的任务。以下是详细编写 Ansible Playbook 的步骤和示例:
1. 安装 Ansible
确保你已经安装了 Ansible。在大多数系统上,你可以通过以下命令进行安装:
# Debian系列:
apt install ansbile# 如果安装了Python的包管理工具,那么可以使用pip安装
pip install ansible# RedHat系列:
yum install ansible
2. 基本结构
一个基本的 Playbook 结构如下:
- name: 这个 Playbook 的名称hosts: 主机组become: 是否需要提权(默认是 False)tasks:- name: 任务名称module_name:参数: 值
3. 创建一个 Playbook 示例
下面是一个简单的示例 Playbook,该 Playbook 将在指定的主机上安装 Nginx 并启动它。
- name: 安装并启动 Nginxhosts: web_serversbecome: yestasks:- name: 安装 Nginxapt:name: nginxstate: present- name: 启动 Nginx 服务service:name: nginxstate: startedenabled: yes
4. 详细讲解
a. name
每个 Playbook 和任务都应该有一个 name
,用于描述其作用。
- name: 安装并启动 Nginx
b. hosts
指定目标主机组。这些主机组通常在 inventory
文件中定义。可以指定一个或多个主机组。
hosts: web_servers
c. become
指示是否需要使用 sudo
权限执行任务。默认为 false
,可以设置为 yes
以启用。
become: yes
d. tasks
包含一系列任务,每个任务都执行特定的操作。
tasks:- name: 安装 Nginxapt:name: nginxstate: present
e. module_name
Ansible 的模块是执行具体任务的工具。例如 apt
模块用于管理 Debian 系列系统上的软件包。
f. 参数和选项
不同的模块有不同的参数。例如,在 apt
模块中,name
指定要安装的软件包,state
定义软件包的状态(如 present
表示安装,absent
表示删除)。
5. 运行 Playbook
要执行 Playbook,使用 ansible-playbook
命令:
ansible-playbook playbook.yml
6. 进阶功能
6-a. 变量
可以在 Playbook 中定义变量,也可以在 vars
文件中定义。示例如下:
- name: 安装软件包hosts: allvars:package_name: nginxtasks:- name: 安装 Nginxapt:name: "{{ package_name }}"state: present
注:这里的“{{”是什么意思?以及它引发的一些知识
一、
在许多模板引擎和配置文件中,双花括号
{{
和}}
用来表示变量的占位符。具体到你提到的上下文中,这通常出现在 YAML文件中,尤其是在使用 Ansible 这样的自动化工具时。1、在 Ansible 中
在 Ansible 的 playbooks 或 roles 中,双花括号
{{
和}}
用于引用变量。这些变量可以是:
- 直接在 playbook 中定义的变量。
- 在
vars
文件或字典中定义的变量。- 从外部文件或环境变量中读取的变量。
- 从 Ansible 的事实(facts)模块获取的系统信息。
2、作用
- 动态替换:Ansible 在执行任务时会替换这些占位符为变量的实际值。
- 灵活性:允许在不修改任务定义的情况下,通过改变变量的值来改变任务的行为。
3、示例
假设你有一个 Ansible playbook,其中定义了一个变量并使用它来安装软件包:
- hosts: allvars:package_name: nginxtasks:- name: Install packageapt:name: "{{ package_name }}"state: present
在这个例子中:
package_name
是一个变量,其值被设置为nginx
。- 在
apt
模块中,{{ package_name }}
会被替换为nginx
,因此 Ansible 会安装nginx
包。4、总结
双花括号
{{
和}}
在 Ansible
和其他一些模板系统中用于标记变量,使得配置文件和任务定义更加灵活和动态。这种机制允许用户通过改变变量的值来重用和调整配置,而无需每次都手动编辑文件。二、
“模板引擎”和“模板系统”是编程和网页设计中常见的概念,它们用于生成动态内容。以下是它们的详细解释:
-----模板引擎(Template Engine)
定义: 模板引擎是一种工具或库,用于将模板文件(通常包含静态标记和占位符)与数据模型结合起来,生成最终的输出文件(如 HTML、XML、PDF 等)。
工作原理:
- 模板文件:包含预定义的标记和占位符,用于指示数据插入的位置。
- 数据模型:包含要插入到模板中的数据。
- 渲染过程:模板引擎读取模板文件,将数据模型中的数据替换模板中的占位符,生成最终的输出文件。
优点:
- 分离关注点:将内容(HTML、XML 等)与逻辑(数据和业务逻辑)分离,提高代码的可维护性和可读性。
- 重用性:模板文件可以被重复使用,只需更改数据模型即可生成不同的输出。
- 灵活性:支持各种编程语言和框架,可以根据需要选择适合的模板引擎。
------模板系统(Template System)
定义: 模板系统是一套规则和工具,用于定义和处理模板文件。它通常包括模板语法、模板文件格式和模板引擎。
组成部分:
- 模板语法:定义了如何在模板文件中表示占位符、条件语句、循环等。
- 模板文件:遵循模板语法的文件,用于生成最终的输出文件。
- 模板引擎:解析模板文件和数据模型,生成最终的输出文件。
应用场景:
- Web 开发:生成动态网页,如用户界面、表单、报告等。
- 文档生成:生成格式化的文档,如 PDF、Word 等。
- 邮件系统:生成个性化的电子邮件模板。
-----总结
- 模板引擎:是实现模板系统的一个组件,负责将模板文件和数据模型结合起来生成最终的输出文件。
- 模板系统:是一套完整的规则和工具,包括模板语法、模板文件和模板引擎,用于定义和处理模板文件。
在实际应用中,模板引擎和模板系统通常紧密相关,模板引擎是实现模板系统的核心部分。通过使用模板系统,开发者可以更高效地生成和管理动态内容。
三、
模板引擎和模板系统是编程中用来生成文本输出(通常是HTML)的工具,它们允许开发者将数据和视图分离,提高代码的可维护性和可重用性。以下是一些常见的模板引擎和模板系统:
Jinja2:
- 语言:Python
- 用途:广泛用于Web应用开发,是Flask和Django等框架的默认模板引擎。
- 特点:提供了丰富的模板继承功能,可以方便地构建复杂的页面布局。
Handlebars.js:
- 语言:JavaScript
- 用途:常用于前端开发,支持在浏览器端渲染。
- 特点:提供了强大的表达式处理能力和易于理解的语法。
Mustache:
- 语言:多种语言(最初为Ruby)
- 用途:轻量级的模板系统,适用于多种编程语言。
- 特点:简单易用,遵循逻辑最小化的原则。
EJS:
- 语言:JavaScript
- 用途:常用于Node.js环境中的Web应用。
- 特点:语法类似于JavaScript,易于学习。
Liquid:
- 语言:Ruby
- 用途:最初为Shopify开发,用于Web应用的模板渲染。
- 特点:安全,适合电子商务网站,因为它限制了模板中可执行的代码。
Twig:
- 语言:PHP
- 用途:常用于Symfony框架中,用于生成HTML。
- 特点:提供了丰富的模板继承和宏功能。
Smarty:
- 语言:PHP
- 用途:用于PHP Web应用的模板渲染。
- 特点:提供了丰富的模板控制结构和变量修饰符。
Thymeleaf:
- 语言:Java
- 用途:用于Java Web应用的模板渲染。
- 特点:支持HTML、XML、JavaScript、CSS,甚至纯文本的模板。
Razor:
- 语言:C#
- 用途:用于ASP.NET MVC和ASP.NET Core MVC的服务器端模板引擎。
- 特点:允许在HTML中嵌入C#代码,支持强类型和编译时检查。
Vue.js:
- 语言:JavaScript
- 用途:前端框架,也提供了模板系统。
- 特点:响应式数据绑定,易于构建单页面应用(SPA)。
React.js:
- 语言:JavaScript
- 用途:前端库,用于构建用户界面,特别是单页面应用。
- 特点:使用JSX语法,将JavaScript和HTML结合在一起。
这些模板引擎和系统各有特点,选择哪一个通常取决于项目需求、开发团队的熟悉程度以及所使用的技术栈。
四、
YAML(YAML Ain’t Markup Language)本身并不是一个模板引擎,而是一种用于数据序列化的格式。它是一种可读性高的配置文件格式,常用于配置文件和数据交换。YAML的设计目标是易于阅读和编写,同时也易于被计算机解析和生成。
在某些情况下,YAML 文件可以与模板引擎一起使用,例如在自动化配置管理工具(如 Ansible)中,YAML文件可以包含变量和表达式,这些变量和表达式在运行时会被替换为实际的值。在上面的例子中,
{{ package_name }}
是Ansible 模板中的一个占位符,它会被 Ansible 在执行任务时替换为vars
部分定义的package_name
变量的值。总结来说,YAML是一种数据序列化格式,它可以包含变量和表达式,但本身并不是模板引擎。模板引擎是一种软件组件,用于在运行时替换模板中的占位符为实际值。在某些工具中,YAML文件可以作为模板使用,但这并不意味着 YAML 本身是一个模板引擎。
五、
Ansible 不仅仅是一个模板系统,它是一个强大的 IT 自动化工具,用于配置管理、应用部署、任务执行和系统编排。Ansible 使用YAML 格式的剧本(playbooks)来描述自动化任务,这些剧本可以包含模板,但它们的功能远不止于此。
以下是 Ansible 的一些关键特点:
模板系统:Ansible 支持使用 Jinja2 模板引擎来生成配置文件和其他文本文件。你可以定义模板,并在运行时插入变量来生成定制化的输出。
配置管理:Ansible 可以用来自动化配置管理任务,确保服务器和应用程序的配置符合预期的标准。
应用部署:Ansible 可以自动化应用部署过程,从代码提交到部署到生产环境的整个过程。
任务执行:Ansible 提供了执行一次性任务的能力,比如系统更新、软件安装等。
系统编排:Ansible 可以用来协调多个系统和应用程序的部署和配置,实现复杂的自动化流程。
无代理:Ansible 的一大特点是无需在目标机器上安装代理或客户端软件,它通过 SSH 或 Windows Remote Management (WinRM) 来管理远程系统。
模块化:Ansible 提供了大量的模块(modules),用于执行各种自动化任务,如文件操作、服务管理、包管理等。
可扩展性:Ansible 允许用户编写自定义模块和插件来扩展其功能。
总的来说,Ansible 是一个全面的自动化平台,模板只是其众多功能中的一个组成部分。
六、
Ansible 使用的模板系统是 Jinja2。Jinja2 是一个功能强大的模板引擎,它支持变量替换、表达式计算、逻辑控制结构(如 if条件判断和 for 循环)以及丰富的过滤器和测试功能。在 Ansible 中,Jinja2模板主要用于处理模板文件,使得在配置文件中可以使用动态数据。
在 Ansible 的 playbooks 或任务中,经常需要使用
template
模块来处理模板文件。这个模块允许你定义一个源文件,这个文件包含了 Jinja2 模板语法,然后 Ansible
会将这个模板渲染成最终的配置文件,并将其传输到目标主机上。例如,如果你有一个名为
my_template.j2
的模板文件,你可以在 Ansible playbook 中这样使用它:
- name: 使用模板template:src: my_template.j2dest: /path/to/destination/file
在这个模板文件中,你可以使用 Jinja2 的语法来插入变量和表达式,例如:
# my_template.j2
Hello, {{ username }}!
The current date is {{ ansible_date_time.date }}.
当你执行这个 playbook 时,Ansible 会替换掉
{{ username }}
和{{ansible_date_time.date }}
这些变量,将它们渲染为实际的值,然后创建或更新目标主机上的文件。Jinja2 的语法非常灵活,使得在 Ansible 中使用模板变得非常方便和强大。
Jinja2规定的模板文件的基本语法
Jinja2 是一个强大的 Python 模板引擎,广泛用于生成动态 HTML 内容。以下是 Jinja2 的一些基本语法规则和特性:
1. 变量输出
使用{{ variable }}
来输出变量值。例如:
Hello, {{ name }}!
2. 控制结构
- 条件语句:
{% if condition %}{{ true_case }}
{% else %}{{ false_case }}
{% endif %}
- 循环:
{% for item in items %}{{ item }}
{% endfor %}
3. 过滤器
使用过滤器可以对变量进行格式化处理,语法为
{{ variable | filter }}
。
{{ name | upper }} {# 将 name 转换为大写 #}
4. 宏
宏允许你定义可重用的模板片段。
{% macro my_macro(arg1, arg2) %}<p>{{ arg1 }} and {{ arg2 }}</p>
{% endmacro %}
5. 注释
使用{# ... #}
来添加注释,这些内容不会出现在最终渲染的输出中。
{# This is a comment #}
6. 继承
模板继承允许你基于一个基础模板创建多个子模板。
{% extends "base.html" %}{% block content %}<h1>Hello, {{ name }}!</h1>
{% endblock %}
7. 容器
可以使用列表、字典等容器类型。
{% for key, value in my_dict.items() %}{{ key }}: {{ value }}
{% endfor %}
8. 自定义过滤器和测试
可以自定义过滤器和测试,以扩展模板的功能。9. 自动转义
Jinja2 默认会对输出进行自动转义,确保安全性。总结
Jinja2 提供了灵活的语法来构建动态内容,结合控制结构、过滤器、宏和模板继承,使得模板的管理和重用变得简单高效。你可以根据需要深入学习更多高级特性。
6-b. 条件
可以基于条件执行任务。例如:
- name: 安装 Nginxapt:name: nginxstate: presentwhen: ansible_os_family == "Debian"
6-c. 处理
定义错误处理和清理任务。例如:
tasks:- name: 安装 Nginxapt:name: nginxstate: presentignore_errors: yes- name: 任务完成debug:msg: "Nginx 已安装或发生错误"
6-d. 角色
使用角色来组织 Playbook。角色允许你将任务、变量、文件等结构化地分组。
- hosts: web_serversroles:- nginx
在 roles/nginx/tasks/main.yml
文件中定义具体的任务。
7. 文档和帮助
你可以通过以下命令获取有关模块和功能的更多帮助:
ansible-doc <module_name>
编写 Playbook 是一个迭代过程,你可以根据实际需求逐步扩展和调整。希望这些说明能帮助你编写出符合需求的 Playbook。
5、测试编写简单的Playbook
1)编写Playbook文件
vim /root/testPlaybook.yaml
注:
在 Ansible 中,.yml 和 .yaml 文件后缀名没有实际执行上的区别。两者都被 Ansible 视为 YAML 文件,并且可以用来编写 Playbook 和配置文件。选择哪种后缀主要取决于个人或团队的偏好。 YAML(YAML Ain’t Markup Language)标准允许使用这两种扩展名,所以可以根据自己的习惯来使用。
---
- name: The playbook to install http service on web servershosts: web_serversbecome: no tasks:- name: To Install http serveryum:name: httpdstate: present
- name: The playbook to install mariadb client on web servershosts: web_serversbecome: notasks:- name: To Install mariadbyum:name: mariadbstate: present
2)执行playbook
ansible-playbook /root/testPlaybook.yaml
PLAY [web_servers] *************************************************************TASK [Gathering Facts] *********************************************************
ok: [web02]
ok: [172.16.1.8]
ok: [172.16.1.7]
ok: [web01]TASK [To Install http server] **************************************************
ok: [172.16.1.8]
ok: [web02]
changed: [web01]
fatal: [172.16.1.7]: FAILED! => {"changed": false, "msg": "Failure talking to yum: list index out of range"}TASK [To Install mariadb-client] ***********************************************
fatal: [web01]: FAILED! => {"changed": false, "msg": "No package matching 'mariadb-client' found available, installed or updated", "rc": 126, "results": ["No package matching 'mariadb-client' found available, installed or updated"]}
fatal: [web02]: FAILED! => {"changed": false, "msg": "No package matching 'mariadb-client' found available, installed or updated", "rc": 126, "results": ["No package matching 'mariadb-client' found available, installed or updated"]}
fatal: [172.16.1.8]: FAILED! => {"changed": false, "msg": "No package matching 'mariadb-client' found available, installed or updated", "rc": 126, "results": ["No package matching 'mariadb-client' found available, installed or updated"]}PLAY RECAP *********************************************************************
172.16.1.7 : ok=1 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
172.16.1.8 : ok=2 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
web01 : ok=2 changed=1 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
web02 : ok=2 changed=0 unreachable=0 failed=1 skipped=0 rescued=0 ignored=0
上面信息的解释:
这段文本是Ansible自动化工具的输出日志,它描述了在一组称为web_servers
的服务器上执行一系列任务的过程。下面是对日志中关键部分的解释:
-
PLAY [web_servers]: 这表示一个Ansible playbook的开始,目标是名为
web_servers
的一组服务器。 -
TASK [Gathering Facts]: Ansible开始收集目标服务器的事实信息(如操作系统版本、网络配置等),以便后续任务可以利用这些信息。所有服务器(
web02
,172.16.1.8
,172.16.1.7
,web01
)都成功完成了这一步。 -
TASK [To Install http server]: 这个任务的目标是在所有服务器上安装HTTP服务器软件。
172.16.1.8
和web02
成功安装,web01
的状态是changed
,意味着在该服务器上进行了某些更改(可能是更新了现有软件)。然而,172.16.1.7
失败了,错误信息是“Failure talking to yum: list index out of range”,这通常意味着在与YUM(Yellowdog Updater Modified,一个用于管理Red Hat及其衍生版Linux发行版软件包的命令行工具)通信时出现了问题。 -
TASK [To Install mariadb-client]: 这个任务的目标是在所有服务器上安装MariaDB客户端。但是,所有服务器都失败了,错误信息是“No package matching ‘mariadb-client’ found available, installed or updated”,这意味着在尝试安装MariaDB客户端时,没有找到匹配的软件包。
-
PLAY RECAP: 这是整个play的总结,显示了每个服务器的状态。
ok
表示成功执行的任务数量,changed
表示导致系统状态变化的任务数量,failed
表示失败的任务数量。例如,172.16.1.7
有一个任务成功(ok=1
),没有任务导致系统变化(changed=0
),没有不可达的服务器(unreachable=0
),有一个任务失败(failed=1
),没有被跳过的任务(skipped=0
),没有被救援的任务(rescued=0
),也没有被忽略的任务(ignored=0
)。
总的来说,这个日志显示了一个自动化部署过程中遇到的一些问题,包括一个服务器上的YUM通信错误和所有服务器上MariaDB客户端软件包的缺失。
报错配置解析:
---
- name: The playbook to install httpd on web servershosts: web_serversbecome: notasks:- name: the task1 to install httpdyum:name: httpdstate: present
---
- name: The playbook to install mariadb client on webservershosts: web_serversbecome: notasks:- name: the task1 to install mariadb clientyum:name: mariadbstate: present
或
---
- name: The playbook to install httpd on web servershosts: web_serversbecome: notasks:- name: The task1 for installing httpdyum:name: httpdstate: present
- name: The playbook to install mariadb client on web servershosts: web_serversbecome: notasks:- name: The task1 for installing mariadbyum:name: mariadbstate: present
---
错误信息:
ERROR! We were unable to read either as JSON nor YAML, these are the errors we got from each:
JSON: No JSON object could be decodedSyntax Error while loading YAML.but found another documentThe error appears to be in '/root/web_test/test.yaml': line 9, column 1, but may
be elsewhere in the file depending on the exact syntax problem.The offending line appears to be:state: present
---
^ here
解释:
这段错误信息表明在尝试读取一个文件时遇到了问题,该文件既不能被解析为JSON格式,也不能被解析为YAML格式。具体的错误信息如下:
-
JSON错误:提示“没有能够解码的JSON对象”。这意味着文件中的内容不符合JSON格式的要求,可能是因为缺少大括号
{}
来定义一个对象,或者存在其他语法错误。 -
YAML错误:提示“在加载YAML时发现语法错误。找到了另一个文档”。这通常意味着YAML文件的格式不正确。YAML文件应该以
---
开始和结束,用于定义文档的开始和结束。错误信息指出问题可能出现在文件/root/web_test/test.yaml
的第9行,第1列,但实际的错误位置可能根据具体的语法问题而有所不同。 -
具体错误行:错误指向的行是
state: present
,后面跟着---
。这表明可能的问题是YAML文件中在state: present
这一行后面直接跟了一个---
,这不符合YAML的格式要求。在YAML中,---
通常用来分隔不同的文档,如果它出现在一个文档的中间,而不是结尾,就会导致解析错误。
综上所述,为了解决这个问题,需要检查并修正/root/web_test/test.yaml
文件中的JSON和YAML格式错误,确保其符合相应的语法规则。
正确配置:
---
- name: The playbook to install httpd on web servershosts: web_serversbecome: notasks:- name: the task1 to install httpdyum:name: httpdstate: present- name: The playbook to install mariadb client on webservershosts: web_serversbecome: notasks:- name: the task1 to install mariadb clientyum:name: mariadbstate: present
正确执行效果:
二、小项目——完全使用Ansible-Playbook部署多台服务器的服务
需求
两台Web服务器部署同一Web应用WeCenter,且两台服务器的用户上传的数据目录挂载到共享存储服务器中,总数据保存在一台数据库服务器中
使用sersync简单实现两台共享存储服务器之间的Web应用共享数据目录的数据同步
每天定时将两台Web服务器的WeCenter的相关目录打包备份到备份服务器的对应的备份目录中
**注:**不做数据库服务器的备份以及数据库服务器的高可用;不使用负载均衡服务器;共享存储服务器也不做高可用,仅实现其共享目录的数据同步
编写playbook
思路
0、编写主机清单
注:
[rsync:children]
web_servers
backup_servers
nfs_servers
1、创建统一用户
2、数据库创建及数据传入:
3、Web应用的部署,先m01上配置完成并测试启动,然后再推送到各个Web服务器中
4、使用变量、流程控制优化