如何创建 Ansible Playbook 以在 Ubuntu 上自动化系统配置如何创建 Ansible Playbook 以在 Ubuntu 上自动化系统配置如何创建 Ansible Playbook 以在 Ubuntu 上自动化系统配置如何创建 Ansible Playbook 以在 Ubuntu 上自动化系统配置
  • 文章
  • 正则表达式
    • 工具
  • 登录
找到的结果: {phrase} (显示: {results_count} 共: {results_count_total})
显示: {results_count} 共: {results_count_total}

加载更多搜索结果...

搜索范围
模糊匹配
搜索标题
搜索内容
发表 admin at 2025年2月28日
类别
  • 未分类
标签

如何创建 Ansible Playbook 以在 Ubuntu 上自动化系统配置

状态:已弃用

本文涵盖不再受支持的 Ubuntu 版本。如果您目前正在运行运行 Ubuntu 12.04 的服务器,我们强烈建议您升级或迁移到受支持的 Ubuntu 版本:

  • 升级到 Ubuntu 14.04。
  • 从 Ubuntu 14.04 升级到 Ubuntu 16.04
  • 将服务器数据迁移到支持的版本

原因:

请参阅:

介绍

Ansible 是一个简单的配置管理系统,可用于自动化和组织大型计算机网络的系统配置任务。虽然其他一些配置管理系统需要在服务器和客户端系统上安装许多不同的包,但使用 Ansible,您只需要安装一个服务器组件并具有对客户端计算机的 SSH 访问权限。

在之前的指南中,我们讨论了如何安装 Ansible 软件和学习基本命令。在本指南中,我们将讨论 Ansible 剧本,这是 Ansible 创建自动化脚本来配置客户端计算机的方式。

我们将假设您有一个已配置的 Ansible 服务器和一些客户端,就像我们在上一个教程中停止的那样。在我们的指南中,服务器是 Ubuntu 12.04 机器,我们要配置的客户端也是 Ubuntu 12.04 机器,以便于解释。

什么是 Ansible 剧本?

Ansible 剧本是一种以脚本方式向远程计算机发送命令的方法。您可以通过将脚本传递到一个或多个系统来配置整个复杂环境,而不是单独使用 Ansible 命令从命令行远程配置计算机。

Ansible 剧本以 YAML 数据序列化格式编写。如果您不知道什么是数据序列化格式,请将其视为一种将编程数据结构(列表、数组、字典等)转换为可以轻松存储到磁盘的格式的方法。然后可以使用该文件在以后重新创建结构。 JSON 是另一种流行的数据序列化格式,但 YAML 更易于阅读。

每个剧本都包含一个或多个剧本,将主机映射到特定功能。 Ansible 通过称为任务的东西来做到这一点,这些任务基本上是模块调用。

探索基本剧本

让我们看一个基本的剧本:

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

  handlers:
    - name: start nginx
      service: name=nginx state=started

让我们把它分成几个部分,这样我们就可以理解这些文件是如何构建的以及每个部分的含义。

该文件以:

---

这是 YAML 将文件解释为正确文档的要求。 YAML 允许多个“文档”存在于一个文件中,每个文件由 --- 分隔,但 Ansible 只需要每个文件一个,因此它应该只出现在文件的顶部。

YAML 对空白非常敏感,并使用它来将不同的信息片段组合在一起。您应该只使用空格而不是制表符,并且必须使用一致的间距才能正确读取文件。处于同一缩进级别的项目被视为兄弟元素。

以 - 开头的项目被视为列表项。具有 key:value 格式的项目作为散列或字典运行。这几乎就是基本 YAML 的全部内容。

YAML 文档基本上定义了一个分层树结构,其中包含的元素更靠左。

在第二行,我们有这个:

---
- hosts: droplets

正如我们在上面了解到的,这是 YAML 中的一个列表项,但由于它位于最左侧,它也是一个 Ansible \play。Play 基本上是在一组特定主机上执行的任务组,以允许他们来完成你想分配给他们的功能。每个游戏都必须指定一个主机或一组主机,就像我们在这里所做的那样。

接下来,我们有一组任务:

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

在顶层,我们有与“主机:”相同级别的“任务:”。这包含一个列表(因为它以 \- 开头),其中包含键值对。

第一个,“名称”,与其说是名称,不如说是描述。您可以随意称呼它。

下一个键是 \apt。这是对 Ansible 模块的引用,就像我们使用 ansible 命令并输入如下内容一样:

ansible -m apt -a 'whatever' all

这个模块允许我们指定一个包和它应该处于的状态,在我们的例子中是“已安装”。 update-cache=true 部分告诉我们的远程机器更新它的包缓存(apt-get update) 在安装软件之前。

\notify 项包含一个列表,其中有一项称为 \start nginx。这不是内部 Ansible 命令,它是对处理程序的引用,当从任务中调用它时,它可以执行某些功能。我们将在下面定义“启动 nginx”处理程序。

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

  handlers:
    - name: start nginx
      service: name=nginx state=started

\handlers 部分与 \hosts 和 \tasks 存在于同一级别。处理程序就像任务一样,但它们仅在任务告知客户端系统发生更改时才运行。

