如何使用Ansible角色摘要您的基础架构环境

介绍

Ansible是一个易于使用的配置管理系统,可以帮助您从单个机器配置大量的服务器。 您可以自动化复杂的任务,并轻松地添加机器到您的基础设施,没有太多的麻烦。

在以前的文章中,我们讨论了如何安装和配置Ansible以及如何创建剧本自动化系统配置 在本指南中,我们将讨论如何使用Ansible角色,以允许您将配置拆分为更多的模块化
脚步。

我们将假设您在一个Ubuntu 12.04 VPS上安装了Ansible,如我们在之前的指南中演示的。 在Ansible配置中,您还需要一个或多个配置为主机的其他计算机。

什么是Ansible角色?

你已经接触到如何Ansible可配置的客户端的命令行交互与ansible命令,以及如何使用自动通过运行剧本配置ansible-playbook命令。 角色在哪里适合这个计划?

简单地说,角色是进一步的抽象层次,可以用于组织剧本。 当您为您的剧本添加越来越多的功能和灵活性时,它们可能变得难以维护,并且难以作为单个文件维护。 角色允许您创建极小的剧本,然后查找目录结构以确定其需要执行的实际配置步骤。

将事物组织成角色还允许您在不同类型的服务器之间重复使用常见的配置步骤。 这已经可以通过“包括”剧本内的其他文件来实现,但是对于角色,文件之间的这些类型的链接基于特定的目录层次结构是自动的。

一般来说,角色背后的想法是允许您定义服务器应该做什么,而不必指定使服务器以某种方式执行所需的确切步骤。

创建角色框架

为了让Ansible正确处理角色,我们需要构建一个它可以找到和理解的目录结构。 我们可以通过在Ansible的工作目录中创建一个“roles”目录来实现。

我们假设这里你已经使用你的用户的主目录作为Ansible工作目录。 你应该更改为保存您的Ansible配置的任何实际目录。

我们将创建一个名为“roles”的目录,Ansible将查找我们的角色。

cd ~
mkdir roles
cd roles

在这个目录中,我们将定义我们的角色。 我们将基本上为我们将要创建的每个角色创建一个目录。 因为我们要复制我们的Nginx剧本,让我们创建一个Nginx角色:

mkdir nginx
cd nginx

在此目录中,我们创建另一组目录,这将有助于我们分离正常剧本的不同部分。 现在创建这些目录:

mkdir files handlers meta templates tasks vars

这些是将包含实现我们的配置的所有代码的目录。 您不能使用所有目录,因此在实际操作中,您可能不需要创建所有这些目录。

这是他们的全部:

  • 文件 :这个目录包含了需要被转移到你正在配置该角色的主机常规文件。 这也可以包括要运行的脚本文件。
  • 处理 :所有的处理程序是你的剧本以前,现在可以添加到这个目录。
  • :这个目录可以包含建立角色的依赖文件。 您可以列出在当前角色可以正常工作之前必须应用的角色。
  • 模板 :您可以将使用变量的该目录中创建过程中的信息代替所有文件。
  • 任务 :这个目录包含所有这一切通常会在剧本的任务。 这些可以引用包含在各自目录中的文件和模板,而不使用路径。
  • 瓦尔 :对角色的变量可以在这个目录中指定,并在配置文件中使用。

内的所有目录,但该“文件”和“模板”,如果一个名为main.yml存在,它的内容将被自动添加到调用该角色的剧本。

将一本手册抽象为一个角色

对于许多剧本来说,将功能作为一个角色来实现是更有意义的。 我们可以把我们的Nginx手册从最后一篇文章转变为组织更好的东西的角色。

我们应该已经有roles/nginx/{subdirectories}结构从上一节设置。 现在,我们需要创建一些main.yml在我们的结构文件。

创建任务main.yml文件

我们将从tasks子目录开始。 现在移动到该目录:

cd ~/roles/nginx/tasks

现在,我们需要将复制nginx.yml文件到这个目录:

cp ~/nginx.yml main.yml

现在,我们需要编辑主文件并删除不是任务的所有内容:

nano main.yml

开始时文件应如下所示:

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

我们只想保持红色的线。 此外,我们可以去除我们任务左边的无关空间。 我们的变化,我们的新后tasks/main.yml文件将是这样的:

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

正如你所看到的,这只是识别要执行的步骤更容易阅读。

