配置管理 101:编写 Ansible 操作手册

简介

简而言之,服务器配置管理(通常也称为IT自动化)是一种将基础设施管理转变为代码库的解决方案,它描述了在一组可以进行版本控制和轻松重用的配置脚本中部署服务器所需的所有流程。随着时间的推移,它可以极大地提高任何服务器基础设施的完整性。

In a previous guide, we talked about the main benefits of implementing a configuration management strategy for your server infrastructure, how configuration management tools work, and what these tools typically have in common.

本系列的这一部分将带您完成使用Ansible自动配置服务器的过程,Ansible是一种配置管理工具,可提供完整的自动化框架和编排功能,同时保持极致的简单性和最小化目标。我们将重点介绍创建简化示例所需的语言术语、语法和特性,以使用Apache完全自动化Ubuntu 18.04Web服务器的部署。

以下列表包含为实现目标而需要自动执行的所有步骤:

1.更新apt缓存 2.安装阿帕奇 3.创建自定义文档根目录 4.在自定义文档根目录中放置一个index.html文件 5.应用模板来设置我们的自定义虚拟主机 6.重启阿帕奇

我们将首先了解Ansible使用的术语,然后概述可用于编写剧本的主要语言功能。在本指南的最后,您将找到一个完整的配置示例的内容,以自动执行在Ubuntu 18.04上设置Apache的步骤。

<$>[注] 注意 :本指南旨在向您介绍Ansible语言以及如何编写剧本来自动化您的服务器配置。有关Ansible的更多介绍性视图,包括安装和开始使用此工具所需的步骤,以及如何运行Ansible命令和剧本,请查看我们的如何在Ubuntu 18.04上安装和配置Ansible指南。<$>

入门

在我们开始更实际地了解Ansible之前,重要的是我们要熟悉这个工具引入的重要术语和概念。

术语

下面的列表包含Ansible使用的最相关术语的快速概述:

  • 控制节点 :安装了Ansible的机器,负责在您管理的服务器上运行资源调配。
  • 清单 :一个INI文件,其中包含您正在管理的服务器的相关信息。
  • 攻略 :一个YAML文件,包含一系列需要自动化的步骤。
  • 任务 :定义要执行的单个过程的块,例如:安装包。
  • 模块 :模块通常抽象系统任务,如处理包或创建和更改文件。Ansible有许多内置模块,但您也可以创建自定义模块。
  • 角色 :一组相关的剧本、模板和其他文件,以预定义的方式组织起来,便于重用和共享。
  • Play :自始至终执行的置备称为a_play_。
  • 事实 :全局变量,包含有关系统的信息,如网络接口或操作系统。
  • 处理程序 :用于触发服务状态的改变,如重启或重载服务。

任务格式

任务定义了一个应该由Ansible执行的自动化步骤。它通常涉及模块的使用或原始命令的执行。以下是任务的外观:

1- name: This is a task
2  apt: name=vim state=latest

name‘部分实际上是可选的,但建议使用,因为它会在任务执行时显示在配置的输出中。apt部分是一个内置的Ansible模块,它抽象了基于Debian的发行版上的包管理。这个示例任务告诉Anable,vim包的状态应该更改为Latest`,这会导致包管理器在该包尚未安装的情况下安装该包。

攻略格式

剧本是包含一系列指令的YAML文件,用于自动配置服务器。下面是一个简单的剧本,执行两个任务:更新apt缓存,然后安装vim

1---
2- hosts: all
3  become: true
4  tasks:
5     - name: Update apt-cache 
6       apt: update_cache=yes
7
8     - name: Install Vim
9       apt: name=vim state=latest

YAML依靠缩进来序列化数据结构。因此,在编写攻略时,尤其是在复制示例时,您需要格外小心地保持正确的缩进。

在本指南结束之前,我们将看到一个更真实的剧本示例,详细说明。下一节将概述可用于编写Anable攻略的最重要的元素和功能。

编写攻略

既然您已经熟悉了Ansible中的基本术语和剧本和任务的总体格式,我们将学习一些剧本功能,这些功能可以帮助我们创建更多功能的自动化。

使用变量

您可以通过不同的方式在Ansible中定义变量。最简单的方法是使用剧本的vars``部分。下面的示例定义了一个变量Package`,稍后将在任务内部使用该变量:

1---
2- hosts: all
3  become: true
4  vars:
5     package: vim
6  tasks:
7     - name: Install Package
8       apt: name={{ package }} state=latest

Package变量具有全局作用域,这意味着可以从配置的任何点访问它,甚至可以从包含的文件和模板访问它。

使用循环

循环通常用于使用不同的输入值重复任务。例如,不需要创建10个任务来安装10个不同的包,您可以创建单个任务,并使用循环对要安装的所有不同包重复该任务。

要在任务中创建循环,请在值数组中包含选项with_items。可以通过循环变量item访问内容,如下图所示:

1- name: Install Packages
2  apt: name={{ item }} state=latest
3  with_items:
4     - vim
5     - git
6     - curl

您还可以使用数组变量 来定义您的项:

1---
2- hosts: all
3  become: true
4  vars:
5     packages: [ 'vim', 'git', 'curl' ]
6  tasks:
7     - name: Install Package
8       apt: name={{ item }} state=latest
9       with_items: "{{ packages }}"

使用条件句

条件可以用于动态地决定是否应该执行任务,例如,基于变量或命令的输出。

下面的例子只会关闭基于Debian的系统:

1- name: Shutdown Debian Based Systems
2  command: /sbin/shutdown -t now
3  when: ansible_os_family == "Debian"

条件When接收要计算的表达式作为参数。只有当表达式的计算结果为true时,才会执行该任务。在我们的示例中,我们测试了一个事实 ,以检查操作系统是否来自Debian系列。

IT自动化中条件条件的一个常见用例是,任务的执行依赖于命令的输出。使用Ansible,我们实现这一点的方法是注册一个变量来保存命令执行的结果,然后在后续任务中测试该变量。我们可以测试命令的退出状态(如果失败或成功)。我们还可以检查输出中的特定内容,尽管这可能需要使用正则表达式和字符串解析命令。

