Ansible——Playbook基本功能

news2024/12/24 2:24:13

文章目录

  • 一、Ansible Playbook介绍
    • 1、Playbook的简单组成
      • 1)“play”
      • 2)“task”
      • 3)“playbook”
    • 2、Playbook与ad-hoc简单对比
      • 区别
      • 联系
    • 3、YAML文件语法:
      • 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 ?????????????????

一、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 格式编写,结构化清晰。
    • 用途:适合需要多个步骤和条件的复杂操作,如配置管理和应用部署。
    • 示例
      - 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文件中尤其重要,用于区分不同的文档。每个文档都以“—”开头,以便解析器能够识别和分隔这些文档。

例如:

---
name: Alice
age: 30
---
name: Bob
age: 25

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

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

- name: Example Playbook
  hosts: webservers
  tasks:
    - name: Install Nginx
      apt:
        name: nginx
        state: present

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

  1. 多个 Plays:如果你的 playbook 包含多个 plays,每个 play 都可以用 --- 分隔。
- 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 的基本结构是键值对,每个键值对用冒号(:)分隔。例如:

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

    person:
      name: Alice
      age: 30
    

2. 数据类型

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

    simple_string: Hello
    quoted_string: "Hello, world!"
    multiline_string: |
      This is a
      multi-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: Apple
        color: Red
      - name: Banana
        color: Yellow
    

4. 字典(映射)

  • 简单字典

    person:
      name: Alice
      age: 30
      address:
        city: New York
        zip: 10001
    
  • 嵌套字典

    employees:
      - name: Bob
        position: Developer
        contact:
          email: bob@example.com
          phone: 123-456-7890
      - name: Carol
        position: 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 string
      with line breaks.
    
    folded_style: >
      This is a string
      that folds into a single line.
    
  • 锚点和别名:使用 & 定义锚点,使用 * 引用别名。

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

    base: &base
      name: Default
      status: active
    
    custom:
      <<: *base
      name: Custom
    

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

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

- item1
- item2

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

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

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

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

1. 安装 Ansible

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

# Debian系列:
pip install ansible

# RedHat系列:
yum install ansible

2. 基本结构

一个基本的 Playbook 结构如下:

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

3. 创建一个 Playbook 示例

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

- 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,用于描述其作用。

- name: 安装并启动 Nginx
b. hosts

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

hosts: web_servers
c. become

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

become: yes
d. tasks

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

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 命令:

ansible-playbook playbook.yml

6. 进阶功能

6-a. 变量

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

- 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,其中定义了一个变量并使用它来安装软件包:

- 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 中这样使用它:

- name: 使用模板
  template:
    src: my_template.j2
    dest: /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: 安装 Nginx
  apt:
    name: nginx
    state: present
  when: ansible_os_family == "Debian"
6-c. 处理

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

tasks:
  - name: 安装 Nginx
    apt:
      name: nginx
      state: present
    ignore_errors: yes

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

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

- hosts: web_servers
  roles:
    - 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 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

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的服务器上执行一系列任务的过程。下面是对日志中关键部分的解释:

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

在这里插入图片描述

报错配置解析:

---
- 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

---
- 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格式错误,确保其符合相应的语法规则。

正确配置:

---
- 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、编写主机清单
注:

[rsync:children]
web_servers
backup_servers
nfs_servers

1、创建统一用户

2、Web应用的部署,先m01上配置完成并测试启动,然后再推送到各个Web服务器中
在这里插入图片描述

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2145040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CSS概览

