Ansible——Playbook基本功能???

news2024/9/19 22:50:31

文章目录

  • 一、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 ?????????????????

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

在Ansible的playbook中使用多个 --- 不是Ansible playbook的标准格式。Playbook通常是一个YAML格式的文件,它定义了一系列的plays,每个play可以包含多个tasks。在标准的playbook文件中,通常只需要在文件的最开始使用一个--- 来标识YAML文档的开始。

如果你在playbook中使用了多个 ---,Ansible会将每个 ---后面的内容视为一个新的YAML文档。如果这些文档符合Ansible playbook的格式要求,Ansible会尝试解析它们。但是,这通常不是预期的行为,因为它可能会导致结构上的混乱,使得playbook难以理解和维护。

例如,以下是一个不正确的playbook示例,它错误地使用了多个 ---

---
- hosts: webservers
  tasks:
    - name: Ensure Apache is at the latest version
      yum:
        name: httpd
        state: latest
---

- hosts: dbservers
  tasks:
    - name: Ensure MySQL is at the latest version
      yum:
        name: mysql-server
        state: latest

正确的格式应该是没有中间的 --- 分隔,如下所示:

---
- hosts: webservers
  tasks:
    - name: Ensure Apache is at the latest version
      yum:
        name: httpd
        state: latest

- hosts: dbservers
  tasks:
    - name: Ensure MySQL is at the latest version
      yum:
        name: mysql-server
        state: latest

如果你确实需要在一个文件中定义多个playbook(虽然不推荐),你应该确保每个play的定义都是连续的,没有被 ---
分隔。如果你的意图是创建多个独立的YAML文档,你应该考虑将它们拆分成不同的文件,每个文件包含一个playbook。

Ansible的配置文件和清单文件通常不需要多个"—",因为它们通常只包含一个单一的配置或主机定义列表。如果需要引入额外的配置,可以通过include指令来实现。
在Ansible中,include指令用于将一个文件的内容包含到另一个文件中。这在组织大型项目时非常有用,因为它允许你将配置分解成更小、更易于管理的部分。

使用 include 指令

要在Ansible的配置文件或清单文件中使用 include 指令,你可以按照以下步骤操作:

  1. 创建单独的配置文件:首先,你需要创建包含特定配置或主机定义的单独文件。例如,你可以创建一个名为 webservers.yml 的文件,其中包含所有Web服务器的配置。

  2. 在主文件中使用 include:在你的主配置文件或清单文件中,使用 include 指令来引入这些单独的文件。例如,如果你的主清单文件名为 site.yml,你可以这样使用 include

   # site.yml
   - hosts: all
     tasks:
       - include: tasks/common.yml
       - include: tasks/webservers.yml

在这个例子中,tasks/common.ymltasks/webservers.yml
是包含任务列表的文件,它们会被包含在 site.yml 文件中。

  1. 使用变量文件:你也可以使用 include_vars 来引入变量文件。例如:
# group_vars/all.yml
include_vars:
  - secret.yml

这里,secret.yml 文件中的变量会被包含到 all.yml 文件中。

  1. 使用 include 引入多个文件:如果你有多个文件需要引入,可以在一个列表中指定它们:
- hosts: all
  tasks:
    - include: tasks/common.yml
    - include: tasks/webservers.yml
    - include: tasks/databases.yml
  1. 使用条件:你可以在 include 指令中添加条件,以便在特定情况下才引入文件:
- hosts: all
  tasks:
    - include: tasks/special.yml
      when: inventory_hostname in groups['special']

在这个例子中,tasks/special.yml 只有在主机属于 special 组时才会被引入。

通过使用 include 指令,你可以有效地组织和重用Ansible的配置和任务,使得项目更加模块化和易于维护。

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/2147207.html

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

相关文章

搜维尔科技:Haption力反馈遥操作解决方案