例如,我们这里有一个处理程序,它在安装包后启动 Nginx 服务。除非“安装 nginx web 服务器”任务导致系统发生更改,否则不会调用处理程序,这意味着必须安装该软件包并且还不存在。

我们可以将这个剧本保存到一个名为“nginx.yml”的文件中。

就某些情况而言,如果您要用 JSON 编写同一个文件,它可能看起来像这样:

[
    {
        "hosts": "droplets",
        "tasks": [
            {
                "name": "Installs nginx web server",
                "apt": "pkg=nginx state=installed update_cache=true",
                "notify": [
                    "start nginx"
                ]
            }
        ],
        "handlers": [
            {
                "name": "start nginx",
                "service": "name=nginx state=started"
            }
        ]
    }
]

如您所见,YAML 更紧凑,大多数人会说更具可读性。

运行 Ansible 剧本

构建 playbook 后,您可以使用以下格式轻松调用它:

<前>

例如,如果我们想在我们所有的 Droplet 上安装和启动 Nginx,我们可以发出这个命令:

ansible-playbook nginx.yml

由于 playbook 本身指定了它应该运行的主机(即我们在上一个教程中创建的 \droplets 组),我们不必指定要运行的主机。

但是,如果我们想过滤主机列表以仅适用于其中一台主机,我们可以添加一个标志来指定文件中主机的子集:

<前>

所以如果我们只想在我们的 \host3 上安装和运行 Nginx,我们可以输入:

ansible-playbook -l host3 nginx.yml

向 Playbook 添加功能

现在我们的剧本看起来像这样:

---
- hosts: droplets
  tasks:
    - name: Installs nginx web server
      apt: pkg=nginx state=installed update_cache=true
      notify:
        - start nginx

  handlers:
    - name: start nginx
      service: name=nginx state=started

它很简单而且可以工作,但它所做的只是安装一个软件并启动它。这本身并不是很有好处。

我们可以通过向我们的剧本添加任务来开始扩展功能。

添加默认索引文件

我们可以告诉它通过添加如下几行来将文件从我们的 Ansible 服务器传输到主机上:

<前>

  • 宿主:水滴 任务:
    • 名称:安装 nginx 网络服务器 apt: pkg=nginx state=installed update_cache=true 通知:
      • 启动nginx

      - 名称:为主机上传默认的 index.html

      处理程序:

      然后,我们可以在当前目录中创建一个名为 static_files 的目录,并在其中放置一个 index.html 文件。

      mkdir static_files
      nano static_files/index.html
      

      在这个文件中,让我们创建一个基本的 html 结构:

      <html>
        <head>
          <title>This is a sample page</title>
        </head>
        <body>
          <h1>Here is a heading!</h1>
          <p>Here is a regular paragraph.  Wow!</p>
        </body>
      </html>
      

      保存并关闭文件。

      现在,当我们重新运行剧本时,Ansible 将检查每个任务。它会看到 Nginx 已经安装在主机上,所以它会保留它。它将看到新的任务部分,并将默认的 index.html 文件替换为来自我们服务器的文件。

      注册结果

      当您手动安装和配置服务时,几乎总是需要知道您的操作是否成功。我们可以使用 \register 将此功能融入我们的剧本中。

      对于每个任务,我们可以选择将其结果(失败或成功)注册到一个变量中,以便稍后检查。

      使用此功能时,我们还必须告诉 Ansible 忽略该任务的错误,因为如果发生任何问题,它通常会中止该主机的 playbook 执行。

      因此,如果我们想检查任务是否失败以决定后续步骤,我们可以使用注册功能。

      例如,我们可以告诉我们的剧本上传一个 index.php 文件(如果存在)。如果该任务失败,我们可以改为尝试上传 index.html 文件。我们将检查其他任务中的失败情况,因为我们只想在 PHP 文件失败时上传 HTML 文件:

      <前>

      • 主持人:水滴 任务:
        • 名称:安装 nginx 网络服务器 apt: pkg=nginx state=installed update_cache=true 通知:
          • 启动nginx

          - name: 上传主机的默认index.php

          - name: Remove index.html for host

          • 名称:上传主机的默认 index.html 复制:src=static_files/index.html dest=/usr/share/nginx/www/mode=0644 当:php|失败

          处理程序:

          • 名称:启动nginx 服务:name=nginx state=started

          注意:此时我们还没有配置我们的主机来处理 PHP 文件,因此即使您上传了 PHP 文件,它也不会被正确处理。

          这个新版本尝试将 PHP 索引文件上传到主机。它将操作的成功注册到一个名为 \php 的变量中。

          如果此操作成功,接下来将运行删除 index.html 文件的任务。

          如果操作失败,则上传 index.html 文件。

          结论

          现在,您应该很好地掌握了如何使用 Ansible 自动执行复杂任务。这是您如何开始构建配置库的基本示例。

          结合我们在第一个教程中学到的主机和组定义,并使用可用变量填充信息,我们可以开始将相互交互的复杂计算机系统放在一起。在以后的文章中,我们将讨论如何在我们的剧本中实施变量并创建角色来帮助管理复杂的任务。

          贾斯汀·埃林伍德

©2015-2025 艾丽卡 support@alaica.com