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

金钱(警告)

状态: 被贬值

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

原因: Ubuntu 12.04 已於 2017 年 4 月 28 日到達終止期 (EOL) 並不再收到安全性修補或更新。

相反,请参阅: 此指南可能仍然有用作为参考,但可能不会在其他Ubuntu版本上工作. 如果可用,我们强烈建议使用为您正在使用的Ubuntu版本编写的指南。

介绍


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

在之前的指南中,我们讨论了 如何安装 Ansible 软件并学习基本命令

我们将假设你有一个配置的 Ansible 服务器和几个客户端,正如我们在最后的教程中所留下的那样。在我们的指南中,服务器是 Ubuntu 12.04 机器,我们将配置的客户端也是 Ubuntu 12.04 机器,以便解释。

问:什么是 Ansible Playbooks?


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

Ansible 播放簿是以 YAML 数据序列化格式编写的. 如果你不知道数据序列化格式是什么,那么想想它是将一个编程数据结构(列表,阵列,字典等)转换成可以轻松存储在磁盘上的格式。

每个播放本包含一个或多个播放,其中地图主持到某个特定的函数。

探索一个基本的游戏书


让我们来看看一个基本的游戏:

 1---
 2- hosts: droplets
 3  tasks:
 4    - name: Installs nginx web server
 5      apt: pkg=nginx state=installed update_cache=true
 6      notify:
 7        - start nginx
 8
 9  handlers:
10    - name: start nginx
11      service: name=nginx state=started

让我们把它分成部分,以便我们可以理解这些文件是如何构建的,每个部分意味着什么。

檔案始於:

1---

YAML允许多个文档存在于一个文件中,每个文件分别为---,但Ansible只需要一个文件,所以这只应该存在于文件的顶部。

YAML对白色空间非常敏感,并使用它来将不同的信息组合在一起. 您应该只使用空间而不是卡,并且您必须使用一致的间隔,以便您的文件正确阅读。

-开头的项目被认为是列表项目. 具有关键:值格式的项目作为哈希或字典。

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

在第二条线上,我们有这个:

1---
2- hosts: droplets

这是YAML中的一个列表项目,正如我们上面所学到的,但由于它位于左边的水平,它也是一个Ansible播放。播放基本上是对某些主机执行的任务组,以使他们能够完成你想要分配给它们的功能。

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

1---
2- hosts: droplets
3  tasks:
4    - name: Installs nginx web server
5      apt: pkg=nginx state=installed update_cache=true
6      notify:
7        - start nginx

在顶级层面,我们有),其中包含关键值对。

第一个,名字,更像是一个描述而不是一个名字,你可以称之为任何你想要的。

下一个密钥是apt。这是一种参考 Ansible 模块,就像我们使用 ansible 命令并输入类似的东西一样:

1ansible -m apt -a 'whatever' all

该模块允许我们指定一个包和它应该处于的状态,在我们的情况下是)。

通知项目包含一个名为start nginx的列表,这不是一个内部的 Ansible 命令,它是指一个处理器,当它从任务中调用时可以执行某些功能。

 1---
 2- hosts: droplets
 3  tasks:
 4    - name: Installs nginx web server
 5      apt: pkg=nginx state=installed update_cache=true
 6      notify:
 7        - start nginx
 8
 9  handlers:
10    - name: start nginx
11      service: name=nginx state=started

处理者部分存在于主机任务的同一层面,处理者类似于任务,但只有在任务告诉他们客户端系统发生了更改时才会运行。

例如,我们在这里有一个处理器,在安装包后启动 Nginx 服务. 处理器不会被调用,除非安装 nginx 网页服务器任务导致系统的更改,这意味着该包必须安装,并且已经不在那里。

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