硬件设备 多种力反馈设备型号&#xff1a; 1.Haption Virtuose 6D&#xff1a;能在 6 个自由度&#xff08;x、y、z 轴 3 个平移和 3 个旋转&#xff09;上提供精确的力反馈&#xff0c;工作空间相当于一条人体手臂的活动范围&#xff0c;最大力度和旋转扭矩分别高达 35N 和 …

干货:分享6款ai论文写作助手,一键生成原创论文(步骤+工具)

写一篇论文是一个复杂的过程&#xff0c;涉及多个步骤&#xff0c;包括选题、研究、撰写、编辑和校对。AI可以在其中的一些步骤中提供帮助&#xff0c;但最终的论文还是需要人类作者的深入思考和创造性输入。以下是六款值得推荐的AI论文写作助手&#xff0c;其中特别推荐千笔-A…

秃姐学AI系列之:目标检测(物体检测) + 边缘框代码实现 | 锚框 + 代码实现

目录 目标检测 边缘框 目标检测数据集 总结 代码实现 定义在两种表示之间进行转换的函数 定义图像中狗和猫的边界框 将边框在图中画出 锚框 Anchor Box IoU——交并比 赋予锚框标号 使用非极大值抑制&#xff08;NMS&#xff09;输出 总结 代码实现 锚框 IoU——交…

高并发内存池(三):CentralCache与PageCache的实现

目录 CentralCache的实现 主体框架 ​Span 页与页号 WIN32、_WIN32、_W64的区别 条件编译 SpanList 为ThreadCache分配内存结点 补充内容1 补充内容2 具体实现 从PageCache申请非空span 补充内容 具体实现 PageCache的实现 主体框架 关于整体加锁的解释 桶锁…

linux第三课(linux中安装nginx与redis及SpringBoot集成redis)