下一个示例显示了基于php-v命令输出的两个条件任务。我们将测试该命令的退出状态,因为我们知道如果此服务器上没有安装PHP,该命令将无法执行。为了确保即使在命令执行失败的情况下也能继续进行配置,任务的`Ignore_errors‘部分非常重要。

 1- name: Check if PHP is installed
 2  register: php_installed
 3  command: php -v
 4  ignore_errors: true
 5
 6- name: This task is only executed if PHP is installed
 7  debug: var=php_install
 8  when: php_installed|success
 9
10- name: This task is only executed if PHP is NOT installed
11  debug: msg='PHP is NOT installed'
12  when: php_installed|failed

这里使用的debug模块是一个用于显示变量内容或调试消息的有用模块。它可以打印字符串(使用msg参数时),也可以打印变量的内容(使用var参数时)。

使用模板

模板通常用于设置配置文件,允许使用变量和其他旨在使这些文件更具通用性和可重用性的功能。Ansible使用JJIA2模板引擎。

下面的示例是一个用于设置Apache虚拟主机的模板,它使用一个变量来设置该主机的文档根目录:

1<VirtualHost *:80>
2    ServerAdmin webmaster@localhost
3    DocumentRoot {{ doc_root }}
4
5    <Directory {{ doc_root }}>
6        AllowOverride All
7        Require all granted
8    </Directory>
9</VirtualHost>

内置模块template用于应用来自任务的模板。如果您将模板文件命名为vhost.tpl以上,并将其放置在与剧本相同的目录中,则可以通过以下方式应用模板来替换默认的阿帕奇虚拟主机:

1- name: Change default Apache virtual host
2  template: 
3    src: vhost.tpl
4    dest: /etc/apache2/sites-available/000-default.conf

定义和触发处理程序

处理程序用于触发服务中的状态更改,例如a_Restart_或a_Stop_。尽管它们看起来可能与常规任务非常相似,但处理程序只有在先前从任务中的nufy指令触发时才会执行。它们通常被定义为攻略的‘handlers’部分中的一个数组,但它们也可以位于单独的文件中。

让我们考虑一下前面的模板使用示例,在该示例中,我们设置了一个Apache虚拟主机。如果您希望确保在虚拟主机更改后重新启动Apache,您首先需要为该Apache服务创建一个处理程序。以下是在剧本中定义处理程序的方式:

1handlers:
2    - name: restart apache
3      service: name=apache2 state=restarted
4
5    - name: other handler
6      service: name=other state=restarted

这里的name指令很重要,因为它将是该处理程序的唯一标识符。若要从任务触发该处理程序,请使用notfy选项:

1- name: Change default Apache virtual host
2  template: 
3    src: vhost.tpl
4    dest: /etc/apache2/sites-available/000-default.conf
5  notify: restart apache

我们已经看到了一些最重要的功能,您可以使用它们来开始编写Ansible攻略。在下一节中,我们将深入探讨一个更真实的剧本示例,它将自动在Ubuntu上安装和配置Apache。

示例攻略

现在让我们来看看一本剧本,它将自动在Ubuntu 18.04系统中安装一台ApacheWeb服务器,正如本指南的介绍中所讨论的那样。

完整的示例可以在Github.]上找到,其中包括用于设置apache的模板文件和由Web服务器提供的Html文件该文件夹还包含一个流浪者文件,允许您使用由流浪者.)管理的虚拟机在简化的设置中测试攻略

攻略内容

为方便您使用,此处提供了攻略的全部内容:

 1[label playbook.yml]
 2---
 3- hosts: all
 4  become: true
 5  vars:
 6    doc_root: /var/www/example
 7  tasks:
 8    - name: Update apt
 9      apt: update_cache=yes
10
11    - name: Install Apache
12      apt: name=apache2 state=latest
13
14    - name: Create custom document root
15      file: path={{ doc_root }} state=directory owner=www-data group=www-data
16
17    - name: Set up HTML file
18      copy: src=index.html dest={{ doc_root }}/index.html owner=www-data group=www-data mode=0644
19
20    - name: Set up Apache virtual host file
21      template: src=vhost.tpl dest=/etc/apache2/sites-available/000-default.conf
22      notify: restart apache
23  handlers:
24    - name: restart apache
25      service: name=apache2 state=restarted

让我们更详细地研究本攻略的每个部分:

主机:全部 攻略一开始就指出,它应该应用于您的清单中的所有主机(hosts:all)。可以将剧本的执行限制到特定的主机或一组主机。此选项可以在执行时被覆盖。

成为:真 make:true部分告诉Anable使用权限提升(Sudo)来执行本攻略中的所有任务。可以逐个任务地覆盖此选项。

vars 定义一个变量,doc_root,它将在以后的任务中使用。此部分可能包含多个变量。

任务 定义实际任务的部分。第一个任务更新apt缓存,第二个任务安装apache2包。

第三个任务使用内置模块 file 创建一个目录作为我们的文档根目录。此模块可用于管理文件和目录。

第四个任务使用复制 模块将本地文件复制到远程服务器。我们正在复制一个简单的HTML文件,该文件将作为我们由阿帕奇托管的网站。

处理程序 最后,我们有handlers‘部分,在这里声明服务。我们定义了从第四个任务通知的Restart apache`处理程序,在该任务中应用了Apache模板。

运行攻略

一旦您将该攻略的内容下载到您的Ansible控制节点,您就可以使用anable-playbook在您的库存中的一个或多个节点上执行它。以下命令将在您的默认清单文件中的所有 主机上执行剧本,并使用SSH密钥对身份验证以当前系统用户身份进行连接:

1ansible-playbook playbook.yml

您还可以使用-l将执行限制为清单中的单个主机或一组主机:

1ansible-playbook -l host_or_group playbook.yml

如果您需要指定不同的SSH用户来连接到远程服务器,您可以在该命令中包含参数-u user

1ansible-playbook -l host_or_group playbook.yml -u remote-user

有关如何运行Anable命令和攻略的更多信息,请参考我们的指南如何在Ubuntu 18.04.上安装和配置Anable

结论

Ansible是一个学习曲线较低的极简主义IT自动化工具,使用YAML作为其配置脚本。它有大量的内置模块,可用于抽象任务,如安装包和使用模板。其简化的基础设施要求和简单的语言非常适合那些刚开始使用配置管理的人。然而,它可能缺少一些高级功能,而您可以使用更复杂的工具(如Pupet和Chef)找到这些功能。

在这篇series](https://andsky.com/tech/tutorials/configuration-management-101-writing-puppet-manifests),的下一篇文章中,我们将看到Puptet的实用概述,这是一个流行的、成熟的配置管理工具,它使用基于Ruby的富有表现力和强大的定制DSL来编写配置脚本。

Published At
Categories with 技术
comments powered by Disqus