只是为了某些背景,如果你在JSON中写这个相同的文件,它可能会看起来像这样:

 1[
 2    {
 3        "hosts": "droplets",
 4        "tasks": [
 5            {
 6                "name": "Installs nginx web server",
 7                "apt": "pkg=nginx state=installed update_cache=true",
 8                "notify": [
 9                    "start nginx"
10                ]
11            }
12        ],
13        "handlers": [
14            {
15                "name": "start nginx",
16                "service": "name=nginx state=started"
17            }
18        ]
19    }
20]

正如你所看到的,YAML 更紧凑,大多数人会说它更易于阅读。

运行一个可靠的播放书


一旦你已经建立了一个播放簿,你可以使用这个格式轻松地调用它:

ansible-playbook playbook.yml

例如,如果我们想在所有滴子上安装并启动 Nginx,我们可以发出以下命令:

1ansible-playbook nginx.yml

由于播放簿本身规定了它应该对抗的主机(即我们在上一本教程中创建的),我们不需要指定一个主机来对抗。

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

ansible-playbook -l host_subset playbook.yml

因此,如果我们只想在我们的主机3上安装和运行 Nginx,我们可以输入以下内容:

1ansible-playbook -l host3 nginx.yml

将功能添加到 Playbook


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

 1---
 2- hosts: droplets
 3  tasks:
 4    - name: Installs nginx web server
 5      apt: pkg=nginx state=installed update_cache=true
 6      notify:
 7        - start nginx
 8
 9  handlers:
10    - name: start nginx
11      service: name=nginx state=started

它很简单,它工作,但它所做的只是安装一个软件,并启动它。

我们可以通过将任务添加到我们的玩本开始扩展功能。

添加默认索引文件


我們可以告訴它將檔案從我們的 Ansible 伺服器傳送到主機,通過添加一些這樣的行:

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

    - name: Upload default index.html for host
      copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644

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

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

1mkdir static_files
2nano static_files/index.html

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

1<html>
2  <head>
3    <title>This is a sample page</title>
4  </head>
5  <body>
6    <h1>Here is a heading!</h1>
7    <p>Here is a regular paragraph. Wow!</p>
8  </body>
9</html>

保存并关闭文件。

现在,当我们重新运行播放簿时, Ansible 会检查每个任务. 它会看到 Nginx 已经安装在主机上,所以它会离开它。

记录结果


当您手动安装和配置服务时,几乎总是需要知道您的操作是否成功,我们可以通过使用注册将此功能煮进我们的玩本中。

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

在使用此功能时,我们还必须告诉 Ansible 忽略该任务的错误,因为如果出现任何问题,它通常会取消该主机的播放簿执行。

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

例如,我们可以告诉我们的播放簿上传一个index.php文件,如果它存在的话。如果这个任务失败了,我们可以试图上传一个index.html文件。我们会在另一个任务中检查失败状态,因为如果 PHP 文件失败,我们只想上传 HTML 文件:

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

    - name: Upload default index.php for host
      copy: src=static_files/index.php dest=/usr/share/nginx/www/ mode=0644
      register: php
      ignore_errors: True

    - name: Remove index.html for host
      command: rm /usr/share/nginx/www/index.html
      when: php|success

    - name: Upload default index.html for host
      copy: src=static_files/index.html dest=/usr/share/nginx/www/ mode=0644
      when: php|failed

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

**注:我们没有配置我们的主机处理PHP文件,所以即使您上传PHP文件,它也不会得到正确的处理。

这个新版本试图将PHP索引文件上传到主机,它将操作的成功记录在一个名为php的变量中。

如果此操作成功,则下一个执行删除 index.html 文件的任务。

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

结论


现在,您应该了解如何使用 Ansible 自动化复杂任务,这是您如何开始构建配置库的一个基本示例。

将主机和组定义相结合,正如我们在第一个教程中了解到的,并使用可用的变量来填写信息,我们可以开始将复杂的计算机系统组合在一起,相互作用。

By Justin Ellingwood
Published At
Categories with 技术
comments powered by Disqus