适用于 Linux 初学者的 Ansible 教程
在绝大多数情况下,系统管理员必须管理不止一台服务器,因此他经常必须在所有服务器上执行重复性任务。在这些情况下,自动化是必须的。 Ansible是Red Hat旗下的一款开源软件;它是用Python编程语言编写的,它是一个供应和配置管理软件,可以在上述情况下帮助我们。在本教程中,我们将了解如何安装它及其使用背后的基本概念。
在本教程中您将学习:
如何在最常用的 Linux 发行版上安装 Ansible
如何配置 Ansible
Ansible 库存是什么
Ansible 模块是什么
如何从命令行运行模块
如何创建和运行剧本
使用的软件要求和约定
安装 Ansible
Ansible 软件包包含在最常用的 Linux 发行版的官方存储库中,因此可以使用其本机软件包管理器轻松安装。要在 Debian 上安装它,我们可以运行:
$ sudo apt-get update && apt-get install ansible
要在 Fedora 上安装 Ansible,请执行以下操作:
$ sudo dnf install ansible
Ansible 位于 Archlinux“社区”存储库中;我们可以使用 pacman 安装它:
$ sudo pacman -Sy ansible
如果我们想在 CentOS8 上安装 Ansible,我们必须将 epel-release 软件源添加到我们的系统中,因为该软件包在默认存储库中不可用。为此,我们运行以下命令:
$ sudo dnf install https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
之后,我们可以简单地运行:
$ sudo dnf install ansible
对于其他特定于发行版的安装说明,我们可以查阅专用页面 Ansible 官方文档。
介绍 Ansible
Ansible 的基本特点是它是一个无代理配置系统。这意味着我们不需要在我们想要控制的服务器上安装任何代理或软件守护程序。我们需要的只是在所谓的控制机上安装和配置 Ansible。在绝大多数情况下,我们配置的任务将通过简单的ssh连接执行。
Ansible 配置文件
可以通过在一个或多个配置文件中指定参数及其值来配置 Ansible。该应用程序按优先级顺序查找以下文件:
通过 ANSIBLE_CONFIG 变量指定的文件
当前工作目录中的
ansible.cfg
文件用户主目录中的 .ansible.cfg 文件
/etc/ansible/ansible.cfg
文件
/etc/ansible/ansible.cfg
是最后一个,因此它被用作后备和默认值。出于明显的原因,这不是描述可以在配置文件中指定的所有可能参数的适当位置,但是,这里是文件内容的摘录:
[defaults]
# some basic default values...
#inventory = /etc/ansible/hosts
#library = /usr/share/my_modules/
#module_utils = /usr/share/my_module_utils/
#remote_tmp = ~/.ansible/tmp
#local_tmp = ~/.ansible/tmp
#plugin_filters_cfg = /etc/ansible/plugin_filters.yml
#forks = 5
#poll_interval = 15
#sudo_user = root
#ask_sudo_pass = True
#ask_pass = True
#transport = smart
#remote_port = 22
#module_lang = C
#module_set_locale = False
示例中的参数是用默认值定义的注释参数。其中,您可以看到inventory
参数,其值为/etc/ansible/hosts
。我们将在下一节中看到这是什么。
“hosts”或“inventory”文件
ansible“hosts”文件是我们基本上设置我们想要用 Ansible 控制的机器的 IP 地址或主机名的地方(这是 Ansible 术语中的“库存”)。在标准安装中,该文件位于 /etc/ansible
目录中。在清单文件中,主机可以分组或取消分组。我们可以自己指定一个主机,例如:
server1
然而,当我们想要在多个主机上执行操作时,将主机放入组中非常有用,例如使用它们的“角色”作为标准创建组。假设我们正在处理的主机都用作网络服务器,我们可以这样写:
[webservers]
server1
server2
Ansible 模块
Ansible 模块基本上是用于执行我们需要的任务的小程序;它们中的每一个都被设计为执行单个基本操作,以确保粒度。它们可以从命令行或在剧本中执行。所有模块的完整列表可以在官方文档的专用页面上找到。同样,这里我们无法检查所有模块,但这里有一些示例。
apt、dnf 和 yum 模块用于通过文件管理器管理软件包(以其名称命名) 从。 seboolean 模块用于管理 SELinux 布尔值的状态,user 模块用于管理用户帐户等。
从命令行使用模块
正如我们在上一节中所说,可以从命令行或剧本中使用模块。我们将在下一节中重点讨论后者;在这里,我们将演示如何通过 ansible
命令从命令行使用模块。在此示例中,我们将使用 ping 模块。该模块与 ping 命令无关,但它用于检查我们是否可以登录远程服务器,以及远程服务器上是否安装了 Python 解释器。成功时模块返回“pong”值:
$ ansible webservers -m ping --ask-pass
我们调用了 ansible 命令,指定要在“webservers”组的主机成员上运行任务,并使用 -m
选项传递我们要使用的模块的名称。我们还使用了 --ask-pass
选项,为什么?虽然我之前将远程服务器指纹添加到控制机 ssh“已知主机”文件中,但我没有通过公钥配置 ssh 访问,因此当我们运行任务时应该提供 ssh 密码。 --ask-pass
选项使得以交互方式询问密码。这是命令的输出 多于:
SSH password:
server2 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
server1 | SUCCESS => {
"ansible_facts": {
"discovered_interpreter_python": "/usr/bin/python"
},
"changed": false,
"ping": "pong"
}
Ansible 剧本
什么是剧本? Ansible playbook 正是 YAML 文件,我们在其中指定要使用 Ansible 执行的任务以及应在其上执行的主机。让我们看一个剧本示例。在以下文件中,我们设置一个任务以确保 Vim 文本编辑器已安装且为最新可用版本:
---
- name: Update webservers
hosts: webservers
remote_user: egdoc
become: yes
tasks:
- name: Ensure Vim is installed and at the latest version
dnf:
name: vim
state: latest
...
我们来分析一下上面的内容。我们可以看到,分别位于文件开头和结尾的 ---
和 ...
是标准 YAML 语法的一部分:它们是 可选并标记文件的开头和结尾。指令及其值以字典格式表示为键:值
对。
一个剧本可以包含多个所谓的剧本;在本例中我们只定义了一个。事实上,我们做的第一件事就是指定它的名称
,在本例中是“Update webservers”。我们使用的第二个键是hosts
:用它我们可以定义应该执行任务的主机组。在本例中,我们指定 webservers
作为值,它包含我们在前面的示例中定义的机器(server1 和 server2)。
我们使用的下一个键是remote_user
。有了它,我们可以指定我们应该通过 ssh 在远程服务器中登录的用户。之后,我们使用了become
键。这个键接受一个布尔值,我们用它来指定是否 是否应使用权限升级来执行任务。在本例中,由于我们使用“egdoc”用户登录远程计算机,并且需要 root 权限来安装软件包,因此我们将其设置为“yes”。重要的是要注意 该权限升级是在 /etc/ansible/ansible.cfg
配置文件的专用部分中配置的。在这种情况下,默认值如下:
[privilege_escalation]
#become=True
#become_method=sudo
#become_user=root
#become_ask_pass=False
定义播放信息后,我们开始指定任务列表。为此,我们使用了 tasks
关键字。每个任务都有一个用于文档和任务处理程序的名称
。
在 dnf:
中,我们指定要使用“dnf”模块,正如我们之前看到的,该模块用于使用 Red Hat 系列发行版中的默认包管理器来管理包。在本节中,使用 name
关键字 我们指定了包名称。在此示例中,我们仅对单个包感兴趣,但可以使用列表指定多个包。例如:
dnf:
name: [vim, nano]
通过 dnf
模块的 state
关键字,我们基本上指定了我们想要对指定包执行的操作。在本例中,我们使用 latest
作为值:通过它,我们确保软件包已安装,并且在远程计算机上使用的发行版上为最新可用版本。我们可以使用的其他可能值是 remove
或 absent
,这会导致软件包被卸载,或者 present
只会确保软件包已安装。我建议您查看官方模块文档,以获取可与该模块一起使用的键和值的完整列表。
在这里,我们刚刚定义了我们的第一个剧本。我们怎样才能运行它?
运行剧本
为了运行 playbook,我们使用专用的 ansible-playbook 命令。该命令接受一系列选项,并采用一个或多个剧本文件作为参数。例如,要运行我们在上一节中定义的剧本,我们将运行以下命令:
$ ansible-playbook --ask-pass ---ask-become-pass /path/to/playbook.yml
您可以注意到,在本例中,我们使用 --ask-become-pass
选项调用该命令。需要此选项是因为在 playbook 文件中,我们将 yes
值分配给 become
键,因为我们需要权限升级才能在远程计算机上安装软件包。 --ask-become-pass
选项使得我们在运行 playbook 时会询问 sudo
密码。在本例中,由于我们还使用了 --ask-pass
,因此 SSH 密码将用作权限升级的默认密码。这是运行剧本时收到的输出:
SSH password:
BECOME password[defaults to SSH password]:
PLAY [Update webservers] *******************************************************************************************************************************************
TASK [Gathering Facts] *********************************************************************************************************************************************
ok: [server1]
ok: [server2]
TASK [Ensure Vim is installed at the latest version] ***************************************************************************************************************
changed: [server1]
changed: [server2]
PLAY RECAP *********************************************************************************************************************************************************
server1 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server2 : ok=2 changed=1 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
首先我们被要求提供“SSH”密码,然后是“BECOME”密码。正如我们已经说过的,在这种情况下,SSH 密码将用作默认值。正如您所看到的,在我们在剧本中指定的任务之前,执行了另一个任务:“收集事实”。默认情况下会执行此任务,以便收集有关可在 playbook 中使用的远程主机的有用变量。
任务执行后,我们会得到我们指定的游戏的回顾。在本例中,我们可以看到,两个任务已正确执行 (ok=2
),一个任务已导致更改 (changed=1
)。这是有道理的:自从安装了 vim 包以来就发生了变化。
现在,如果我们尝试再次执行剧本,我们可以看到没有发生任何变化,因为 vim 已经安装并且是最新的可用版本:
PLAY RECAP *********************************************************************************************************************************************************
server1 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
server2 : ok=2 changed=0 unreachable=0 failed=0 skipped=0 rescued=0 ignored=0
结论
在本教程中,我们了解了 Ansible 是什么以及它的特点是什么。我们了解了如何在一些最常用的 Linux 发行版上安装它、如何配置它以及一些基本概念:什么是清单以及什么是 Ansible 模块。我们还了解了如何从命令行运行模块以及如何编写和运行剧本。这只是为了介绍 Ansible 世界;让您亲自动手,进行实验并阅读官方文档以获得更深入的知识!