概述 是什么 cascading style css 层叠样式表 由W3C制定的网页元素定义规则 为什么 美化 怎么办 设置样式 布局 css 引入 内部样式表 在head标签内部使用style标签 <html><head><style>.id{width: 400px;height: 400px;border: 1px solid black;ma…

2-98 基于matlab的苹果特征检测

基于matlab的苹果特征检测&#xff0c;苹果面积&#xff1a;利用函数bwarea计算白色区域的像素点的个数total。利用total与整幅图片的像素值&#xff08;x*y&#xff09;之比,再与图片的面积相乘,得出苹果面积&#xff1b;缺陷检测&#xff1a;提取出坏损部位的轮廓&#xff0c…

[Golang] Context

[Golang] Context 文章目录 [Golang] Context什么是context创建context创建根context创建context context的作用并发控制context.WithCancelcontext.WithDeadlinecontext.WithTimeoutcontext.WithValue 什么是context Golang在1.7版本中引入了一个标准库的接口context&#xf…

新手学习Python第十一天,准备今天全部学完系列

——早上07&#xff1a;30到达实验室&#xff0c;开始学习&#xff0c;中秋小长假已过&#xff0c;心已收—— 一、__new__与__init__创建对象的过程 class Person(object):def __new__(cls,*args,**kwargs): *表示位置参数&#xff0c;**表示关键字参数print(__new__被调用…

管道缺陷检测系统源码分享

管道缺陷检测检测系统源码分享 [一条龙教学YOLOV8标注好的数据集一键训练_70全套改进创新点发刊_Web前端展示] 1.研究背景与意义 项目参考AAAI Association for the Advancement of Artificial Intelligence 项目来源AACV Association for the Advancement of Computer Vis…

【鸿蒙 HarmonyOS NEXT】组件嵌套滚动:nestedScroll

✨本人自己开发的开源项目&#xff1a;土拨鼠充电系统 ✨踩坑不易&#xff0c;还希望各位大佬支持一下&#xff0c;在GitHub给我点个 Start ⭐⭐&#x1f44d;&#x1f44d; ✍GitHub开源项目地址&#x1f449;&#xff1a;https://github.com/cheinlu/groundhog-charging-syst…

Java SE基础知识详解:源于技术书籍的深度解读

写在前面 ⭐️在无数次的复习巩固中&#xff0c;我逐渐意识到一个问题&#xff1a;面对同样的面试题目&#xff0c;不同的资料来源往往给出了五花八门的解释&#xff0c;这不仅增加了学习的难度&#xff0c;还容易导致概念上的混淆。特别是当这些信息来自不同博主的文章或是视…

Day02Day03

1. 为什么拦截器不会去拦截/admin/login上&#xff0c;是因为在SpringMvc中清除了这种可能。 2.使用自己定义注解&#xff0c;实现AOP&#xff08;insert ,update&#xff09; 3.使用update最好使用动态语句&#xff0c;可以使用多次 4.使用阿里云的OSS存储。用common类 5.在写…

Python 课程16-Pygame

前言 Pygame 是一个基于 Python 的游戏开发库&#xff0c;专门用于多媒体应用程序开发&#xff0c;特别是 2D 游戏。它提供了处理图像、声音、键盘、鼠标等交互功能的 API&#xff0c;并且能够与 OpenGL 集成&#xff0c;用于更复杂的图形操作。Pygame 是初学者和业余开发者学…

erlang学习:mnesia数据库与ets表1

Mnesia 和 ETS 都是 Erlang 提供的表管理工具&#xff0c;用于存储和检索数据&#xff0c;但它们之间有一些重要的区别和共同点。 共同点 都是Erlang提供的表存储机制&#xff1a;ETS 和 Mnesia 都允许你在内存中创建表&#xff0c;并且可以用来存储键值对或者更复杂的数据结…

实战16-RVP定义完成适配

新增文件 //设计搞总宽度 const DRAFT_WIDTH 360//将元素的设计搞大小转化为真机中的大小 export default function rvp(val: number) {/*计算元素真正的大小&#xff1b;* 元素在设计稿的大小 / 设计搞总宽度 x / 真机宽度 (保证元素在不同设备占比相同)x 元素在设计稿的大…

论文不会写?分享6款AI论文写作免费一键生成网站!

在当今学术研究和写作领域&#xff0c;AI论文写作工具的出现极大地提高了写作效率和质量。这些工具不仅能够帮助研究人员快速生成论文草稿&#xff0c;还能进行内容优化、查重和排版等操作。本文将分享6款免费一键生成AI论文写作网站&#xff0c;并重点推荐千笔-AIPassPaper。 …

uniapp富文本editor输入二次扩展兼容微信小程序

在uni-app中开发富文本输入功能&#xff0c;并使其兼容微信小程序&#xff0c;需要注意一些特定的限制和解决方案。由于微信小程序本身对HTML的支持有限&#xff0c;直接在小程序中实现像Web那样完整的富文本编辑功能&#xff08;如使用CKEditor、Quill等&#xff09;是不可能的…

算法笔记/USACO Guide GOLD金组DP 3. Paths on Grids

今天学习背包DP&#xff08;Knapsack DP) 是USACO Guide的DP章节中第三点 What is grid DP? -Summary DP problems often involve a 2D grid where paths are analyzed. Movement is restricted to one direction on the x-axis and y-axis, typically starting from one c…

AI修手有救了?在comfyui中使用Flux模型实现局部重绘案例

&#x1f431;‍&#x1f409;背景 局部重绘相关的话题我们已经讨论和测试过很多次了&#xff0c;比如说inpaint模型、brushnet模型、powerpaint模型等等&#xff0c;最近对于flux模型重绘画面的案例也越来越多了&#xff0c;那我们就结合flux模型的重绘来试试看效果。 &…

体验几款AI论文写作工具后,我认为这个最值得尝试!

开学随之而来的论文写作肯定又让你头疼了吧&#xff0c;而现如今随着AI技术的飞快发展&#xff0c;许多人巧妙地借助AI论文辅助工具&#xff0c;迅速搭建起论文的基本框架&#xff0c;然后一键生成万字正文内容&#xff0c;准确获得大量文献引用&#xff0c;使得整个论文创作过…

[深度学习]Pytorch框架

1 深度学习简介 应用领域&#xff1a;语音交互、文本处理、计算机视觉、深度学习、人机交互、知识图谱、分析处理、问题求解 2 发展历史 1956年人工智能元年2016年国内开始关注深度学习2017年出现Transformer框架2018年Bert和GPT出现2022年&#xff0c;chatGPT出现&#xff0…

基于python+django+vue的美术馆预约系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、SSM项目源码 系统展示 【2025最新】基于协同过滤pythondjangovue…

WSL中使用AMBER GPU串行版

前提是已经安装过wsl 1 在 WSL 2 中启用 NVIDIA CUDA 参考在 WSL 2 上启用 NVIDIA CUDA | Microsoft Learn 注意&#xff1a;勿在 WSL 中安装任何 Linux 显示驱动程序。Windows 显示驱动程序将同时安装本机 Windows 和 WSL 支持的常规驱动程序组件。 2 在WSL2中配置Cuda 不安…

SEO之页面优化(一-页面标题2)

初创企业搭建网站的朋友看1号文章&#xff1b;想学习云计算&#xff0c;怎么入门看2号文章谢谢支持&#xff1a; 1、我给不会敲代码又想搭建网站的人建议 2、“新手上云”能够为你开启探索云世界的第一步 博客&#xff1a;阿幸SEO~探索搜索排名之道 &#xff08;接上一篇。。…