目录 一.nginx引入 二.关于nginx 1.什么是nginx 2.nginx的特点 3.在nginx中安装nginx 三.关于redis 1.背景引入 2.什么是redis 3.redis的特点 4.在linux下的docker中安装redis 四.redis中的数据结构 (1)String(字符串) (2)Hash (3)list(列表) (5)zset(sorted se…

1734. 解码异或后的排列

1. 题目 1734. 解码异或后的排列 2. 解题思路 要搞明白这个题目可以先来看下它的简化版题目&#xff1a;1720. 解码异或后的数组 [!NOTE] 题目&#xff1a; 未知 整数数组 arr 由 n 个非负整数组成。 经编码后变为长度为 n - 1 的另一个整数数组 encoded &#xff0c;其中 e…

ES6标准---【八】【学习ES6看这一篇就够了!!!】

目录 前言 export命令 输出变量 输出函数/类 export中的as别名 export必须一一对应 export接口的响应性 注意 import命令 import命令的语法 import命令里的as别名 import的只读性 import命令具有提升性 import的一些约定 import的静态执行 import的唯一执行性 模…

windows查找端口号被占用

在很多开发的时候&#xff0c;可能端口号有被占用的情况&#xff0c;导致项目打不开。 用下面这个命令即可&#xff1a; 比如我的3000端口被占用&#xff0c;我找找哪个进程在占用我的3000端口号

SVM原理

SVM 这里由于过了很长时间 博主当时因为兴趣了解了下 博主现在把以前的知识放到博客上 作为以前的学习的一个结束 这些东西来自其他资料上 小伙伴看不懂英文的自行去翻译下吧 博主就偷个懒了 多维空间和低维空间 不一样的分法&#xff0c;将数据映射到高维 &…

【电路笔记】-运算放大器比较器

运算放大器比较器 文章目录 运算放大器比较器1、概述2、表示2.1 同相比较器2.2 反相比较器3、临界点转换4、施密特触发器4.1 同相触发器4.2 反相触发器4.3 应用5、总结1、概述 在前面的大多数运算放大器文章中,电路都有一个到反相输入的反馈环路。 这种设计是最常见的,因为它…

汇总区间计算

给定一个 无重复元素 的 有序 整数数组 nums 。 返回 恰好覆盖数组中所有数字 的 最小有序 区间范围列表 。也就是说&#xff0c;nums 的每个元素都恰好被某个区间范围所覆盖&#xff0c;并且不存在属于某个范围但不属于 nums 的数字 x 。 列表中的每个区间范围 [a,b] 应该按…

感知笔记:ROS 视觉- 跟随红球

- 目录 - 如何在 ROS 中可视化 RGB 相机。如何作为机器人切换主题。如何创建 blob 检测器。如何获取要跟踪的颜色的颜色编码。如何使用 blob 检测数据并移动 RGB 相机以跟踪 blob。 机器人技术中最常见的传感器是不起眼的 RGB 摄像头。它用于从基本颜色跟踪&#xff08;blob 跟…

Vue2接入高德地图API实现搜索定位和点击获取经纬度及地址功能

目录 一、申请密钥 二、安装element-ui 三、安装高德地图依赖 四、完整代码 五、运行截图 一、申请密钥 登录高德开放平台&#xff0c;点击我的应用&#xff0c;先添加新应用&#xff0c;然后再添加Key。 如图所示填写对应的信息&#xff0c;系统就会自动生成。 二、安装…

python-奖金/贪心的小明

一&#xff1a;奖金 题目描述 企业发放的奖金根据利润提成。利润低于或等于 100000 元的&#xff0c;奖金可提 10%&#xff1b; 利润高于 100000 元&#xff0c;低于 200000 元&#xff08; 100000<I≤200000&#xff09;时&#xff0c;低于 100000 元的部分按 10% 提成&…

二叉树的链式结构和递归程序的递归流程图

二叉树的链式存储结构是指&#xff0c;用链表来表示一棵二叉树&#xff0c;即用链来指示元素的逻辑关系。 通常的方法是链表中每个结点由三个域组成&#xff0c;数据域和左右指针域&#xff0c;左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。链式结构又分…

一个基于VB的期刊信息管理系统

一个基本的期刊信息管理系统的示例&#xff0c;使用 Visual Basic (VB.NET) 编写。这个示例将展示如何创建一个简单的期刊信息管理系统&#xff0c;其中包括添加、查看、编辑和删除期刊的功能。 系统需求 添加期刊&#xff1a;允许用户输入期刊的信息&#xff08;如标题、作者…

面试官问:你如何处理与同事或上级的分歧?【无标题】

面试官问&#xff1a;你如何处理与同事或上级的分歧&#xff1f; 当面试官问你如何处理与同事或上级的分歧&#xff0c;其实面试官的目的是评估你的沟通技巧、冲突解决能力和团队合作的能力。在一起共事&#xff0c;就一定有分歧发生&#xff0c;有争执是正常的&#xff0c;关…

OpenCV 1

前言&#xff1a;开新坑辽&#xff0c;&#xff0c; 目录 计算机眼中的图像 视频的读取与处理 ROI区域 边界填充 数值计算 腐蚀操作 膨胀操作 开运算与闭运算 梯度计算 礼貌与黑帽 Sobel算子 梯度计算方法 scharr与laplacian 计算机眼中的图像 灰色图片&#xff0…

ROS第四梯:ROS项目中添加自定义类

第一步&#xff0c;ROS项目结构介绍 工作空间中包含一个名为pcl_ros_test的功能包&#xff0c;其中main.cpp是原有项目自带的&#xff0c;接下来以CommonAlg自定义类添加为例进行介绍。 第二步&#xff1a;头文件CommonAlg.h创建和编写&#xff0c;并保存在include/pcl_ros_tes…

达梦数据库导入xml迁移到达梦数据库大文件导致中断问题解决方案记录?

问题&#xff1a;我将同事给我的xml文件迁移到盗梦数据库&#xff0c;xml文件大约2G&#xff0c;在导入过程中&#xff0c;总是导入一半都不到就失败了。 原因&#xff1a;我的原因是我的电脑的系统的运行内存是16G的&#xff0c;后来我发现在没导入之前&#xff0c;其他进程已…