Ansible——Playbook基本功能

文章目录

一、Ansible Playbook介绍

1、Playbook的简单组成

xxxx.yaml文件

1)"play"

单个角色

2)"task"

角色的执行的内容

3)"playbook"

多个角色及其task

2、Playbook与ad-hoc简单对比

Ansible 中的 ad-hoc 命令和 Playbook 是两种不同的使用方式,各自有其特点和适用场景:

区别

  1. Ad-hoc 命令

    • 定义:用于一次性执行简单任务的命令。
    • 语法:直接在命令行中输入,不需要编写脚本。
    • 用途:适合快速执行简单的操作,如安装软件、重启服务等。
    • 示例ansible all -m ping(对所有主机执行 ping 模块)。
  2. Playbook

    • 定义:一组有序的任务,可以包含多个 play,定义了更复杂的自动化流程。

    • 格式:使用 YAML 格式编写,结构化清晰。

    • 用途:适合需要多个步骤和条件的复杂操作,如配置管理和应用部署。

    • 示例

      yaml 复制代码
      - hosts: webservers
        tasks:
          - name: Install nginx
            apt:
              name: nginx
              state: 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文件中尤其重要,用于区分不同的文档。每个文档都以"---"开头,以便解析器能够识别和分隔这些文档。

例如:

yaml 复制代码
---
name: Alice
age: 30
---
name: Bob
age: 25

在这个例子中,"---"用于分隔两个不同的YAML文档。第一个文档表示一个人的信息,而第二个文档表示另一个人的信息。 在 Ansible中,YAML playbook 是一种用于定义任务的文件格式。以下是关于如何编写 Ansible playbook的基本信息,以及何时使用多个 --- 的说明。

一个简单的 Ansible playbook 通常包含以下部分:

yaml 复制代码
- name: Example Playbook
  hosts: webservers
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present

在一个 YAML 文件中,多个 --- 用于分隔不同的文档或 playbook。你可能在以下情况下需要使用多个 ---

  1. 多个 Plays :如果你的 playbook 包含多个 plays,每个 play 都可以用 --- 分隔。
yaml 复制代码
- name: First Play
  hosts: webservers
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present

- name: Second Play
  hosts: dbservers
  tasks:
    - name: Install MySQL
      apt:
        name: mysql-server
        state: present
  1. 多个文档 :如果你在同一文件中包含多个不同的文档或配置(例如,定义多个角色),可以使用 --- 来分隔它们。

使用多个 --- 可以提高 playbook 的可读性和组织性,尤其是在处理多个 plays

或配置时。每个文档可以独立处理,从而简化管理和执行过程。

1. 基本结构

  • 键值对 :YAML 的基本结构是键值对,每个键值对用冒号(:)分隔。例如:

    yaml 复制代码
    name: Alice
    age: 30
  • 缩进 :YAML 使用缩进来表示层级关系,缩进通常使用两个空格,不允许使用制表符(Tab)。例如:

    yaml 复制代码
    person:
      name: Alice
      age: 30