我们应该做的另外一个变化是我们如何在我们的配置中引用外部文件。 我们的src行引用“static_files”目录。 如果我们将所有静态文件放在“files”子目录中,这是不必要的。 Ansible会自动找到它们。

当我们改变这些线路,我们完成的tasks/main.yml文件看起来像这样:

---
- 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=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=index.html dest=/usr/share/nginx/www/ mode=0644
  when: php|failed

保存并在完成后关闭文件。

创建处理程序main.yml文件

现在,我们有大量的在PlayBook的tasks/main.yml文件,我们需要把处理部分转移到位于一个文件handlers/main.yml

复制nginx.yml再次文件,此时进入处理程序目录:

cd ~/roles/nginx/handlers
cp ~/nginx.yml main.yml

再次,在文本编辑器中打开文件:

nano main.yml

我们需要保留的部分是红色的:

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

删除处理程序之前的空格。 最后,文件应该看起来像这样:

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

保存并在完成后关闭文件。

完成

由于我们的原始剧本很简单,我们差不多完成了。

首先,我们需要移动index.html页(和index.php了,如果你创建了一个页面) ~/static_files目录,并把它们放到~/roles/nginx/files目录:

cp ~/static_files/* ~/roles/nginx/files

如果我们的角色的另一个角色依赖,我们可以在添加文件meta目录称为main.yml 此文件可能指定此角色依赖于称为“apt”的角色。

如果我们的角色在一个名为“易”,该文件的作用取决于~/roles/nginx/meta/main.yml可能是这样的:

---
dependencies:
  - { role: apt }

这将采用“apt”角色,并将来自该角色的信息放在我们的Nginx信息之前,以便我们的角色在启动之前具有适当的依赖性。

我们之前说过,有一个“vars”目录,可以用来为我们的角色设置变量。 虽然有可能为通过角色设置默认参数vars/main.yml文件,这通常是不推荐的,因为它使你的详细配置驻留在角色层次结构中。

通常,您希望在角色之外指定您的详细信息,以便您可以轻松地共享角色结构,而不必担心泄漏的信息。 此外,在角色中声明的变量很容易被其他位置的变量覆盖,所以它们不是很强。

现在,你可能会奇怪,为什么我们要组织我们的信息进入目录,当我们大多数目录只包含一个main.yml文件。 我们为什么不创造tasks.yml文件,而不是tasks/main.yml

答案是我们只使用最小量的文件。 main.yml文件是Ansible自动拾起的,但我们可以很容易地通过使用包括其他文件include功能。

如果我们有用于配置我们的一些主机位于SSL额外任务文件tasks/ssl.yml ,我们可以这样称呼它:

. . .
tasks:
  - include: roles/nginx/tasks/ssl.yml

创建骷髅手册

现在我们已经配置了我们的角色结构,我们可以用一个非常简单的剧本调用所有的功能。

这使我们可以使用剧本来声明服务器应该做什么,而不是必须采取什么步骤来使它表现我们想要的方式。

在整个角色结构之外,在我们的工作目录(我们的主目录在这个例子中),我们可以创建一个playbook文件。

cd ~
nano play.yml

在这个文件的内部,我们需要很少的信息。 首先,我们没有定义任何主机,所以这里。 接下来,我们只声明我们使用的角色:

---
- hosts: droplets
  roles:
    - role: nginx

保存并关闭文件。 这是我们的整个剧本。 正如你可以看到,它清理一切,让我们专注于核心功能。 如果我们配置了多个角色,我们可以简单地列出我们希望服务器做什么不同的事情。

例如,如果我们有角色设置一个WordPress服务器,我们可能有一个剧本,看起来像这样:

---
- hosts: wordpress_hosts
  roles:
    - nginx
    - php
    - mysql
    - wordpress

正如你可以看到的,这使我们能够非常简洁地说明我们想从服务器。 因为到最后,我们使用playbook调用一个角色,命令语法是完全一样的:

ansible-playbook play.yml

结论

Ansible角色是一个可选功能以利用它,但如果您计划大量使用Ansible,强烈建议您探索此功能。 它不仅将保持您的主机级配置干净和可读性,它还将允许您轻松地重复使用代码,并以模块化方式实现您的更改。

作者:Justin Ellingwood
赞(52) 打赏
未经允许不得转载:优客志 » 系统运维
分享到:

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