2. 数据类型

  • 字符串 :可以直接写字符串,也可以使用引号("')包围。引号可以用于包含特殊字符或防止解析错误。

    yaml 复制代码
    simple_string: Hello
    quoted_string: "Hello, world!"
    multiline_string: |
      This is a
      multi-line string.
  • 整数和浮点数

    yaml 复制代码
    integer: 42
    float: 3.14
  • 布尔值

    yaml 复制代码
    is_active: true
    is_deleted: false
  • 空值 :用 null~ 表示空值。

    yaml 复制代码
    empty_value: null
    another_empty_value: ~

3. 列表

  • 简单列表 :每个列表项用破折号(-)表示。

    yaml 复制代码
    fruits:
      - Apple
      - Banana
      - Orange
  • 带有值的列表项

    yaml 复制代码
    fruits:
      - name: Apple
        color: Red
      - name: Banana
        color: Yellow

4. 字典(映射)

  • 简单字典

    yaml 复制代码
    person:
      name: Alice
      age: 30
      address:
        city: New York
        zip: 10001
  • 嵌套字典

    yaml 复制代码
    employees:
      - name: Bob
        position: Developer
        contact:
          email: bob@example.com
          phone: 123-456-7890
      - name: Carol
        position: Manager

5. 注释

  • 单行注释 :用 # 开始。

    yaml 复制代码
    # This is a comment
    name: Alice  # This is an inline comment
  • 多行注释:没有正式的多行注释,但可以使用多行单行注释。

    yaml 复制代码
    # This is a comment
    # that spans multiple lines

6. 特殊语法

  • 多行字符串 :使用 | 保留换行符,使用 > 将换行符转换为空格。

    yaml 复制代码
    multi_line_literal: |
      This is a string
      with line breaks.
    
    folded_style: >
      This is a string
      that folds into a single line.
  • 锚点和别名 :使用 & 定义锚点,使用 * 引用别名。

    yaml 复制代码
    defaults: &defaults
      color: blue
      size: medium
    
    item1:
      <<: *defaults
      name: Item 1
    
    item2:
      <<: *defaults
      name: Item 2
  • 合并映射 :使用 <<: 合并映射。

    yaml 复制代码
    base: &base
      name: Default
      status: active
    
    custom:
      <<: *base
      name: Custom

7. YAML中字典和带有值的列表项有什么区别?

在 YAML 中,字典是由键值对组成的结构,使用冒号来分隔,例如 key: value,可以表达层次关系和属性。带有值的列表项则是通过短横线表示的元素集合,如:

yaml 复制代码
- item1
- item2

字典适合表示关联数据,而列表用于有序的元素集合。简单来说,字典强调键的映射关系,列表强调顺序。

这些是 YAML 文件的基本语法规则。YAML 的语法很直观,易于阅读和编写,但需要注意缩进和语法的准确性。

4、Ansible编写yaml格式的Playbook的语法

编写 Ansible Playbook 是自动化系统管理和配置的一种方式。Playbook 是一种 YAML 文件,用于定义在目标主机上执行的任务。以下是详细编写 Ansible Playbook 的步骤和示例:

1. 安装 Ansible

确保你已经安装了 Ansible。在大多数系统上,你可以通过以下命令进行安装:

bash 复制代码
# Debian系列:
pip install ansible

# RedHat系列:
yum install ansible

2. 基本结构

一个基本的 Playbook 结构如下:

yaml 复制代码
- name: 这个 Playbook 的名称
  hosts: 主机组
  become: 是否需要提权(默认是 False)
  tasks:
    - name: 任务名称
      module_name:
        参数: 值

3. 创建一个 Playbook 示例

下面是一个简单的示例 Playbook,该 Playbook 将在指定的主机上安装 Nginx 并启动它。

yaml 复制代码
- name: 安装并启动 Nginx
  hosts: web_servers
  become: yes
  tasks:
    - name: 安装 Nginx
      apt:
        name: nginx
        state: present

    - name: 启动 Nginx 服务
      service:
        name: nginx
        state: started
        enabled: yes

4. 详细讲解

a. name

每个 Playbook任务 都应该有一个 name,用于描述其作用。

yaml 复制代码
- name: 安装并启动 Nginx
b. hosts

指定目标主机组。这些主机组通常在 inventory 文件中定义。可以指定一个或多个主机组。

yaml 复制代码
hosts: web_servers
c. become

指示是否需要使用 sudo 权限执行任务。默认为 false,可以设置为 yes 以启用。

yaml 复制代码
become: yes
d. tasks

包含一系列任务,每个任务都执行特定的操作。

yaml 复制代码
tasks:
  - name: 安装 Nginx
    apt:
      name: nginx
      state: present
e. module_name

Ansible 的模块是执行具体任务的工具。例如 apt 模块用于管理 Debian 系列系统上的软件包。

f. 参数和选项

不同的模块有不同的参数。例如,在 apt 模块中,name 指定要安装的软件包,state 定义软件包的状态(如 present 表示安装,absent 表示删除)。

5. 运行 Playbook

要执行 Playbook,使用 ansible-playbook 命令:

bash 复制代码
ansible-playbook playbook.yml

6. 进阶功能

6-a. 变量

可以在 Playbook 中定义变量,也可以在 vars 文件中定义。示例如下:

yaml 复制代码
- name: 安装软件包
  hosts: all
  vars:
    package_name: nginx
  tasks:
    - name: 安装 Nginx
      apt:
        name: "{{ package_name }}"
        state: present

注:这里的"{{"是什么意思?以及它引发的一些知识

一、

在许多模板引擎和配置文件中,双花括号 {``{}} 用来表示变量的占位符。具体到你提到的上下文中,这通常出现在 YAML文件中,尤其是在使用 Ansible 这样的自动化工具时。

1、在 Ansible 中

在 Ansible 的 playbooks 或 roles 中,双花括号 {``{}} 用于引用变量。这些变量可以是:

  • 直接在 playbook 中定义的变量。
  • vars 文件或字典中定义的变量。
  • 从外部文件或环境变量中读取的变量。
  • 从 Ansible 的事实(facts)模块获取的系统信息。

2、作用

  • 动态替换:Ansible 在执行任务时会替换这些占位符为变量的实际值。
  • 灵活性:允许在不修改任务定义的情况下,通过改变变量的值来改变任务的行为。

3、示例

假设你有一个 Ansible playbook,其中定义了一个变量并使用它来安装软件包:

yaml 复制代码
- hosts: all
  vars:
    package_name: nginx
  tasks:
    - name: Install package
      apt:
        name: "{{ package_name }}"
        state: present

在这个例子中:

  • package_name 是一个变量,其值被设置为 nginx
  • apt 模块中,{``{ package_name }} 会被替换为 nginx,因此 Ansible 会安装 nginx 包。

4、总结

双花括号 {``{}} 在 Ansible

和其他一些模板系统中用于标记变量,使得配置文件和任务定义更加灵活和动态。这种机制允许用户通过改变变量的值来重用和调整配置,而无需每次都手动编辑文件。

二、

"模板引擎"和"模板系统"是编程和网页设计中常见的概念,它们用于生成动态内容。以下是它们的详细解释:

-----模板引擎(Template Engine)

  1. 定义: 模板引擎是一种工具或库,用于将模板文件(通常包含静态标记和占位符)与数据模型结合起来,生成最终的输出文件(如 HTML、XML、PDF 等)。

  2. 工作原理

    • 模板文件:包含预定义的标记和占位符,用于指示数据插入的位置。
    • 数据模型:包含要插入到模板中的数据。
    • 渲染过程:模板引擎读取模板文件,将数据模型中的数据替换模板中的占位符,生成最终的输出文件。
  3. 优点

    • 分离关注点:将内容(HTML、XML 等)与逻辑(数据和业务逻辑)分离,提高代码的可维护性和可读性。
    • 重用性:模板文件可以被重复使用,只需更改数据模型即可生成不同的输出。
    • 灵活性:支持各种编程语言和框架,可以根据需要选择适合的模板引擎。

------模板系统(Template System)

  1. 定义: 模板系统是一套规则和工具,用于定义和处理模板文件。它通常包括模板语法、模板文件格式和模板引擎。

  2. 组成部分

    • 模板语法:定义了如何在模板文件中表示占位符、条件语句、循环等。
    • 模板文件:遵循模板语法的文件,用于生成最终的输出文件。
    • 模板引擎:解析模板文件和数据模型,生成最终的输出文件。
  3. 应用场景

    • Web 开发:生成动态网页,如用户界面、表单、报告等。
    • 文档生成:生成格式化的文档,如 PDF、Word 等。
    • 邮件系统:生成个性化的电子邮件模板。

-----总结

  • 模板引擎:是实现模板系统的一个组件,负责将模板文件和数据模型结合起来生成最终的输出文件。
  • 模板系统:是一套完整的规则和工具,包括模板语法、模板文件和模板引擎,用于定义和处理模板文件。

在实际应用中,模板引擎和模板系统通常紧密相关,模板引擎是实现模板系统的核心部分。通过使用模板系统,开发者可以更高效地生成和管理动态内容。

三、

模板引擎和模板系统是编程中用来生成文本输出(通常是HTML)的工具,它们允许开发者将数据和视图分离,提高代码的可维护性和可重用性。以下是一些常见的模板引擎和模板系统:

  1. Jinja2

    • 语言:Python
    • 用途:广泛用于Web应用开发,是Flask和Django等框架的默认模板引擎。
    • 特点:提供了丰富的模板继承功能,可以方便地构建复杂的页面布局。
  2. Handlebars.js

    • 语言:JavaScript
    • 用途:常用于前端开发,支持在浏览器端渲染。
    • 特点:提供了强大的表达式处理能力和易于理解的语法。
  3. Mustache

    • 语言:多种语言(最初为Ruby)
    • 用途:轻量级的模板系统,适用于多种编程语言。
    • 特点:简单易用,遵循逻辑最小化的原则。
  4. EJS

    • 语言:JavaScript
    • 用途:常用于Node.js环境中的Web应用。
    • 特点:语法类似于JavaScript,易于学习。
  5. Liquid

    • 语言:Ruby
    • 用途:最初为Shopify开发,用于Web应用的模板渲染。
    • 特点:安全,适合电子商务网站,因为它限制了模板中可执行的代码。
  6. Twig

    • 语言:PHP
    • 用途:常用于Symfony框架中,用于生成HTML。
    • 特点:提供了丰富的模板继承和宏功能。
  7. Smarty

    • 语言:PHP
    • 用途:用于PHP Web应用的模板渲染。
    • 特点:提供了丰富的模板控制结构和变量修饰符。
  8. Thymeleaf

    • 语言:Java
    • 用途:用于Java Web应用的模板渲染。
    • 特点:支持HTML、XML、JavaScript、CSS,甚至纯文本的模板。
  9. Razor

    • 语言:C#
    • 用途:用于ASP.NET MVC和ASP.NET Core MVC的服务器端模板引擎。
    • 特点:允许在HTML中嵌入C#代码,支持强类型和编译时检查。
  10. Vue.js

    • 语言:JavaScript
    • 用途:前端框架,也提供了模板系统。
    • 特点:响应式数据绑定,易于构建单页面应用(SPA)。
  11. 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 的一些关键特点:

  1. 模板系统 :Ansible 支持使用 Jinja2 模板引擎 来生成配置文件和其他文本文件。你可以定义模板,并在运行时插入变量来生成定制化的输出。

  2. 配置管理:Ansible 可以用来自动化配置管理任务,确保服务器和应用程序的配置符合预期的标准。

  3. 应用部署:Ansible 可以自动化应用部署过程,从代码提交到部署到生产环境的整个过程。

  4. 任务执行:Ansible 提供了执行一次性任务的能力,比如系统更新、软件安装等。

  5. 系统编排:Ansible 可以用来协调多个系统和应用程序的部署和配置,实现复杂的自动化流程。

  6. 无代理:Ansible 的一大特点是无需在目标机器上安装代理或客户端软件,它通过 SSH 或 Windows Remote Management (WinRM) 来管理远程系统。

  7. 模块化:Ansible 提供了大量的模块(modules),用于执行各种自动化任务,如文件操作、服务管理、包管理等。

  8. 可扩展性:Ansible 允许用户编写自定义模块和插件来扩展其功能。

总的来说,Ansible 是一个全面的自动化平台,模板只是其众多功能中的一个组成部分。

六、

Ansible 使用的模板系统是 Jinja2。Jinja2 是一个功能强大的模板引擎,它支持变量替换、表达式计算、逻辑控制结构(如 if条件判断和 for 循环)以及丰富的过滤器和测试功能。在 Ansible 中,Jinja2模板主要用于处理模板文件,使得在配置文件中可以使用动态数据。

在 Ansible 的 playbooks 或任务中,经常需要使用 template模块来处理模板文件。这个模块允许你定义一个源文件,这个文件包含了 Jinja2 模板语法,然后 Ansible

会将这个模板渲染成最终的配置文件,并将其传输到目标主机上。

例如,如果你有一个名为 my_template.j2 的模板文件,你可以在 Ansible playbook 中这样使用它:

yaml 复制代码
- name: 使用模板
  template:
    src: my_template.j2
    dest: /path/to/destination/file

在这个模板文件中,你可以使用 Jinja2 的语法来插入变量和表达式,例如:

jinja 复制代码
# 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 }} 来输出变量值。例如:

jinja 复制代码
Hello, {{ name }}!

2. 控制结构

  • 条件语句
jinja 复制代码
{% if condition %}
    {{ true_case }}
{% else %}
    {{ false_case }}
{% endif %}
  • 循环
jinja 复制代码
{% for item in items %}
    {{ item }}
{% endfor %}

3. 过滤器

使用过滤器可以对变量进行格式化处理,语法为 {``{ variable | filter }}

jinja 复制代码
{{ name | upper }}  {# 将 name 转换为大写 #}

4. 宏

宏允许你定义可重用的模板片段。

jinja 复制代码
{% macro my_macro(arg1, arg2) %}
    <p>{{ arg1 }} and {{ arg2 }}</p>
{% endmacro %}

5. 注释

使用 {# ... #} 来添加注释,这些内容不会出现在最终渲染的输出中。

jinja 复制代码
{# This is a comment #}

6. 继承

模板继承允许你基于一个基础模板创建多个子模板。

jinja 复制代码
{% extends "base.html" %}

{% block content %}
    <h1>Hello, {{ name }}!</h1>
{% endblock %}

7. 容器

可以使用列表、字典等容器类型。

jinja 复制代码
{% for key, value in my_dict.items() %}
    {{ key }}: {{ value }}
{% endfor %}

8. 自定义过滤器和测试

可以自定义过滤器和测试,以扩展模板的功能。

9. 自动转义

Jinja2 默认会对输出进行自动转义,确保安全性。

总结

Jinja2 提供了灵活的语法来构建动态内容,结合控制结构、过滤器、宏和模板继承,使得模板的管理和重用变得简单高效。你可以根据需要深入学习更多高级特性。

6-b. 条件

可以基于条件执行任务。例如:

yaml 复制代码
- name: 安装 Nginx
  apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"
6-c. 处理

定义错误处理和清理任务。例如:

yaml 复制代码
tasks:
  - name: 安装 Nginx
    apt:
      name: nginx
      state: present
    ignore_errors: yes

  - name: 任务完成
    debug:
      msg: "Nginx 已安装或发生错误"
6-d. 角色

使用角色来组织 Playbook。角色允许你将任务、变量、文件等结构化地分组。

yaml 复制代码
- hosts: web_servers
  roles:
    - nginx

roles/nginx/tasks/main.yml 文件中定义具体的任务。

7. 文档和帮助

你可以通过以下命令获取有关模块和功能的更多帮助:

bash 复制代码
ansible-doc <module_name>

编写 Playbook 是一个迭代过程,你可以根据实际需求逐步扩展和调整。希望这些说明能帮助你编写出符合需求的 Playbook。

5、测试编写简单的Playbook

1)编写Playbook文件

bash 复制代码
vim /root/testPlaybook.yaml

注:

在 Ansible 中,.yml 和 .yaml 文件后缀名没有实际执行上的区别。两者都被 Ansible 视为 YAML 文件,并且可以用来编写 Playbook 和配置文件。选择哪种后缀主要取决于个人或团队的偏好。 YAML(YAML Ain't Markup Language)标准允许使用这两种扩展名,所以可以根据自己的习惯来使用。

yaml 复制代码
---
- name: The playbook to install http service on web servers
  hosts: web_servers
  become: no  
  tasks:
    - name: To Install http server
      yum:
        name: httpd
        state: present
- name: The playbook to install mariadb client on web servers
  hosts: web_servers
  become: no
  tasks:
    - name: To Install mariadb
	  yum:
	    name: mariadb
	    state: present

2)执行playbook

bash 复制代码
ansible-playbook /root/testPlaybook.yaml
bash 复制代码
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的服务器上执行一系列任务的过程。下面是对日志中关键部分的解释:

  1. PLAY web_servers 这表示一个Ansible playbook的开始,目标是名为web_servers的一组服务器。

  2. TASK Gathering Facts Ansible开始收集目标服务器的事实信息(如操作系统版本、网络配置等),以便后续任务可以利用这些信息。所有服务器(web02, 172.16.1.8, 172.16.1.7, web01)都成功完成了这一步。

  3. TASK To Install http server 这个任务的目标是在所有服务器上安装HTTP服务器软件。172.16.1.8web02成功安装,web01的状态是changed,意味着在该服务器上进行了某些更改(可能是更新了现有软件)。然而,172.16.1.7失败了,错误信息是"Failure talking to yum: list index out of range",这通常意味着在与YUM(Yellowdog Updater Modified,一个用于管理Red Hat及其衍生版Linux发行版软件包的命令行工具)通信时出现了问题。

  4. TASK To Install mariadb-client 这个任务的目标是在所有服务器上安装MariaDB客户端。但是,所有服务器都失败了,错误信息是"No package matching 'mariadb-client' found available, installed or updated",这意味着在尝试安装MariaDB客户端时,没有找到匹配的软件包。

  5. 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客户端软件包的缺失。

报错配置解析:

yaml 复制代码
---
- name: The playbook to install httpd on web servers
  hosts: web_servers
  become: no
  tasks:
    - name: the task1 to install httpd
      yum:
        name: httpd
        state: present
---
- name: The playbook to install mariadb client on webservers
  hosts: web_servers
  become: no
  tasks:
    - name: the task1 to install mariadb client
      yum:
        name: mariadb
        state: present

yaml 复制代码
---
- name: The playbook to install httpd on web servers
  hosts: web_servers
  become: no
  tasks:
    - name: The task1 for installing httpd
      yum:
        name: httpd
        state: present
- name: The playbook to install mariadb client on web servers
  hosts: web_servers
  become: no
  tasks:
    - name: The task1 for installing mariadb
      yum:
        name: mariadb
        state: 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 decoded

Syntax Error while loading YAML.
  but found another document

The 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格式。具体的错误信息如下:

  1. JSON错误 :提示"没有能够解码的JSON对象"。这意味着文件中的内容不符合JSON格式的要求,可能是因为缺少大括号{}来定义一个对象,或者存在其他语法错误。

  2. YAML错误 :提示"在加载YAML时发现语法错误。找到了另一个文档"。这通常意味着YAML文件的格式不正确。**YAML文件应该以---开始和结束,用于定义文档的开始和结束。**错误信息指出问题可能出现在文件/root/web_test/test.yaml的第9行,第1列,但实际的错误位置可能根据具体的语法问题而有所不同。

  3. 具体错误行 :错误指向的行是state: present,后面跟着---。这表明可能的问题是YAML文件中在state: present这一行后面直接跟了一个---,这不符合YAML的格式要求。在YAML中,---通常用来分隔不同的文档,如果它出现在一个文档的中间,而不是结尾,就会导致解析错误。

综上所述,为了解决这个问题,需要检查并修正/root/web_test/test.yaml文件中的JSON和YAML格式错误,确保其符合相应的语法规则。

正确配置:

yaml 复制代码
---
- name: The playbook to install httpd on web servers
  hosts: web_servers
  become: no
  tasks:
    - name: the task1 to install httpd
      yum:
        name: httpd
        state: present

- name: The playbook to install mariadb client on webservers
  hosts: web_servers
  become: no
  tasks:
    - name: the task1 to install mariadb client
      yum:
        name: mariadb
        state: present

正确执行效果:

二、小项目------完全使用Ansible-Playbook部署多台服务器的服务

需求

两台Web服务器部署同一Web应用WeCenter,且两台服务器的用户上传的数据目录挂载到共享存储服务器中,总数据保存在一台数据库服务器中

使用sersync简单实现两台共享存储服务器之间的Web应用共享数据目录的数据同步

每天定时将两台Web服务器的WeCenter的相关目录打包备份到备份服务器的对应的备份目录中

**注:**不做数据库服务器的备份以及数据库服务器的高可用;不使用负载均衡服务器;共享存储服务器也不做高可用,仅实现其共享目录的数据同步

编写playbook

思路

0、编写主机清单

注:

ini 复制代码
[rsync:children]
web_servers
backup_servers
nfs_servers

1、创建统一用户

2、Web应用的部署,先m01上配置完成并测试启动,然后再推送到各个Web服务器中

To Do ?????????????????

相关推荐
SelectDB14 小时前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
大树886 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠6 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质6 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工6 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智6 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_6 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉6 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造